在自定义搜索中使用LDAP查询的Active Directory查询

时间:2019-03-07 12:42:56

标签: active-directory ldap-query

我正在工作的域中的某些用户没有分配经理或职位名称,因此我尝试在definequery> customsearch> advanced标签中使用此LDAP查询创建一个新查询:

(&(objectCategory=user)(objectClass=user))(|(!manager=*)(!title=*)

即使我知道它们存在,它也会返回零结果。使用“自定义搜索”将创建相同的搜索字符串,并返回零结果。我根据其他地方的研究进行了尝试,该结果也返回零。

(&(objectCategory=person)(objectClass=user))(|(!manager=*)(!title=*)

我在做什么错了?

我也想只在特定的文件夹及其子文件夹中进行搜索,

(|(OU=Innsbruck)(OU=Totnes)(OU=Dueren))

这些位于域的正下方,并且每个位置都有自己的计算机,组和用户子文件夹。

2 个答案:

答案 0 :(得分:1)

您的查询是无效的。该窗口不会告诉您-它只会给出零结果。

您缺少右括号,需要将OR条件置于AND条件内。而且您还需要使用(objectCategory=person),而不是(objectCategory=user)。您实际上并不需要(objectCategory=person),因为(objectClass=user)足以将搜索限制在用户对象之内,但这并不有害。

它应该是这样的:

(&(objectCategory=person)(objectClass=user)(|(!manager=*)(!title=*)))

我通常会将查询粘贴到Notepad++中,突出显示匹配的括号,因此很容易找到丢失的括号。或者,您可以将其分解为多行,以使其更易于阅读和发现错误:

(&
    (objectCategory=person)
    (objectClass=user)
    (|
        (!manager=*)
        (!title=*)
    )
)

无论您如何搜索(通过“用户和计算机” UI或通过代码),一次只能搜索一个OU。没有OU属性或可在查询中使用的任何其他属性来限制特定的OU。

在用户界面中,您可以单击右上角的“浏览”以选择要搜索的OU。

如果您在代码中执行此操作,则可以做一些事情以将其限制为特定的OU:

  1. 分别搜索每个OU(如果需要,可以选择将“搜索范围”设置为不搜索子OU),或者
  2. 搜索整个域,然后查看每个结果的distinguishedName属性,并从不需要的OU中丢弃结果。

选项2可能会执行得更快,因为它减少了网络请求。

答案 1 :(得分:1)

在我看来,该过滤器不符合RFC 4515:搜索过滤器的LDAP字符串表示形式。 可能是AD,并且您使用的工具正在接受它,但是NOT过滤器应采用(!(manager=*))的形式。

(&(objectCategory=person)(objectClass=user)(|(!(manager=*))(!(title=*))))