用于distinguishedName的ldap过滤器

时间:2013-06-25 17:39:32

标签: php ldap ldap-query

我使用以下代码成功查询Active Directory:

$filter = (&(objectCategory=person)(samaccountname=someusername));
$fields = array("samaccountname","mail","manager","department","displayname","objectGUID");

$user = ldap_search($ldapconnection, $baseDn, $filter, $fields);

结果数组为manager属性提供此值:

CN=McBossy\, Boss,OU=Users,OU=CentralOffice,DC=ds,DC=example,DC=com

这对我来说就像是一个尊贵的名字。但是当我尝试查询经理的记录时,

$filter = (&(objectCategory=person)(dn='CN=McBossy\, Boss,OU=Users,OU=CentralOffice,DC=ds,DC=example,DC=com'));

$manager = ldap_search($ldapconnection, $baseDn, $filter, $fields);

查询因PHP Warning: ldap_search(): Search: Bad search filter

而失败

我尝试过多种可能性,包括使用distinguishedName而不是dn等不同引号,更多括号。

我做错了什么以及获得经理记录的正确方法是什么?

3 个答案:

答案 0 :(得分:10)

dn不是属性。在过滤器中只能使用属性类型,OID和名称。

获取manager属性后,要获取作为管理器的DN的属性,请使用manager属性的值作为搜索请求中的基础对象。将搜索范围设置为BASE,将过滤器设置为(&)(objectClass=*),并请求所需的属性。然后将搜索请求发送到服务器并解释响应。

答案 1 :(得分:0)

旧问题,但我认为答案没有明确。您可以按DN搜索AD,用户,计算机或组,但是必须正确进行转义,因此请使用内置功能。<​​/ p>

$ldap_to_find = ldap_escape($manager_dn, null, LDAP_ESCAPE_FILTER);
$ldap_filter  = "(distinguishedName={$ldap_to_find})";

根据我的测试,添加类或类别不会造成速度差异,这可能是因为DN是唯一的位置,而不是真正的属性。

答案 2 :(得分:0)

我不确定我是否完全理解您的问题。 例如,如果LDAP中有一个条目

dn: uid=John Smith,ou=people,dc=example,dc=org
objectClass: inetOrgPerson
cn: John Smith
sn: smith
uid: jsmith
uid: John Smith
mail: j.smith@example.com
ou: accounting

如果要搜索dn包含“ uid = John Smith”的条目,则cmd将如下所示:

ldapsearch -b dc = example,dc = org -D“ cn = admin,dc = example,dc = org” -LLL'(uid:dn:= John Smith)'

https://confluence.atlassian.com/kb/how-to-write-ldap-search-filters-792496933.html