我正在使用以下代码成功查询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对我来说,这看起来像一个distinguishedName。但当我试图查询经理的记录时,
$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,等等。
我做错了什么?获得经理记录的正确方法是什么?
发布于 2013-06-26 02:14:24
dn不是属性。筛选器中只能使用属性类型、OID和名称。
在获取manager属性时,要获取作为管理器的DN的属性,请使用manager属性的值作为搜索请求中的基本对象。将搜索范围设置为BASE,过滤器设置为(&)或(objectClass=*),并请求所需的属性。然后将搜索请求发送到服务器并解释响应。
发布于 2020-09-19 02:45:11
这是个老问题,但我不认为它得到了明确的回答。您可以按DN搜索AD中的用户、计算机或组,但必须正确转义,因此请使用内置函数。
$ldap_to_find = ldap_escape($manager_dn, null, LDAP_ESCAPE_FILTER);
$ldap_filter = "(distinguishedName={$ldap_to_find})";根据我的测试,添加类或类别没有速度差异,可能是因为DN是一个惟一的位置,而不是一个真正的属性。
发布于 2020-10-20 18:16:55
我不确定我是否完全理解了你的问题。例如,如果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
https://stackoverflow.com/questions/17303967
复制相似问题