C#使用DirectorySearcher查询Users/Domain Users组无用户返回解决方案咨询
问题根因
这是AD的原生设计,不是查询逻辑的bug:Domain Users、内置Users这类组属于用户的主要组(Primary Group),默认用户的memberOf属性不会存储主要组的归属关系,因此仅通过memberOf属性(包括递归查询的扩展语法)无法匹配到将该组设为主要组的用户。
普通域用户的primaryGroupID默认值为513,正好对应Domain Users组的SID末尾RID值,这类归属关系只会通过primaryGroupID属性标记,不会出现在memberOf列表中。
修复方案
调整查询过滤器,同时兼容两种组归属场景:
- 普通组的嵌套归属(保留原有递归
memberOf查询逻辑) - 主要组归属(新增
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
相关产品推荐
相关产品推荐

