C# Google Drive API/SDK所有权转移
我正在尝试将特定文件的所有权转移给其他用户。C# Google Drive API/SDK所有权转移,c#,.net,oauth-2.0,google-drive-api,google-oauth,C#,.net,Oauth 2.0,Google Drive Api,Google Oauth,我正在尝试将特定文件的所有权转移给其他用户。 总代码 foreach (Permission permission in RetrievePermissions(service(), file.Id)) { if (permission.Role == EnumClass.PERMISSIONROLE.OWNER.ToText()) { //Downgrade Owner Writer
总代码
foreach (Permission permission in RetrievePermissions(service(), file.Id))
{
if (permission.Role == EnumClass.PERMISSIONROLE.OWNER.ToText())
{
//Downgrade Owner Writer
UpdatePermission(service(), file.Id, permission.Id, EnumClass.PERMISSIONROLE.WRITER);
//Create New Writer
InsertPermission(service(), file.Id, ownerMail, EnumClass.PERMISSIONROLE.WRITER);
foreach (Permission thisPermission in RetrievePermissions(service(), file.Id))
{ //Update Writer to Owner
if (thisPermission.Name == "Person X")
{
//Set Person X as new Owner
UpdatePermission(service(), file.Id, thisPermission.Id, EnumClass.PERMISSIONROLE.OWNER);
}
}
}
}
更新权限方法
public static Permission UpdatePermission(DriveService service, String fileId, String permissionId, EnumClass.PERMISSIONROLE ROLE)
{
try
{
// First retrieve the permission from the API.
Permission permission = service.Permissions.Get(fileId, permissionId).Execute();
permission.Role = ROLE.ToText();
//if new Role is Owner, Downgrad current Owner
if (ROLE == EnumClass.PERMISSIONROLE.OWNER)
{
var myPermission = service.Permissions.Update(permission, fileId, permissionId);
myPermission.TransferOwnership = true;
foreach (Permission per in RetrievePermissions(service, fileId))
{
if (per.Role == EnumClass.PERMISSIONROLE.OWNER.ToText())
{
per.Role = EnumClass.PERMISSIONROLE.WRITER.ToText();
}
}
}
return service.Permissions.Update(permission, fileId, permissionId).Execute();
}
catch (Exception e)
{
Console.WriteLine("An error occurred: " + e.Message);
}
return null;
public static Permission InsertPermission(DriveService service, String fileId, String userMail, EnumClass.PERMISSIONROLE Role)
{
Permission newPermission = new Permission();
newPermission.Name = userMail;
newPermission.Value = userMail;
newPermission.Type = EnumClass.PERMISSIONTYPE.USER.ToText();
newPermission.Role = Role.ToText();
try
{
return service.Permissions.Insert(newPermission, fileId).Execute();
}
catch (Exception InsertError)
{
Console.WriteLine("Error inserting permission for " + userMail + Environment.NewLine + "Error on Insert: " + InsertError.Message);
}
return null;
}
插入权限方法
public static Permission UpdatePermission(DriveService service, String fileId, String permissionId, EnumClass.PERMISSIONROLE ROLE)
{
try
{
// First retrieve the permission from the API.
Permission permission = service.Permissions.Get(fileId, permissionId).Execute();
permission.Role = ROLE.ToText();
//if new Role is Owner, Downgrad current Owner
if (ROLE == EnumClass.PERMISSIONROLE.OWNER)
{
var myPermission = service.Permissions.Update(permission, fileId, permissionId);
myPermission.TransferOwnership = true;
foreach (Permission per in RetrievePermissions(service, fileId))
{
if (per.Role == EnumClass.PERMISSIONROLE.OWNER.ToText())
{
per.Role = EnumClass.PERMISSIONROLE.WRITER.ToText();
}
}
}
return service.Permissions.Update(permission, fileId, permissionId).Execute();
}
catch (Exception e)
{
Console.WriteLine("An error occurred: " + e.Message);
}
return null;
public static Permission InsertPermission(DriveService service, String fileId, String userMail, EnumClass.PERMISSIONROLE Role)
{
Permission newPermission = new Permission();
newPermission.Name = userMail;
newPermission.Value = userMail;
newPermission.Type = EnumClass.PERMISSIONTYPE.USER.ToText();
newPermission.Role = Role.ToText();
try
{
return service.Permissions.Insert(newPermission, fileId).Execute();
}
catch (Exception InsertError)
{
Console.WriteLine("Error inserting permission for " + userMail + Environment.NewLine + "Error on Insert: " + InsertError.Message);
}
return null;
}
错误
Google.API.Requests.RequestError对此权限不足
文件[403]错误[消息[此文件的权限不足]
位置[-]原因[禁止]域[全局]]
我正在使用ServiceAccount。感谢大家的帮助 您是否尝试使用模拟
var initializer = new ServiceAccountCredential.Initializer(ServiceAccountEmail)
{
Scopes = new[] { DriveService.Scope.Drive },
User = "user@yourdomain.com"
};
转让所有权的最佳方式是
使用(var credentialJSON=newfilestream(_settings.CertificatePath,FileMode.Open,FileAccess.Read))
{
var认证参数=
NewtonsoftJsonSerializer.Instance.Deserialize(credentialJSON);
凭证=新的ServiceAccountCredential(
新ServiceAccountCredential.Initializer(credentialParameters.ClientEmail)
{
范围=范围,
User=ownerEmailAddress,//输入实际的用户电子邮件地址
}.来自PrivateKey(credentialParameters.PrivateKey));
}
服务帐户无权访问相关文件。是,但如何解决?请尝试向服务帐户授予该文件的电子邮件地址权限。(不,我没有尝试)serviceAccount是该文件的所有者。您使用该服务帐户创建了该文件?