无法使用 Microsoft Graph 以全局管理员身份查询用户的 OneDrive For Business 文件

Cannot Query Users' OneDrive For Business Files As The Global Administrator using Microsoft Graph

在 O365 Enterprise 订阅中以全局管理员身份登录并通过身份验证,我可以使用 Microsoft Graph 查询所有用户。我还可以使用 User.Id.

查询单个用户

但是,当我尝试为任何用户查询 OneDrive 文件 (DriveItem) 时,我收到空响应和资源未找到错误。当我使用 UserPrincipalName 而不是 Id.

时出现同样的错误

样品请求:

/v1.0/users/427d0a15-69db-4ab1-b7ae-542776ef53ed/drive/items

全局管理员查询租户中所有用户的 drives/drive 项的调用模式是什么?

我已就这些权限向应用程序提供了管理员许可:

public static string[] Scopes = {
    "Files.ReadWrite.All",
    "Sites.Read.All",
    "Sites.ReadWrite.All",
    "Sites.FullControl.All",
    "User.ReadWrite.All",
    "Directory.ReadWrite.All",
    "Directory.AccessAsUser.All"
};

我正在使用委派权限并在运行时通过使用 PublicClientApplication class 的代码请求权限。

更新: 我在调用时遇到相同的 "Resource Not Found" 错误:

/v1.0/users/427d0a15-69db-4ab1-b7ae-542776ef53ed/drive/root/children

源代码:

IGraphServiceUsersCollectionPage usersCollection =
   await graphClient.Users.Request().GetAsync();

foreach (User user in usersCollection)
{
   IDriveItemChildrenCollectionPage childrenCollection =
    await graphClient.Users[user.Id].Drive.Root.Children.Request().GetAsync();
}

当 Foreach 循环第一次迭代时,第一个用户是登录的全局管理员,并且对 Drive.Root.Children 的调用工作正常,但在其他用户的后续迭代中,抛出异常并显示错误消息:

{"Code: itemNotFound\r\nMessage: The resource could not be found.\r\n\r\nInner error\r\n"}

您不能直接调用 [/drive/items][1]。您需要提供 DriveItem.Id(即 /drive/items/{id})或路径(即 /drive/root/children)。

试试这个:

/v1.0/users/427d0a15-69db-4ab1-b7ae-542776ef53ed/drive/root/children

经过几天的反复试验,我找到了解决该问题的方法,我将 post 作为帮助遇到类似问题的人的答案。如果提供更好的解决方案,我会接受这个答案,所以搜索仍在进行中..

事实证明,全局 O365 管理员默认情况下无权查看租户中其他用户的 OneDrive Business 文件夹和文件。

我要做的是:

  1. 以全局管理员身份登录到 O365 门户
  2. 转到管理中心 > 用户
  3. 对于每个用户,展开 OneDrive 设置并单击 "Access files" 这会授予管理该用户的 OneDrive 的权限。

完成后:

/v1.0/users/427d0a15-69db-4ab1-b7ae-542776ef53ed/drive/root/children

returns 正确地所有 children 用户驱动项目!

我说我会接受更好的答案,所以定义更好:

  1. 显示如何通过代码执行此操作的答案

  2. 或者至少说明如何以更少的点击次数执行此操作的答案。想象一下,如果租户有 10 万个用户,全局管理员必须为 10 万个用户逐一单击访问文件按钮! (没有可用的批量设置选项)这不是很好的体验,也不是实用的解决方案。

最佳答案是:1 + 2 :)

更新: 我找到了一个更好的解决方法,即如果我在 App Mod 中设置权限,而不是在 Delegated permissions/User Mod 中设置权限。然后该应用程序可以访问 One Drive 中所有用户的 drives/files,并且全局管理员不需要为自己提供这样的权限。企业管理员只需要在企业租户的生命周期内同意该应用程序一次。通过此更新,我将接受此答案。