如何使用过滤器来避免Active Directory中的子OU?

时间:2009-07-08 23:45:44

标签: active-directory ldap

我有一个从Active Directory中的OU中提取用户信息的应用程序。它所采用的参数是搜索的基础和过滤字符串。

我有一个OU我想从中提取信息,但是我想避免使用子OU:

通缉

来自OU=People,DC=mydomain,DC=com的用户

未通缉

来自OU=Evil,OU=People,DC=mydomain,DC=com的用户

我知道这可以通过重写执行导入以停止搜索子OU的应用程序来完成,但有没有办法在搜索上使用LDAP过滤器?像(DistinguishedName !contains "Evil")或类似的东西,我会根据用户的路径排除用户,而不是过滤用户的属性。

5 个答案:

答案 0 :(得分:12)

如果您在.NET中使用System.DirectoryServices.Protocols),则可以将SearchScope设置为OneLevel,仅在People-OU中搜索(并且没有子项) -OUs)。但如果你有任何OU=Good,OU=People,DC=mydomain,DC=com ...

,这将无效

第二个选项是查询People-OU的所有子OU:s(objectClass=organizationalUnit),然后发出多个搜索请求;每个人一个(除了“邪恶的”)。

修改: @geoffc - 这将非常难以实施。默认情况下,所有经过身份验证的用户都可以读取Active Directory中的所有对象。只是在Evil OU上设置“拒绝读取”将不起作用,因为经过身份验证的用户的读取权限设置在单个用户对象上(在本例中),因此优先于OU上的拒绝ACL设置。您基本上必须在Evil-OU中的每个对象上设置拒绝读取ACL,并始终确保添加到目录的新对象获得相同的拒绝权限集。您可以编辑Active Directory架构并删除Authenticated Users的权限,但这会破坏许多其他内容(包括Exchange),并且不受Microsoft支持。

答案 1 :(得分:6)

AFAICT,无法使用Active Directory中的LDAP过滤器完成此操作。许多其他LDAP实现支持可扩展匹配,但AD不支持。

ou:dn:=Evil上推荐包含(distinguishedName)或通配符的过滤器的用户尚未针对Active Directory进行测试。

答案 2 :(得分:5)

以下将解决这个问题:

(&(objectClass=user)(!(distinguishedName:=%Evil%)))

我在构建扫描到电子邮件的地址簿时遇到了类似的问题。 我尝试了(&(objectClass=user)(!(distinguishedName:=*Evil*))),但似乎某些MFP不接受*作为通配符,但他们接受%

答案 3 :(得分:2)

根据http://www.zytrax.com/books/ldap/apa/component.html,您可以使用LDAP组件过滤器获得所需内容。这是一个与您描述的内容相符的示例:

(&(objectClass=organizationalUnit)(!(ou:dn:=Evil)))

这匹配具有organizationUnit的objectClass的所有对象,但拒绝任何DN包含与ou = Evil匹配的组件的任何对象。

答案 4 :(得分:1)

objectClasses organizationalUnit及其后代inetOrgPerson允许属性ou出现在条目中。将值ou的{​​{1}}属性添加到从属evil分支的对象,并将断言ou=evil包含在搜索过滤器中,以将候选列表的响应限制为不包含值为(!(ou=evil))的属性ou。或者,LDAP Assertion Control可以以相同的方式用于请求,以确保不处理包含值evil的{​​{1}}的请求。符合LDAP标准的专业质量目录服务器将支持这两种方法。