我在运行针对公司LDAP服务器的复杂查询时遇到问题。我正在使用以下Perl脚本:
use Data::Dumper;
use Net::LDAP;
die "Can't connect to LDAP-Server: $@\n"
unless $ldap = Net::LDAP->new( 'xLDAPx' );
foreach my $filter ( 'ou=Personal', 'ou=BAR', 'ou=Personal,ou=BAR', 'ou=Personal,ou=FOO,o=FOO,dc=foo,dc=com' )
{
$mesg = $ldap->search( base => "o=FOO,dc=foo,dc=com", filter => $filter );
print Dumper($mesg), "\n\n";
}
虽然前两个过滤器起作用(如返回预期值),但最后一个过滤器不起作用。它返回一个空数组。让我感到困惑的是,当我使用像Softerra LDAP Browser这样的工具时,完全相同的查询字符串可以正常工作。
我也尝试过使用PHP的ldap_search
&合作,无济于事。
有人可以对此有所了解吗?
感谢您阅读
holli
编辑: 这是服务器的结构:
Server
ou=FOO
ou=...
ou=Personal
uid=something
我需要一份uids列表。
答案 0 :(得分:5)
我认为你希望它更像(&(ou=Personal)(ou=FOO)(o=FOO)(dc=foo)(dc=com))
。
但你根本不清楚你想要什么,所以我不能为你做过滤。
编辑补充:我猜这是你想要做的:(|(ou=Personal)(ou=FOO))
答案 1 :(得分:4)
原因是您没有提供语法正确的过滤字符串,而是DN的一部分。我无法想象这在Ldap浏览器中有效 - 我只是尝试了自己没有成功。
前两个是正确的过滤字符串。它们以“({attribute} = {value})”方式过滤单个对象属性。第一个(“ou = Personal”)将在您的搜索库中返回任何名为“Personal”的OU。
如果你更详细地解释一下你想要找到什么,我可以告诉你你需要什么过滤器表达式。
答案 2 :(得分:2)
编写符合RFC 2254的过滤条件 然后看看会发生什么。您不需要复杂查询,您希望一个分支下的每个条目都有一个属性。查看搜索方法的attrs参数。