You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Azure AD应用凭据调用Graph API无法获取全部SharePoint站点求助

我之前也碰到过一模一样的情况,核心问题大多出在权限配置细节或者API分页处理上,结合你的场景,给你几个排查和解决的方向:

1. 确认应用权限的类型与管理员同意状态

虽然你说已经配置了站点相关权限,但一定要区分应用权限和委托权限:

  • 你用应用凭据(客户端凭据流)调用API,必须确保Azure AD应用中添加的是应用权限类型的Sites.Read.All(不是委托权限的同名权限)
  • 应用权限必须由全局管理员或SharePoint管理员手动授予同意——哪怕你添加了权限,没点"授予管理员同意"按钮的话,应用实际是没有权限访问所有站点的
  • 检查路径:Azure AD应用注册 → API权限页面,确认Sites.Read.All权限的状态是"已授予[你的租户名]的管理员同意"

2. 处理Graph API的分页逻辑

这是最容易被忽略的坑:Graph API默认分页返回结果(默认每页20条),而Graph Explorer会自动帮你加载所有分页内容,所以看起来返回了全部站点,但你的应用如果只调用了一次https://graph.microsoft.com/v1.0/sites?search=*,只能拿到第一页的少量数据。
解决方法:

  • 每次调用接口后,检查返回结果里的@odata.nextLink字段
  • 如果该字段存在,继续调用这个链接获取下一页数据,直到@odata.nextLink不存在为止
  • 简单的伪代码示例:
import requests

token = "你的Bearer令牌"
headers = {"Authorization": f"Bearer {token}"}
url = "https://graph.microsoft.com/v1.0/sites?search=*"
all_sites = []

while url:
    response = requests.get(url, headers=headers)
    response.raise_for_status()
    data = response.json()
    all_sites.extend(data.get("value", []))
    url = data.get("@odata.nextLink")

print(f"总共获取到 {len(all_sites)} 个站点")

3. 调整API请求参数试试

search=*在应用权限下的搜索范围可能和委托权限有差异,可以尝试以下参数组合:

  • 直接调用https://graph.microsoft.com/v1.0/sites(不带search参数),默认会返回租户下所有根站点和子站点
  • 用$filter筛选站点,比如https://graph.microsoft.com/v1.0/sites?$filter=siteCollection/root ne null(只返回网站集的根站点)
  • 增加$top参数扩大单页返回量,比如https://graph.microsoft.com/v1.0/sites?search=*&$top=999(单页最多返回999条)

4. 检查应用的访问范围限制

如果你的Azure AD应用被配置了条件访问策略或者应用权限范围限制,也可能导致只能访问部分站点:

  • 检查Azure AD的条件访问策略,确认没有针对该应用设置站点访问限制
  • 检查SharePoint管理中心的应用权限管理,确认该应用没有被限制只能访问特定站点

内容的提问来源于stack exchange,提问作者Suraj Shelke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:07:13