Google drive api 传输文件所有权失败-即使是超级管理员(Google Drive API,Java)

Google drive api 传输文件所有权失败-即使是超级管理员(Google Drive API,Java),google-drive-api,Google Drive Api,我正在尝试将文件的所有权转移给超级管理员。代码的基本部分如下所示。如果我转让了我所拥有的文档的所有权,同样的代码也会起作用。但在这种情况下,原始所有者是同一域中的另一个用户。[编辑]我知道“管理”面板中有“文件所有权从1个用户转移到另一个用户”,但如果需要以编程方式转移来自多个所有者的多个文件/文件夹,则需要这样做。[/编辑] 因此,简单的情况是: user@domain.com拥有一个文件 所有权需要转让给admin@domain.com(超级管理员)。代码在Javaservlet的AppEn

我正在尝试将文件的所有权转移给超级管理员。代码的基本部分如下所示。如果我转让了我所拥有的文档的所有权,同样的代码也会起作用。但在这种情况下,原始所有者是同一域中的另一个用户。[编辑]我知道“管理”面板中有“文件所有权从1个用户转移到另一个用户”,但如果需要以编程方式转移来自多个所有者的多个文件/文件夹,则需要这样做。[/编辑]

因此,简单的情况是:

  • user@domain.com拥有一个文件
  • 所有权需要转让给admin@domain.com(超级管理员)。代码在Javaservlet的AppEngine中运行。超级管理员通过OAuth进行身份验证 然而,它总是在
    update.execute()行抛出(500 OK)异常(最后显示)。
    即使是超级管理员也无法执行此操作吗

    谢谢你的提示

    try {
       Drive service = getDriveService();
       Permission newPerm = new Permission();
       newPerm.setValue("admin@domain.com");
       newPerm.setType("user");
       newPerm.setRole("writer");
       newPerm = service.permissions().insert(fileId, newPerm).execute();
       newPerm.setRole("owner");
       Update update = service.permissions().update(fileId, newPerm.getId(), newPerm);
       update.setTransferOwnership(true);
       update.execute(); 
    } catch (IOException e) {
       e.printStackTrace();
       log.severe(e.getMessage());
    }
    
    引发的异常如下所示:

    SEVERE: 500 OK
    {
      "code" : 500,
      "errors" : [ {
        "domain" : "global",
        "message" : "Internal Error",
        "reason" : "internalError"
      } ],
      "message" : "Internal Error"
    }
    

    您将无法从应用程序脚本执行此操作。
    可以从appengine完成。我做了,但超出了这里的解释范围。包括代表文件所有者使用驱动器api,并在域级别添加oauth权限。

    我最终至少部分实现了这一点。感谢@ZigMandel的“模仿”提示!现在我仔细地遵循了这一点。并使用使用使用“服务帐户”键创建的
    GoogleCredential
    。使用此凭据,我可以模拟驱动器API操作,例如添加权限和将所有权转移给管理员


    仍然存在的问题是,使用当前的驱动器API,无法通过编程方式确定所有者电子邮件地址,这是创建模拟凭据所需的。现在我需要找到一个解决办法。不管怎样,基本的想法现在起作用了。谢谢

    有人(谷歌工程师)更改了你问题的标签,但恐怕这个标签不合适。。。不确定你会在这里得到最好的回报。我最初的标签是google app engine,这个google drive sdk现在正确吗?我仍然对此感到困惑。是关于现在拥有权限还是“工作流”不正确:添加“写入”权限,然后将其更改为“所有者”?如果这是不允许的,我会期望出现未经授权的错误,这并不能说明什么。我还可以看到com.google.api.services.drive.model.File中有setowner(列表),我也试过了,但也没用。我调用了service.update(fileId,file.execute();更改所有者列表后,但没有效果…让“getDriveService”接受一个参数,即当前所有者的电子邮件地址。然后在获取驱动器服务时调用“setServiceAccountUser”,从而模拟当前所有者。嗨,我最初将其标记为google app engine,有人将其更改为“脚本”,现在它似乎是google drive sdk,我想这是对的!?无论如何,我忘记了最初强调的是,这确实是在AppEngine中通过驱动Java SDK完成的(而不是在Google脚本中)。此外,超级管理员在这里通过OAuth进行身份验证。不幸的是,如果这个异常能够正常工作,它并没有揭示出这里出了什么问题。有人对如何解决这个问题有什么建议吗?谢谢请参阅有关用户模拟的驱动器api文档。这里有一些例子。谢谢Zig!今天,经过一番搜索,我终于来到了这里,我在AppEngine代码中创建了一个服务密钥并构建了GoogleCredential。但现在我甚至无法访问文件/权限数据。找不到具有正确文件ID的文件。抱歉,我对这些文件非常陌生,所以可能我在错误的示例中丢失了?您是否碰巧有一些指针指向执行类似操作的示例,即将所有权从用户移动到域管理员(以编程方式)。再次感谢你的建议!我让它工作起来了。我所要做的就是调用setServiceAccountUser(“当前所有者的电子邮件地址”)GoogleCredential credential=new GoogleCredential.Builder().setTransport(httpTransport).setJsonFactory(jsonFactory).setServiceAccountId(服务帐户\电子邮件).setServiceAccountScopes(Arrays.asList(DriveScopes.DRIVE)).setServiceAccountUser(“其他-user@domain.comsetServiceAccountPrivateKeyFromp12文件(新的java.io.File(服务\帐户\ PKCS12 \文件\路径)).build();