Perl Net :: LDAP过滤器不起作用

问题描述:

我正在使用perl-ldap来搜索和修改LDAP目录。Perl Net :: LDAP过滤器不起作用

除了当我尝试基于其“uniqueMember”属性(其值为dn(例如,cn=exuser,ou=people,dc=example,dc=com))搜索组时,一切正常。

这似乎使过滤字符串基于组成员

uniqueMember=cn=exuser,ou=people,dc=example,dc=com 

但是,这并不工作,在搜索。

也不会“转义”字符串中的等号,以便在打印时生成的字符串看起来像具有等号。而Net :: LDAP :: Filter对象没有很好的文档,所以我不知道如何创建一个除了传递我一直使用的过滤器字符串(这也不起作用) 。

有什么建议吗?

我应该补充一点,我确定问题是搜索没有返回结果 - 最终的搜索对象有0个计数。

我不能显示确切的代码,但它是这样的(仅文字已经改变):

my $filter = "uniqueMember=cn=exuser,ou=people,dc=example,dc=com"; 

my $result = $ldap->search(base => 'ou=groups,dc=example,dc=com', 
          filter => $filter); 
while(my $entry = $result->pop_entry) 
{ .... 
.... 
} 

连接并绑定到LDAP服务器已在一个子程序,其中工程完成。我确信组织单位的名称以及uniqueMember值的格式。对于$filter字符串,我尝试了一次转义等号(\=)和两次(\\\\=)。我试过使用Net::LDAP::Filter->new($filter) - 虽然我的理解是它需要一个像代码中的过滤器字符串,所以这不是很有帮助。

什么是格式化此过滤器字符串的正确方法?

+2

显示你的Perl代码,用英文描述是不够的。 - 我总是使用[gq浏览器](http://sf.net/projects/gqclient/)来帮助LDAP调试。 – daxim 2011-06-14 14:41:29

+0

您是否尝试过使用不同的版本。如果服务器与2.x兼容,则此查询可能会有效。 'version => N 设置正在使用的协议版本(默认为LDAPv3)。如果您想要与旧服务器通信并因此必须使用LDAPv2.',这非常有用 – ZnArK 2012-07-06 14:08:32

这是否与命令行LDAP工具一起工作?它似乎是LDAP查询的问题,而不是Net :: LDAP。

我不是很擅长用LDAP语法,但我想那会像

(&(group=uniqueMember)(cn=exuser)(ou=people)(dc=example)(dc=com))

您也可以尝试建立与网:: LDAP ::过滤器及滤芯看看它解析它。

请尝试以下调试语句看到最终过滤器是什么样子

my $filter_str = "uniqueMember=cn=exuser,ou=people,dc=example,dc=com"; 
my $filter = Net::LDAP::Filter->new($filter_str); 

print $filter->as_string(); 

另外,尝试使用通配符,像这样:

#my $filter = "uniqueMember=cn=exuser,ou=people,dc=example,dc=com"; 
my $filter = "uniqueMember=*exuser*"; 

而且,你的基础在ou=groups而不是指向ou=people喜欢你的过滤器。这可能导致问题,因为可能没有任何用户在“组”中拥有这些属性。

#my $result = $ldap->search(base => 'ou=groups,dc=example,dc=com', 
my $result = $ldap->search(base => 'ou=people,dc=example,dc=com', 
         filter => $filter); 
while(my $entry = $result->pop_entry) 
{ .... 
    .... 
}