登录并在O365 Enterprise订阅中作为全局管理员进行身份验证,我可以使用Microsoft Graph查询所有用户。我还可以使用User.Id
查询个人用户。
但是当我尝试为任何用户查询OneDrive文件(DriveItem
)时,我得到一个空响应和资源未找到错误。使用UserPrincipalName
代替Id
时出现相同的错误。
样品申请:
/v1.0/users/427d0a15-69db-4ab1-b7ae-542776ef53ed/drive/items
全局管理员查询租户中所有用户的驱动器/驱动器项目的呼叫模式是什么?
我已经为应用程序提供了管理员同意以获得这些权限:
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
类通过代码请求权限,如果这很重要的话。
更新: 我得到了相同的#34;未找到资源"我打电话时出错:
/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
的调用正常工作,但是对于其他用户的后续迭代,会抛出异常并显示错误消息:
{"代码:itemNotFound \ r \ nMessage:无法找到资源。\ r \ n \ r \ n内部错误\ r \ n"}
答案 0 :(得分:0)
您无法直接致电[/drive/items][1]
。您需要提供DriveItem.Id
(即/drive/items/{id}
)或路径(即/drive/root/children
)。
请改为尝试:
/v1.0/users/427d0a15-69db-4ab1-b7ae-542776ef53ed/drive/root/children
答案 1 :(得分:0)
经过几天的反复试验后,我找到了问题的解决方法,我将发布该问题作为帮助人们遇到类似问题的答案。如果提供了更好的解决方案,我会接受这个答案,所以狩猎仍然在......
事实证明,Global O365管理员默认情况下无权查看租户中的OneDrive Business文件夹和其他用户的文件。
我必须做的是:
这样做之后:
/v1.0/users/427d0a15-69db-4ab1-b7ae-542776ef53ed/drive/root/children
正确返回该用户驱动项目的所有子项!
我说我会接受更好的答案,所以要更好地定义:
答案显示如何通过代码
或者至少说明如何通过减少点击次数来完成此操作的答案。想象一下,如果租户有100K用户,全局管理员必须逐个点击100K用户的Access Files按钮! (没有可用的批量设置选项)这不是一个很好的体验,也不是一个实用的解决方案。
最佳答案是:1 + 2:)
更新: 我找到了一个更好的解决方法,即如果我在App Mod中设置权限,而不是委派权限/用户Mod。然后,该应用程序可以访问One Drive中的所有用户的驱动器/文件,并且全局管理员无需为此自行提供权限。企业管理员只需要在企业租户的生命周期中仅对应用程序进行一次同意。有了这个更新,我会接受这个答案。