我有一个从Active Directory中的OU中提取用户信息的应用程序。它所采用的参数是搜索的基础和过滤字符串。
我有一个OU我想从中提取信息,但是我想避免使用子OU:
来自OU=People,DC=mydomain,DC=com
的用户
来自OU=Evil,OU=People,DC=mydomain,DC=com
的用户
我知道这可以通过重写执行导入以停止搜索子OU的应用程序来完成,但有没有办法在搜索上使用LDAP过滤器?像(DistinguishedName !contains "Evil"
)或类似的东西,我会根据用户的路径排除用户,而不是过滤用户的属性。
答案 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标准的专业质量目录服务器将支持这两种方法。