2014-01-09 2 views
2

Google 드라이브의 일부 파일에 대한 소유자 권한을 프로그래밍 방식으로 google drive api v2를 사용하여 업데이트하려고합니다. (Google 관리 콘솔에서 '드라이브/이전 소유권'양식에 있음) 서비스 계정을 생성하고 ID를 사용하여 수퍼 관리자 계정과 결합하여 자격 증명 및 "DriveService"개체를 생성했습니다. 나와 공유 된 모든 파일을 나열하고 "File"의 "Owners"컬렉션을 열거 할 수 있습니다. 파일 (role = "writer")에 새 권한을 추가하면 정상적으로 작동합니다. 새로운 권한을 role = "owner"로 변경하려고하면 내부 오류 500이 발생합니다.Google 드라이브 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 Admin Console에는이를 수행하기위한 버튼이 있습니다. 사용자 상호 작용없이 해당 기능을 자동화하려고합니다. – R2D2

+0

파일을 공유 할 때 파일 ID는 동일하며 다른 단어와 중복되지 않습니다. 파일의 "자체 사용 권한"을 제거하면 해당 파일의 사용 권한을 잃는 사용자로부터 파일이 제거됩니다 (3 단계). 그런 다음 대상 관리 Google 드라이브에만 저장됩니다. 사용자가 Google 드라이브를 제거하면 안전합니다. 사용자 삭제가 Google 드라이브 계정 인 경우 사용자가 소유자이고 관리자가 아닌 경우 파일이 삭제됩니다. 네가 일부 물건을 자동화해야한다는 소리가 들린다. –

관련 문제