无需指定用户ID或用户主体名称,通过Microsoft Graph查询OneDrive所有用户文件夹及全域搜索文件的方法咨询
无需指定用户ID或用户主体名称,通过Microsoft Graph查询OneDrive所有用户文件夹及全域搜索文件的方法咨询
你遇到的这个问题我之前也帮别人梳理过——用/search/query接口默认只能搜到SharePoint站点的内容,没法覆盖个人OneDrive的文件,这就是你能找到Test File 1、2却搜不到Test File 3的核心原因。别着急,咱们来一步步解决:
为什么默认搜不到个人OneDrive?
默认情况下,Microsoft Graph的search/query接口在搜索driveItem类型时,仅包含SharePoint站点的文档库内容,个人OneDrive的文件不在默认搜索范围内,所以你的请求只能命中站点共享文件夹里的文件。
解决方案:调整搜索请求参数,纳入个人OneDrive内容
你只需要在search/query的请求payload里添加contentSources参数,明确指定要包含OneDriveBusiness这个来源,就能覆盖所有用户的个人OneDrive了。修改后的请求体如下:
{ "requests": [ { "entityTypes": [ "driveItem" ], "query": { "queryString": "${(event.payload.request.email)!}" }, "region": "US", "contentSources": [ "SharePoint", "OneDriveBusiness" ] } ] }
几个关键注意事项
- 权限要求:调用接口的应用必须拥有
Files.Read.All(应用权限,而非委托权限),这样才能访问所有用户的OneDrive内容;如果用委托权限,只能访问当前登录用户的OneDrive,没法实现“广撒网”的需求。 - 搜索效果验证:添加
contentSources后再测试,就能同时搜到SharePoint站点和所有用户个人OneDrive里的匹配文件,包括你的Test File 3。 - 性能优化建议:如果公司用户量较大,全域搜索可能会变慢,你可以考虑添加筛选条件(比如限定文件类型、创建时间范围)来缩小搜索范围,提升查询效率。
另外还有个备选思路:先通过/users接口获取所有用户列表,再遍历每个用户调用/users/{userPrincipalName}/drive/root/search接口,但这种方法效率低,还容易触发API调用限制,所以更推荐第一种修改search/query参数的方案。
备注:内容来源于stack exchange,提问作者RobR2015




