【问题标题】:ldap filter for distinguishedName用于区分名称的 ldap 过滤器
【发布时间】:2013-06-25 17:39:31
【问题描述】:

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

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

【问题讨论】:

    标签: php ldap ldap-query


    【解决方案1】:

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

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

    【讨论】:

    • 好的。那么,鉴于到用户经理的唯一链接(据我所知)是manager 属性,我如何使用该信息来获取经理的用户记录?
    • 这不会找到所有以我当前用户为经理的人吗?我想得到我当前用户的经理。对不起,如果我很厚。
    • 是的,会的。我重新阅读了您的问题并更新了我的答案。
    • 嗨,我在同一条船上 - 我可以通过电子邮件查询用户,让他们的经理在结果中,然后我想获得他们经理的经理,但我必须与之合作第一个 AD 结果是“CN=McBossy\, Boss,OU=Users,OU=CentralOffice,DC=ds,DC=example,DC=com”。我对 AD 的了解不够,无法利用这个答案。我理解当你说你不能按 DN 搜索时,但我如何“将搜索范围设置为 BASE”?我使用与@dnagirl 几乎相同的代码开始。
    • @BrianAshe,php 的 ldap_search 是 ldapsearch 的包装器。要了解这些选项,请查看此处:access.redhat.com/documentation/en-US/Red_Hat_Directory_Server/… 您可能对-b 选项最感兴趣
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      我不确定我是否完全理解您的问题。 例如,如果 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-30
        • 1970-01-01
        • 2013-11-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多