Google云端硬盘API / SDK,使用服务帐户更改所有者失败

时间:2014-01-09 16:29:22

标签: c# android google-drive-api

我尝试以编程方式使用google drive api v2更新google驱动器中某些文件的所有者权限。(例如Google管理控制台执行"驱动器/转让所有权"表单) 我创建了一个服务帐户,并使用其ID和超级管理员帐户来创建凭据和" DriveService"宾语。 我能够列出与我共享的所有文件,并列举"所有者"收集"文件"。向文件添加新权限(role =" writer")可以正常工作。如果我尝试将新权限更改为role =" owner"我收到了内部错误500。

之前有没有人看过这个错误,我该如何解决?

这是我的代码:

// ---------------------- BUILD CREDENTIALS -------------------------------
Google.Apis.Auth.OAuth2.ServiceAccountCredential m_Creds = new ServiceAccountCredential(
                new ServiceAccountCredential.Initializer(<MY_SERVICE_ACCOUNT>)
                    {
                        Scopes = new[]
                                     {
                                         DriveService.Scope.Drive,
                                         DriveService.Scope.DriveFile,
                                         DriveService.Scope.DriveAppdata
                                     }
                        ,
                        User = <MY_ADMIN_ACCOUNT>
                    }.FromCertificate(certificate));

// ---------------------- BUILD CLIENTINIT -------------------------------
var myCInit = new BaseClientService.Initializer
            {
                ApplicationName = "Testapplication",
                HttpClientInitializer = m_Creds
            };

string myAccountname = "Test User1"; // accountname to look for
string myNewAccountEmail = "Test.User2@mydomain.com"; // email of new owner account

// ---------------------- DRIVE SERVIVE CREATION -------------------------------
var myDService = new DriveService(myCInit);

// ----------------------- GET THE FILE LIST------------------------------------ 
var myFList = myDService.Files.List().Execute();

         foreach (Google.Apis.Drive.v2.Data.File currF in myFList.Items)
            {

             foreach (Google.Apis.Drive.v2.Data.User currUser in currF.Owners)
                {
                    if (currUser.DisplayName.StartsWith(myAccountname))
                    {
                        // create new permission for new owner
                        Permission p = new Permission();
                        p.Role = "writer";
                        p.Type = "user";
                        p.Value = myNewAccountEmail;
                        myDService.Permissions.Insert(p, currF.Id).Execute(); // works fine, creates new permission

                        // get permission id 
                        var myNewID = myDService.Permissions.GetIdForEmail(myNewAccountEmail).Execute();

                        // get my newly created permission
                        p = myDService.Permissions.Get(currF.Id, myNewID.Id).Execute();
                        p.Role = "owner";

                        // create update request                            
                        var myUpdR = myDService.Permissions.Update(p, currF.Id,myNewID.Id);
                        myUpdR.TransferOwnership = true; // yes, we want to be an owner

                        myUpdR.Execute();  // this call gets an "internal error 500"
                    }
                }
            }

感谢任何帮助。

THX。 TL

2 个答案:

答案 0 :(得分:0)

您只能在域内更改所有者。

答案 1 :(得分:0)

问题是您首先必须在将所有权更改为其他用户的域中。这是出于安全方面的原因。

另一个是更改文件,它必须指向目标(文件夹ID),并且我发现工作的最佳方式是目标用户共享文件夹到源用户。然后它可以使用文件的更改权限进行处理。

我按照这个顺序做到了这一点:

  1. 使用admin-user上传文件并将其指向目标用户共享的folderId。

  2. InsertPermission(fileId,user.email,“user”,“owner”)

  3. RemoveOwnPermission,发送admin-user电子邮件并将其删除。