LDAP:使用过滤器来避免Active Directory中的子CN

时间:2010-02-19 09:11:54

标签: java active-directory ldap jndi

我正在尝试查询Active Directory中的几乎所有用户。 我的普通用户在各种OU中,我想要检索它们。但我的系统用户存储在用户CN中,我不想检索它们。

它看起来很像another question,但他们的答案对我没有帮助。我正在使用here提供的提示,但它也没有帮助。

我使用JNDI在Active Directory中查询。我的疑问是:

(&(objectClass=user)(!(cn:dn:=Users)))

这意味着类user的所有对象都不在Users子树中。然而,这个查询返回的内容如下:

CN=__vmware__,CN=Users,DC=SIREDRM,DC=com

那么,为什么那个过滤器不工作?我怎么能让它运作起来?

1 个答案:

答案 0 :(得分:7)

使用(!(distinguishedName = *,CN = Users = DC = mydomain,DC = com)),您正在尝试使用具有DN语法[Object(DS-DN)]的属性,对于这些LDAP属性,您不能在LDAP过滤器中使用通配符。

属性“distinguishedName”: http://msdn.microsoft.com/en-us/library/ms675516%28VS.85%29.aspx

LDAP语法“对象(DS-DN)” http://msdn.microsoft.com/en-us/library/ms684431%28VS.85%29.aspx

在第二个链接中,您将找到有关禁用通配符的声明。

通常,您可以使用LDAP可扩展匹配规则从子树搜索中排除某些容器,在您的情况下,语法将类似于此

(!(cn:dn:=Users))

或类似的东西。坏事:AD也不支持这种可扩展的匹配: http://msdn.microsoft.com/en-us/library/cc223241%28PROT.10%29.aspx 阅读第一段。

所以结论是:在活动目录环境中,您不能使用单个过滤器进行此操作。遗憾。

唯一的解决方案似乎是使用客户端工具。 Microsoft的脚本将向您展示如何确切地满足您的需求(除了您需要用户,而不是计算机)。

http://blogs.technet.com/heyscriptingguy/archive/2004/12/07/how-can-i-return-a-list-of-all-my-computers-except-those-in-a-specified-ou.aspx

您可以看到的另一件事是用作AD代理的虚拟目录,这样您就可以在不触及AD的情况下配置过滤器和权限。

(大部分是从hyphen site复制的)