我正在使用perl-ldap来搜索和修改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)
- 虽然我的理解是它需要一个类似于代码中的过滤器字符串,所以这不是很有帮助。
格式化此过滤字符串的正确方法是什么?
答案 0 :(得分:1)
尝试以下调试语句以查看最终过滤器的外观
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
,就像您的过滤器一样。仅这一点可能会导致问题,因为“group”中可能没有任何用户具有这些属性。
#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)
{ ....
....
}
答案 1 :(得分:0)
这是否适用于命令行LDAP工具?看起来这是LDAP查询的问题,而不是Net :: LDAP。
我对LDAP语法不太满意,但我认为它类似于
(&(group=uniqueMember)(cn=exuser)(ou=people)(dc=example)(dc=com))
您也可以尝试使用Net :: LDAP :: Filter设置过滤器,看看它解析它的内容。