2014-01-09 30 views
2

我嘗試使用谷歌驅動API更新谷歌驅動的一些文件的所有者許可v2的編程方式。(如谷歌管理控制檯做的「驅動器/轉讓所有權」的形式) 我創建了一個服務帳戶,並使用其ID與超級管理員帳戶結合創建憑證和「DriveService」對象。 我能夠列出與我共享的所有文件並枚舉「文件」的「所有者」集合。向文件添加新權限(role =「writer」)可以正常工作。如果我嘗試新的權限更改爲角色=「所有者」我得到一個內部錯誤500谷歌雲端硬盤API/SDK,使用服務帳戶更改所有權人未

沒有任何人看到這樣的錯誤之前和我怎麼能解決?

這是我的代碼:

// ---------------------- 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 = "[email protected]"; // 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

回答

0

只能內部域更改所有者。

+0

在我的測試用戶都在同一個域中。這些文檔是共享的,管理員用戶可以看到並更改它。 「所有權變更」僅以「內部錯誤」結束。 – R2D2

0

的問題是,你首先必須是在這種情況正在改變的所有權轉讓給其他用戶的一個相同的域。這是由於安全方面的原因。

另一個是更改文件,它必須指向一個目的地(文件夾ID),而且我發現最好的方式是使目標用戶共享一個文件夾給源用戶。然後它可以處理文件的更改權限。

我做到了,在這個序列中,以使這成爲可能:使用

  1. 上傳文件管理用戶和其指向folderId該目標用戶已共享。

  2. InsertPermission(FILEID,user.email, 「用戶」, 「業主」)

  3. RemoveOwnPermission,由管理員用戶電子郵件發送和刪除的文件。

+0

在我的情況下,可能會重複該文件。所有文件都由用戶上傳並與管理員共享。在用戶生命週期結束時,管理員應該將所有權更改爲自己以保留共享文件。否則,Google驅動器的用戶將被刪除。在Google管理控制檯中有一個按鈕。我嘗試在沒有用戶交互的情況下自動執行該功能。 – R2D2

+0

共享文件時,它是相同的文件ID,換句話說不重複。 當移除該文件的「自己的許可」,該文件是從用戶丟失文件(步驟3)的允許移除。之後,它只會存儲在目標管理Google雲端硬盤中。這意味着如果用戶的Google雲端硬盤已被移除,那麼安全性就很高 如果用戶是所有者,則該文件將被刪除,而當用戶刪除它的Google Drive帳戶時,該文件將被刪除。聽起來你必須自動化一些東西是的。 –

相關問題