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

使用Microsoft Graph API获取组增量数据时,无法获取组成员的displayName和mail字段的问题

Microsoft Graph API获取组增量数据时,无法获取组成员的displayName和mail字段的问题

嗨,我之前也碰到过这个坑!这其实是Graph API组增量查询的特性导致的——当你用groups/delta端点尝试$expand=members时,members@delta字段只会返回成员的ID,不会带上你指定的displayName和mail。因为增量查询的核心是跟踪组成员的添加/移除变化,而不是返回成员的完整属性信息。

那该怎么拿到成员的详细属性呢?这里有两种实用的解决方案:

方案一:批量获取成员详细信息(推荐)

拿到增量响应里的成员ID后,用Graph API的批量请求($batch)一次性获取多个用户的displayName和mail,既能减少请求次数,也能提升效率。

修改后的代码示例

public async Task MeetingsDetails()
{
    var clientSecretCredential = new ClientSecretCredential(TenantId, ClientId, ClientSecret);
    string[] scopes = new string[] { "https://graph.microsoft.com/.default" };
    AccessToken tokenResult = await clientSecretCredential.GetTokenAsync(new TokenRequestContext(scopes));
    var accessToken = tokenResult.Token;
    var client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

    // 1. 获取组的增量数据
    string deltaUrl = $"https://graph.microsoft.com/v1.0/groups/delta?$filter=id eq '{groupId}'";
    var deltaResponse = await client.GetAsync(deltaUrl);
    
    if (deltaResponse.IsSuccessStatusCode)
    {
        var deltaJson = await deltaResponse.Content.ReadAsStringAsync();
        var deltaData = JObject.Parse(deltaJson);
        
        // 提取members@delta里的成员ID列表
        var memberIds = deltaData["value"]?[0]?["members@delta"]?
            .Select(j => j["id"]?.ToString())
            .Where(id => !string.IsNullOrEmpty(id))
            .ToList();
        
        if (memberIds?.Any() == true)
        {
            // 2. 构造批量请求获取用户详细信息
            var batchRequests = new JObject
            {
                ["requests"] = new JArray(
                    memberIds.Select(id => new JObject
                    {
                        ["id"] = memberIds.IndexOf(id).ToString(),
                        ["method"] = "GET",
                        ["url"] = $"/users/{id}?$select=id,displayName,mail"
                    })
                )
            };
            
            var batchContent = new StringContent(batchRequests.ToString(), Encoding.UTF8, "application/json");
            var batchResponse = await client.PostAsync("https://graph.microsoft.com/v1.0/$batch", batchContent);
            
            if (batchResponse.IsSuccessStatusCode)
            {
                var batchJson = await batchResponse.Content.ReadAsStringAsync();
                Console.WriteLine("成员详细信息:");
                Console.WriteLine(batchJson);
            }
            else
            {
                Console.WriteLine($"批量请求错误: {batchResponse.StatusCode}, {await batchResponse.Content.ReadAsStringAsync()}");
            }
        }
        else
        {
            Console.WriteLine("该组没有成员变化或无成员");
        }
    }
    else
    {
        Console.WriteLine($"增量请求错误: {deltaResponse.StatusCode}, {await deltaResponse.Content.ReadAsStringAsync()}");
    }
}

方案二:单独查询每个成员(适合小体量场景)

如果组的成员数量不多,也可以直接遍历成员ID,逐个调用/users/{id}?$select=id,displayName,mail来获取属性,代码更简单,但请求次数会多一些。

关键代码片段

// 提取成员ID后遍历查询
foreach (var id in memberIds)
{
    var userUrl = $"https://graph.microsoft.com/v1.0/users/{id}?$select=id,displayName,mail";
    var userResponse = await client.GetAsync(userUrl);
    if (userResponse.IsSuccessStatusCode)
    {
        var userJson = await userResponse.Content.ReadAsStringAsync();
        Console.WriteLine(userJson);
    }
}

注意事项

  • 确保你的应用已被授予**User.Read.All或Group.Read.All**的应用权限(需要读取用户个人信息),且权限已得到管理员同意。
  • 批量请求一次最多支持20个请求,如果成员数量超过20,记得拆分多个批量请求。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 10:33:01