如何构造DirectorySearcher筛选器查询指定AD组内匹配登录名的用户
如何构造适用于DirectorySearcher的筛选器,校验指定组中是否存在匹配给定登录名的用户?
最初仅按登录名检索的筛选器可正常运行,但会搜索整个Active Directory范围:
$"(sAMAccountName = {login})";
尝试新增组范围限定的筛选器时,调用FindOne()方法始终返回null,测试用的筛选器如下:
$"(& (objectClass = user) (sAMAccountName = {login}) (memberOf = [{groupDistinguishedName}]))"
传入的groupDistinguishedName参数格式为"CN = GroupName, CN = ..., DC = ..., DC = ..."。
解决方案
错误原因
该筛选器查询不到结果通常是三个格式问题导致的:
- LDAP语法错误:筛选器里的逻辑与符号直接写
&即可,不需要使用HTML转义的& - 属性值包裹错误:
memberOf匹配可分辨名称时不需要额外加方括号[],直接传入完整DN字符串即可 - DN格式错误:传入的组可分辨名称中等号前后加了多余空格,标准AD可分辨名称的等号前后无空格,必须和AD内存储的组属性完全一致,正确格式示例:
CN=GroupName,OU=Groups,DC=domain,DC=com
正确筛选器写法
匹配组内直接成员(不含嵌套组用户)
// 替换groupDistinguishedName为无多余空格的标准组DN即可 $"(&(objectCategory=person)(objectClass=user)(sAMAccountName={login})(memberOf={groupDistinguishedName}))"
这里组合使用objectCategory=person和objectClass=user,是为了过滤掉同样属于user类的计算机账号,避免误匹配。
匹配组内所有成员(含嵌套组用户)
如果需要递归查询嵌套在子组里的用户,可以使用LDAP内置的链式匹配规则OID,写法如下:
// OID 1.2.840.113556.1.4.1941 对应LDAP_MATCHING_RULE_IN_CHAIN规则,支持递归遍历组成员 $"(&(objectCategory=person)(objectClass=user)(sAMAccountName={login})(memberOf:1.2.840.113556.1.4.1941:={groupDistinguishedName}))"
如果目标组成员规模不大,也可以先读取目标组的member属性,手动递归解析所有嵌套组成员后再匹配登录名,排查问题时更直观。
内容的提问来源于stack exchange,提问作者blane
相关产品推荐
相关产品推荐

