Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Google Drive API/SDK所有权转移_C#_.net_Oauth 2.0_Google Drive Api_Google Oauth - Fatal编程技术网

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是该文件的所有者。您使用该服务帐户创建了该文件?