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

如何通过Microsoft Graph SDK单次获取所有组成员的Open Extensions属性

问题

在Azure Active Directory(Azure AD)中,我创建用户时会使用OpenTypeExtension为每个用户添加扩展数据,具体添加了acsid、defaultgroupid、useryominame这三个扩展属性,代码如下:

var openTypeExtension = new OpenTypeExtension();
openTypeExtension.ExtensionName = "com.mysite.user.extprofile";
openTypeExtension.AdditionalData = new Dictionary<string, object>();
openTypeExtension.AdditionalData.Add("acsid", "8:acs:0e9c3151-234r-4e5b-3245-37ffaa4d79ab_00000017-2erf-75bc-8876-c93a0d00abcd");
openTypeExtension.AdditionalData.Add("defaultgroupid", "347e12e4-9cf1-437b-f4r5-6dcc7452234d");
openTypeExtension.AdditionalData.Add("useryominame", "myyominame");

var extensionresult = await _graphClient.Users[user.Id].Extensions["com.mysite.user.extprofile"].Request().GetAsync();

用户创建完成后,扩展属性已成功添加到Azure AD的用户对象中。但当我使用Microsoft Graph SDK获取组内所有成员时,返回的用户列表不包含这些扩展属性,获取组成员的代码如下:

GraphServiceClient graphClient = await GetGraphClient()
    .ConfigureAwait(false);

var groupMembers = await graphClient.Groups[id].Members
    .Request()
    .GetAsync()
    .ConfigureAwait(false);

var usersInGroup = groupMembers.OfType<User>().ToList();

目前我只能通过遍历每个用户,调用接口获取其扩展属性(使用Parallel.ForEach优化响应时间),代码如下:

Parallel.ForEach(usersInGroup, user =>
{
    var userWithExtensions = graphClient.Users[user.Id].Extensions["com.mysite.user.extprofile"].Request().GetAsync();
    user.AdditionalData = userWithExtensions?.Result.AdditionalData;
});

想咨询:Microsoft Graph SDK是否支持在获取组成员的同时直接获取这些Open Extensions属性?

回答

可以直接在获取组成员时一并拉取Open Extensions属性,无需逐个用户调用接口,核心是使用**$expand查询参数**指定要加载的扩展名称。

具体实现

  1. 在请求组成员时,通过Expand方法指定要扩展的目标OpenTypeExtension,格式为extensions('{extensionName}')
  2. 由于组成员可能包含非用户类型(如设备、联系人),需过滤出User类型对象,扩展属性会被加载到User的Extensions集合中

修改后的代码示例

GraphServiceClient graphClient = await GetGraphClient().ConfigureAwait(false);

// 通过$expand拉取指定的扩展属性
var groupMembers = await graphClient.Groups[id].Members
    .Request()
    .Expand("extensions('com.mysite.user.extprofile')") // 关键:扩展指定的OpenTypeExtension
    .GetAsync()
    .ConfigureAwait(false);

var usersInGroup = groupMembers.OfType<User>().ToList();

// 从User对象的Extensions集合中提取扩展数据
foreach (var user in usersInGroup)
{
    var extProfile = user.Extensions.FirstOrDefault(e => e.Id == "com.mysite.user.extprofile") as OpenTypeExtension;
    if (extProfile != null)
    {
        user.AdditionalData = extProfile.AdditionalData;
    }
}

注意事项

  • 必须指定具体的扩展名称,不能仅写extensions(否则会返回所有扩展,性能不如精准指定)
  • 确保应用拥有User.Read.All或足够权限读取用户扩展属性
  • 若组成员数量较多,建议配合$top参数分页获取,避免单次请求数据量过大

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:50:13