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

C#使用DirectorySearcher查询Users/Domain Users组无用户返回解决方案咨询

问题根因

这是AD的原生设计,不是查询逻辑的bug:
Domain Users、内置Users这类组属于用户的主要组(Primary Group),默认用户的memberOf属性不会存储主要组的归属关系,因此仅通过memberOf属性(包括递归查询的扩展语法)无法匹配到将该组设为主要组的用户。
普通域用户的primaryGroupID默认值为513,正好对应Domain Users组的SID末尾RID值,这类归属关系只会通过primaryGroupID属性标记,不会出现在memberOf列表中。

修复方案

调整查询过滤器,同时兼容两种组归属场景:

  1. 普通组的嵌套归属(保留原有递归memberOf查询逻辑)
  2. 主要组归属(新增primaryGroupID匹配逻辑)
    同时补充你需求里的已启用用户过滤规则,排除禁用账号。

调整后的完整代码

using System.Security.Principal; // 需新增此命名空间用于处理SID

public IList<UserInfo> GetGroupUsers(string dn)
{
    var users = new List<UserInfo>();
    // 先查询目标组的RID,用于primaryGroupID匹配
    string groupRid;
    using (var groupDe = new DirectoryEntry($"LDAP://{dn}"))
    {
        var sid = new SecurityIdentifier((byte[])groupDe.Properties["objectSid"][0], 0);
        groupRid = sid.Value.Split('-').Last();
    }

    using (var de = new DirectoryEntry(RootDomainName))
    {
        using (var searcher = new DirectorySearcher(de))
        {
            // 过滤器新增primaryGroupID匹配逻辑,同时补充已启用用户过滤
            string filter = $"(&(|(memberof:1.2.840.113556.1.4.1941:={dn})(primaryGroupID={groupRid}))(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))";
            searcher.Filter = filter;

            searcher.PropertiesToLoad.Add(DISTINGUISHEDNAME_PROP);
            searcher.PropertiesToLoad.Add(SAMACCOUNTNAME_PROP);
            searcher.PropertiesToLoad.Add(MAIL_PROP);
            searcher.PropertiesToLoad.Add(DISPLAYNAME_PROP);
            searcher.PropertiesToLoad.Add(OBJECTGUID_PROP);

            SearchResultCollection AllResults = searcher.FindAll();
            foreach (SearchResult sr in AllResults)
            {
                var userInfo = new UserInfo()
                {
                    DisplayName = sr.GetProperty(DISPLAYNAME_PROP),
                    DistinguishedName = sr.GetProperty(DISTINGUISHEDNAME_PROP),
                    Account = sr.GetProperty(SAMACCOUNTNAME_PROP),
                    Mail = sr.GetProperty(MAIL_PROP),
                    Guid = new Guid((byte[]) sr.Properties[OBJECTGUID_PROP][0]),
                    Path = sr.Path
                };
                users.Add(userInfo);
            }
        }
    }

    return users;
}
逻辑说明
  • 该方案完全兼容原有自定义组、嵌套组的查询逻辑,不会影响原有正常功能
  • 无需硬编码内置组的RID,自动适配所有可能被设为用户主要组的场景
  • 新增的!(userAccountControl:1.2.840.113556.1.4.803:=2)是AD标准的已启用用户过滤规则,符合你的业务需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:24:04