如何使用Perl的Net :: LDAP进行复杂查询?

时间:2008-10-28 09:10:54

标签: perl ldap

我在运行针对公司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列表。

3 个答案:

答案 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参数。