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

LDAP DirectorySearcher仅返回单个memberOf组问题求助

解决AD用户memberOf属性仅返回单个组的问题

问题根源

memberOf是Active Directory里的多值属性,你的代码通过GetProperty取值时,大概率只取了该属性的第一个条目,所以只返回一个组。

修复步骤

1. 调整ADUser模型的MemberOf类型

把MemberOf从单个字符串改成集合类型,比如List<string>:

public class ADUser
{
    // 其他属性保持不变
    public List<string> MemberOf { get; set; } = new List<string>();
}

2. 修改多值属性的取值逻辑

两种方案任选其一:

方案一:重构GetProperty支持多值

把通用的GetProperty改成能识别多值属性的版本:

private static object GetProperty(SearchResult searchResult, string propertyName)
{
    if (searchResult.Properties.Contains(propertyName))
    {
        var propValues = searchResult.Properties[propertyName];
        if (propValues.Count == 1)
        {
            return propValues[0].ToString();
        }
        else if (propValues.Count > 1)
        {
            return propValues.Cast<string>().ToList();
        }
    }
    return null;
}

然后赋值时做类型转换:

UserModel.MemberOf = GetProperty(sResultSet, "memberOf") as List<string> ?? new List<string>();

方案二:单独处理memberOf属性

如果不想改动通用方法,直接在遍历结果时处理:

// 替换原来的UserModel.MemberOf赋值代码
if (sResultSet.Properties.Contains("memberOf"))
{
    foreach (var group in sResultSet.Properties["memberOf"])
    {
        UserModel.MemberOf.Add(group.ToString());
    }
}

3. 修正propertiesToLoad的数组长度(小问题)

你声明的是string[7]但里面有8个属性,建议改成自动推断长度避免报错:

string[] propertiesToLoad = new[] { "name","displayName", "telephoneNumber","description","title","department","manager","memberOf"};

核心修改后的代码片段

foreach (SearchResult sResultSet in searcher.FindAll())
{
    var UserModel = new ADUser();
    UserModel.FullName = GetProperty(sResultSet, "name")?.ToString();
    UserModel.DisplayName = GetProperty(sResultSet, "displayName")?.ToString();
    UserModel.TelePhoneNumber = GetProperty(sResultSet, "telephoneNumber")?.ToString();
    UserModel.Description = GetProperty(sResultSet, "description")?.ToString();
    UserModel.JobTitle = GetProperty(sResultSet, "title")?.ToString();
    UserModel.Department = GetProperty(sResultSet, "department")?.ToString();
    
    // 处理memberOf多值属性
    if (sResultSet.Properties.Contains("memberOf"))
    {
        foreach (var group in sResultSet.Properties["memberOf"])
        {
            UserModel.MemberOf.Add(group.ToString());
        }
    }
    
    lstADUsers.Add(UserModel);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 00:54:12