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

使用Microsoft Graph获取不在用户信息列表中的SharePoint用户详情

解决方案

当遇到用户ID不在站点用户信息列表中的情况,核心原因通常是这些用户为外部协作用户、跨站点用户,或是用户信息列表未及时同步。此时直接通过Microsoft Graph API查询Azure Active Directory(AAD)中的用户信息是更可靠的方案——因为用户ID本质是AAD中的对象ID,AAD才是用户信息的权威来源。

方法1:通过Graph SDK直接查询AAD用户信息

既然你已经在使用graphClient,可以直接调用用户端点获取用户名称,无需手动处理HTTP请求和字符串解析:

private string GetUserFieldValue(IDictionary<string, object> fields, string lookupId)
{
    if (!fields.ContainsKey(lookupId))
        return string.Empty;

    string userId = (string)fields[lookupId];

    if (string.IsNullOrEmpty(userId))
        return string.Empty;

    if (UserNames.ContainsKey(userId))
        return UserNames[userId];

    try
    {
        // 处理外部用户的特殊ID格式,比如:i:0#.f|membership|user@domain.com
        if (userId.Contains("|"))
        {
            userId = userId.Split('|').Last();
            // 如果拆分后是邮箱格式,直接通过邮箱查询
            if (userId.Contains("@"))
            {
                var user = graphClient.Users[userId].GetAsync().Result;
                var displayName = user.DisplayName ?? "Unknown User";
                UserNames.Add(userId, displayName);
                return displayName;
            }
        }

        // 通过AAD对象ID查询用户
        var user = graphClient.Users[userId].GetAsync().Result;
        var displayName = user.DisplayName ?? "Unknown User";
        UserNames.Add(userId, displayName);
        return displayName;
    }
    catch (Exception ex)
    {
        // 处理用户已删除、权限不足等异常情况
        UserNames.Add(userId, "Unknown User");
        return "Unknown User";
    }
}

方法2:兼容多种目录对象类型的查询

如果用户ID可能对应安全组等非用户对象,可使用directoryObjects端点自动解析对象类型:

private string GetUserFieldValue(IDictionary<string, object> fields, string lookupId)
{
    if (!fields.ContainsKey(lookupId))
        return string.Empty;

    string objectId = (string)fields[lookupId];

    if (string.IsNullOrEmpty(objectId))
        return string.Empty;

    if (UserNames.ContainsKey(objectId))
        return UserNames[objectId];

    try
    {
        var directoryObject = graphClient.DirectoryObjects[objectId].GetAsync(requestConfig =>
        {
            requestConfig.QueryParameters.Select = new string[] { "displayName", "@odata.type" };
        }).Result;

        if (directoryObject.OdataType == "#microsoft.graph.user")
        {
            var user = directoryObject as Microsoft.Graph.Models.User;
            var name = user?.DisplayName ?? "Unknown User";
            UserNames.Add(objectId, name);
            return name;
        }
        // 支持查询组名称(如果字段可能关联组)
        else if (directoryObject.OdataType == "#microsoft.graph.group")
        {
            var group = directoryObject as Microsoft.Graph.Models.Group;
            var name = group?.DisplayName ?? "Unknown Group";
            UserNames.Add(objectId, name);
            return name;
        }
        else
        {
            UserNames.Add(objectId, "Unknown Object");
            return "Unknown Object";
        }
    }
    catch (Exception ex)
    {
        UserNames.Add(objectId, "Unknown");
        return "Unknown";
    }
}

额外优化建议

  • 替换Task.Run().Result的阻塞调用,将方法改为异步并使用await,提升程序性能和稳定性。
  • 不要手动解析JSON响应,依赖Graph SDK返回的强类型对象,避免因响应格式变更导致的解析错误。
  • 用户信息缓存可加入过期逻辑,避免保留已删除或更名用户的旧数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 02:24:55