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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:24:50