如何通过IGraphServiceClient获取特定组用户及其所属所有组?
这个问题我碰到过!原因是Graph API默认不会自动返回导航属性(比如memberOf),你得显式告诉它要加载这个关联数据才行。下面给你具体的解决方法:
首先纠正一个小细节:你代码里用的Groups[GroupName]其实不对——Graph API的Groups端点需要传入组的Object ID,而不是显示名称。如果只有组名的话,得先通过组名查询到对应的ID,再继续下一步。
接下来核心解决方案是在请求中使用Expand("memberOf")来加载用户的所属组信息,具体实现如下:
1. 基础版:获取单页用户及其所属组
// 先通过组名获取组ID(已有ID可跳过此步) var group = await _graphServiceClient.Groups .Request() .Filter($"displayName eq '{groupName}'") .Select("id") .GetAsync(); string groupId = group.FirstOrDefault()?.Id; if (!string.IsNullOrEmpty(groupId)) { // 获取组成员并展开memberOf属性 var membersPage = await _graphServiceClient .Groups[groupId] .Members .Request() .Expand("memberOf") // 关键:显式加载用户的所属组导航属性 .Filter("odata.type eq '#microsoft.graph.user'") // 仅筛选用户类型的成员 .GetAsync(); // 转换为User列表,此时每个User的memberOf属性已填充数据 List<User> usersWithGroups = membersPage.OfType<User>().ToList(); }
2. 进阶版:处理分页(成员数量较多时)
如果组内用户数量超过Graph API的单页返回上限,会分页返回结果,需要循环获取所有页面:
List<User> allUsersWithGroups = new List<User>(); var currentPage = await _graphServiceClient .Groups[groupId] .Members .Request() .Expand("memberOf") .Filter("odata.type eq '#microsoft.graph.user'") .GetAsync(); allUsersWithGroups.AddRange(currentPage.OfType<User>()); // 循环获取下一页,直到没有更多结果 while (currentPage.NextPageRequest != null) { currentPage = await currentPage.NextPageRequest.GetAsync(); allUsersWithGroups.AddRange(currentPage.OfType<User>()); }
3. 额外注意事项
- 权限配置:确保你的应用已配置以下权限(根据场景选择委派/应用权限):
GroupMember.Read.All:读取组成员的权限User.Read.All:读取用户及其所属组的权限
- 间接组需求:如果需要获取用户的间接所属组(比如嵌套组里的成员),只需把
Expand("memberOf")改成Expand("transitiveMemberOf")即可。
内容的提问来源于stack exchange,提问作者191180rk
相关产品推荐
相关产品推荐

