10

我正在使用以下代码成功地为我们的 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等。

我做错了什么,获取经理记录的正确方法是什么?

4

3 回答 3

14

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

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

于 2013-06-25T18:14:24.317 回答
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-7924​​96933.html

于 2020-10-20T10:16:55.043 回答
0

老问题,但我认为它没有得到明确的回答。您可以通过 DN 搜索用户、计算机或组的 AD,但必须正确转义,因此请使用内置函数。

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

根据我的测试,添加类或类别对速度没有影响,可能是因为 DN 是一个独特的位置,而不是真正的属性。

于 2020-09-18T18:45:10.800 回答