我使用过滤器作为(cn=${prefix}*)
,其中$prefix = 'a';
但仍然显示找到0条记录。
当我在没有此过滤器的情况下进行简单搜索时,我发现许多记录以'a'
开头。
这里是代码的一部分: - 我的$ prefix = shift(); my $ result = $ ldap-> search(base =>“$ ldapbase”, scope => “子”, filter => “(对象类= )(CN = $前缀)”, attrs => [ '*'] )或死“错误搜索树:$ @ \ n”;
我的$ldapbase
向我提供了所有员工的详细信息,我希望那些仅以'a'
开头的人。
答案 0 :(得分:1)
为LDAP管理员提供一个单项目标可能是明智的,您打算提出涉及使用子字符串的请求。 LDAP管理员可能能够将CN编入索引以进行子字符串搜索,因此搜索速度会更快。过滤器'(cn=a*)'
是一个子字符串过滤器,应该从您的搜索库“向下”(您在示例中使用子树范围)返回所有CN属性,这些属性以字母“a”或“A”开头(CN可能是DirectoryString类型,可能没有区分大小写。)
从实际角度来看,一些较旧的目录服务器在子字符串'*'
字符之前需要多个字符才能使子字符串索引起作用,例如'(cn=ab*)'
可能在某些服务器上使用索引,而{{1可能不会使用索引。
在您的代码示例中,列出了过滤器'(cn=a*)'
,它不是合法的LDAP搜索过滤器。也许你的意思是'(objectClass=)(cn=$prefix)'
(inetOrgPerson可能是其他一些对象类),列出的代码是拼写错误。如果您只想要以“a”或“A”开头的条目的DN,则可以请求“特殊”属性“1.1”,这样就可以只输入条目DN并且不返回任何属性。
答案 1 :(得分:0)
当我们发现客户搜索以a开头的CN时,我们从他们看到的下一个搜索是以a开头的CN。回到我们有这么多用户之前,下一个搜索将是搜索以b开头的CN。
如果您真的想查找数据库中的所有条目,则可能有更好的方法。您可能想与LDAP管理员交谈,他们可能有更好的建议方法。通常,LDAP服务器被设计为执行搜索以查找条目的一小部分子集,并且虽然它们处理具有较大结果集的查询还可以,但是取决于确切的服务器软件,它们可能无法很好地处理它。
还有一个问题,就是这是否真的是您想要做的。大多数情况下,我们的用户希望提取所有条目的原因是因为他们是某些应用程序的管理员,这些应用程序希望将所有用户数据存储在自己的数据库中。
有时,可以将这些应用程序配置为以覆盖模式使用外部LDAP,只需配置它们即可。在每种情况下,都要求我为这种情况提供帮助,应用程序文档明确表示可以做到这一点,但这并不是应用程序管理员认可的。
在大多数情况下,应用程序用户群比整个公司要小得多,因此,当他们真正只需要少于1%的用户时,他们正试图吸引公司的所有用户。能够查询仅选择所需用户的其他内容(例如,(departmentnumber=7159)
)通常会更加优化。