首先,在 Microsoft Active Directory 上不可能在单个搜索中执行此操作,这是因为 AD 不完全兼容 LDAP。
符合 LDAP 的服务器支持extensible-match
提供必要过滤的过滤器。来自RFC4511:
如果 dnAttributes 字段设置为 TRUE,则匹配附加地应用于条目的可分辨名称中的所有 AttributeValueAssertions,并且如果可分辨名称中至少有一个属性或子类型过滤器项评估为 TRUE,则它评估为 TRUE . dnAttributes 字段的存在是为了减轻对通用匹配规则(例如单词匹配)的多个版本的需求,其中一个适用于条目,另一个适用于条目和 DN 属性。
请注意,可扩展匹配过滤器技术仅适用于符合 LDAP 的服务器,而 AD 不是其中之一。
例如,我将以下条目添加到服务器:
dn: ou=legacy groups,o=training
objectClass: top
objectClass: organizationalUnit
ou: legacy groups
dn: ou=common groups,o=training
objectClass: top
objectClass: organizationalUnit
ou: common groups
dn: ou=groups,o=training
objectClass: top
objectClass: organizationalUnit
ou: groups
dn: cn=a,ou=common groups,o=training
objectClass: top
objectClass: groupOfUniqueNames
uniqueMember: uid=user.0,ou=people,o=training
cn: a
dn: cn=b,ou=groups,o=training
objectClass: top
objectClass: groupOfUniqueNames
uniqueMember: uid=user.0,ou=people,o=training
cn: b
dn: cn=c,ou=legacy groups,o=training
objectClass: top
objectClass: groupOfUniqueNames
uniqueMember: uid=user.0,ou=people,o=training
cn: c
添加上述条目后,在以下搜索中检查过滤器:
ldapsearch --propertiesFilePath ds-setup/11389/ldap-connection.properties \
--baseDN o=training \
--searchScope sub '(|(ou:dn:=groups)(ou:dn:=common groups))' 1.1
dn: ou=common groups,o=training
dn: cn=a,ou=common groups,o=training
dn: ou=groups,o=training
dn: cn=b,ou=groups,o=training
请注意,ou=common groups
返回ou=groups
, 及其下属,但不返回
ou=legacy groups
和下属。
此示例使用 ldapsearch 命令行工具的现代语法。如果用户使用的是旧的 OpenLDAP 版本的 ldapsearch,命令行工具的参数会有些不同,但这并不重要。重要的是过滤器。