我使用以下代码成功查询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
等不同引号,更多括号。
我做错了什么以及获得经理记录的正确方法是什么?
答案 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