如何使用Graph API获取完整网站集管理员列表(包含用户和组)
解决方法
问题根因
你之前调用的https://graph.microsoft.com/beta/sites/{Site-id}接口本身仅返回站点所有者字段的单个用户,不会返回完整的网站集管理员列表,因此无法获取到多个用户和管理员组信息。同时isAdmin eq true的筛选条件仅能命中单独标记为网站集管理员的独立用户,无法覆盖加入所有者组的用户和组主体。
方案1:通过Microsoft Graph API获取
- 调用站点权限接口:
GET https://graph.microsoft.com/v1.0/sites/{site-id}/permissions - 筛选返回结果中
roles字段包含owner的条目,即为全部网站集管理员主体,包含用户、安全组、Microsoft 365组等多种类型 - 若需要展开组内的用户详情,对类型为
group的主体额外调用GET https://graph.microsoft.com/v1.0/groups/{group-id}/members?$select=id,displayName,mail即可获取组内用户的完整信息
方案2:通过PnP JS获取(适配SPFX场景)
你可以直接通过PnP JS的内置接口拉取,无需自行封装Graph请求,参考代码如下:
import { spfi, SPFx } from "@pnp/sp"; import "@pnp/sp/webs"; import "@pnp/sp/site-groups"; import "@pnp/sp/users"; // 初始化PnP SP实例 const sp = spfi().using(SPFx(this.context)); // 1. 获取站点关联的所有者组(即网站集管理员组) const ownerGroup = await sp.web.associatedOwnerGroup(); // 2. 拉取组内所有成员,包含用户和嵌套的安全组 const adminList = await sp.web.siteGroups.getById(ownerGroup.Id).users(); // 3. 可选:递归展开嵌套组内的用户 async function expandNestedGroups(memberList) { const result = []; for (const member of memberList) { if (member.PrincipalType === 4) { // PrincipalType=4代表是安全组 const groupMembers = await sp.web.siteGroups.getById(member.Id).users(); result.push(...await expandNestedGroups(groupMembers)); } else { result.push(member); } } return result; } // 展开后的完整管理员用户列表 const fullAdminList = await expandNestedGroups(adminList);
补充说明
你需要同时合并两部分内容避免遗漏:
- 所有者组内的所有用户、组主体
- 通过
isAdmin eq true筛选出的单独配置的网站集管理员用户
接口调用需要当前登录用户拥有至少站点读取权限,否则无法正常拉取权限和用户组信息。
内容的提问来源于stack exchange,提问作者Rakesh Ranjan
相关产品推荐
相关产品推荐

