如何创建一个LDAP查询,只返回所有级别具有OU = Groups的组?

时间:2012-04-05 19:48:01

标签: ldap ldap-query

如果我正在寻找所有Groups,我会得到太多垃圾。

如果我试图缩小基数范围,我就会变得太少。

以下是一个例子:

CN=A Team,OU=Groups,OU=Americas,DC=example,DC=com
CN=B TEAM,OU=Groups,OU=EMEA,DC=example,DC=com
CN=C Team,OU=Legacy Groups,DC=example,DC=com
CN=D Team,OU=Groups,OU=Bangalore,OU=APAC,DC=example,DC=com
CN=E Team,OU=Common Groups,DC=example,DC=com

我正在寻找一个返回A B D E(没有C)的LDAP filter - 主要是逻辑会让我拥有最后OU=GroupsOU=Common Groups

的所有群组

我目前的搜索正在使用:

 Search base: CN=Users,DC=citrite,DC=net
 Filter: (objectCategory=Group)

1 个答案:

答案 0 :(得分:5)

首先,在单个搜索中无法在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 groupsou=groups及其下属会被退回,但不会 ou=legacy groups和下属。

此示例使用ldapsearch命令行工具的现代语法。如果是用户 利用传统的OpenLDAP版本的ldapsearch,命令行工具的参数是 有点不同,但这没关系。重要的是过滤器。