如何编写匹配组名而非完整路径的LDAP用户查询过滤器?
解决思路:通过固定组名查找AD中的组成员用户
问题分析
你之前的过滤器写法存在错误:memberOf属性只能匹配组的完整区别名(DN),无法直接在其中嵌套组的搜索条件(比如(objectcategory=group)(name=MYADGROUPNAME)),这就是过滤器失效的核心原因。
方案一:两步查询(兼容所有LDAP客户端)
如果你的LDAP工具不支持扩展匹配规则,可以分两步操作:
- 先定位目标组的DN:
使用过滤器(&(objectCategory=group)(name=MYADGROUPNAME))执行搜索,获取该组的distinguishedName属性值(示例:CN=MYADGROUPNAME,OU=Groups,DC=domain,DC=com)。 - 查询组内用户:
用第一步得到的组DN,构造过滤器:
这样就能精准获取属于该组的所有用户。(&(objectClass=person)(memberOf=CN=MYADGROUPNAME,OU=Groups,DC=domain,DC=com))
方案二:使用AD链式匹配规则(一步到位,推荐)
AD支持特殊的链式匹配规则(LDAP_MATCHING_RULE_IN_CHAIN),可以直接通过组名查找所有成员,无需提前知道组的位置,甚至能递归匹配嵌套组的成员。
构造过滤器如下:
(&(objectClass=person)(memberOf:1.2.840.113556.1.4.1941:=(&(objectCategory=group)(name=MYADGROUPNAME))))
- 规则OID
1.2.840.113556.1.4.1941是AD内置的链式匹配标识,作用是递归查找所有直接/间接属于目标组的对象。 - 如果你的环境中组名是唯一的,也可以简化为:
(&(objectClass=person)(memberOf:1.2.840.113556.1.4.1941:=CN=MYADGROUPNAME,*))
注意事项
- 链式匹配规则仅适用于Active Directory,其他LDAP服务器(比如OpenLDAP)可能不支持。
- 确保目标组名在AD中是唯一的,否则会匹配到所有同名组的成员。
内容的提问来源于stack exchange,提问作者Jim Andrakakis
相关产品推荐
相关产品推荐

