在LDAP搜索过滤器/查询中使用通配符

33

我对AD和LDAP查询的知识非常有限,所以我有一个简单的问题,关于如何使用通配符。

假设有一个displayName为"ITSM - Problem Management"的对象

我的当前实现筛选器与通配符如下:

(displayName=SEARCHKEYWORD*)

如果用户输入关键词“问题”,他将无法找到该对象,因为它需要名称的第一部分,即“ITSM -”

我想在两端实现通配符,如下所示:

(displayName=*SEARCHKEYWORD*)
理想情况下,这将允许输入“问题”并搜索“ITSM-问题管理”。但是,在您将通配符放在开头时,它似乎无法工作。当我尝试时,它似乎只是挂起而没有返回任何结果。
对此有什么想法或思路吗?任何意见都将不胜感激。谢谢!

1
您应该通知目录管理员您打算使用子字符串过滤器,以确保目录服务器得到适当的配置。另请参阅LDAP:编程实践 - Terry Gardner
只是出于好奇,"ITSM" 代表什么?我知道一个特定的 ITSM,但我怀疑它和你们的不一样... - ErikE
@ErikE 抱歉回复晚了,ITSM = IT服务管理。它是指IT运营的治理政策和流程 :) - AnimaSola
4个回答

39

使用以*结尾的筛选条件可以通过索引查找进行快速评估。而前导星号则意味着需要在索引中执行顺序搜索,因此时间复杂度为 O(N)。这将耗费大量时间。

我建议您重新考虑此要求。


看起来你是对的,使用前置通配符确实花费了很长时间。我通过完整的名称搜索了一个特定的对象,但搜索仍然没有得到结果,我觉得它可能永远都不会有结果了。谢谢! - AnimaSola
我一直使用这种搜索方式,很好用,只需要像这样按ObjectClass进行过滤:(&(ObjectClass=Person)(cn=*关键词*)) - MGP
2
@ManuelGutierrez 时间仍然是O(N),但由于额外的objectClass过滤器,现在你正在处理一个较小的N - user207421

7

你最好预先考虑前缀,例如:

"(|(displayName=SEARCHKEY*)(displayName=ITSM - SEARCHKEY*)(displayName=alt prefix - SEARCHKEY*))"

有些笨重,但我在我的组织内也在做类似的事情。


1

这应该可以工作,至少根据MSDN网络上的搜索过滤器语法文章。

你注意到的“卡住”可能只是一个延迟。尝试使用更窄的范围运行相同的查询(例如测试对象所在的特定OU),如果你对所有AD对象运行它,可能需要很长时间来处理。

你也可以尝试将过滤器分成两部分:

(|(displayName=*searchstring)(displayName=searchstring*))

我尝试使用上述过滤器搜索一个特定的对象,因为我输入了整个名称,但搜索需要很长时间。我不认为它会解决。EJP的评论说,前导通配符可能需要很长时间,这可能是正确的。感谢回复,谢谢! :) - AnimaSola

1
@user207421的回答只有部分正确:默认情况下,对displayName属性进行中位数搜索将导致完全扫描目录,因此速度慢且资源密集。
然而,AD模式管理员可以通过实现元组索引来改变这一点 - 这是专门设计用于提高具有前导*的搜索性能的。他们需要修改模式对象的searchFlags属性 - 参见https://learn.microsoft.com/en-us/windows/win32/adschema/a-searchflags

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接