如何使用MSGraph .Net SDK /sites端点搜索参数获取租户全部SPO站点
实现方案(基于Microsoft Graph .NET SDK v5.x,当前主流稳定版)
前提条件
- 已在Azure应用注册中配置应用级权限
Sites.Read.All或Sites.ReadWrite.All,且已获取租户管理员同意 - 已通过Nuget安装依赖包:
Microsoft.Graph、Azure.Identity
完整代码示例
using Azure.Identity; using Microsoft.Graph; using Microsoft.Graph.Models; // 1. 初始化Graph客户端(示例为后台服务常用的客户端凭证流) var scopes = new[] { "https://graph.microsoft.com/.default" }; var tenantId = "替换为你的租户ID"; var clientId = "替换为你的应用注册客户端ID"; var clientSecret = "替换为你的应用注册客户端密钥"; var credential = new ClientSecretCredential(tenantId, clientId, clientSecret); var graphClient = new GraphServiceClient(credential, scopes); // 2. 构造带search=*参数的站点查询请求 var allSites = new List<Site>(); var requestInfo = graphClient.Sites.ToGetRequestInformation(config => { config.QueryParameters.Search = "*"; config.QueryParameters.Top = 200; // 单页最大返回条数,官方上限为200 }); // 适配search参数的URL模板规则 requestInfo.UrlTemplate += "?%24search={%24search}"; // 3. 自动分页拉取全量站点数据 var pageIterator = PageIterator<Site, SiteCollectionResponse>.CreatePageIterator( graphClient, await graphClient.RequestAdapter.SendAsync(requestInfo, SiteCollectionResponse.CreateFromDiscriminatorValue), site => { allSites.Add(site); return true; // 迭代所有页面,返回false可提前终止 } ); await pageIterator.IterateAsync(); // 4. 结果验证 Console.WriteLine($"共获取到{allSites.Count}个SPO站点"); foreach (var site in allSites) { Console.WriteLine($"站点名:{site.DisplayName},访问地址:{site.WebUrl}"); }
如果你使用的是v4版本旧SDK,可参考以下简化写法
var queryOptions = new List<QueryOption> { new QueryOption("search", "*"), new QueryOption("$top", "200") }; var sitesPage = await graphClient.Sites.Request(queryOptions).GetAsync(); var allSites = new List<Site>(); // 手动处理分页 while (sitesPage.Count > 0) { allSites.AddRange(sitesPage); if (sitesPage.NextPageRequest == null) break; sitesPage = await sitesPage.NextPageRequest.GetAsync(); }
注意事项
- 不要使用委派权限调用该接口,仅能获取当前登录用户有权限访问的站点,无法拉取全租户站点
- 默认查询不会返回用户个人OneDrive站点,如有需要需额外调整查询逻辑
- 站点量级过万的租户建议添加请求重试逻辑,避免触发接口限流
内容的提问来源于stack exchange,提问作者groveale
相关产品推荐
相关产品推荐

