【问题标题】:Active Directory search using DN (distinguished name)使用 DN(可分辨名称)的 Active Directory 搜索
【发布时间】:2019-10-05 15:11:09
【问题描述】:

我正在开发一个 PHP 函数来获取活动目录用户的管理员(使用用户的电子邮件地址)。 得到经理后,我想得到经理的电子邮件地址。

我用这段代码来获取经理:

    //Search using a filter.
    $result = ldap_search($connect,$ldaptree, "(mail=useremail@domain.de)") or die ("Error in search query: ".ldap_error($connect));
    $data = ldap_get_entries($connect, $result);


    // iterate over array and print data for each entry
    echo '<h1>Show me the users</h1>';
    for ($i=0; $i<$data["count"]; $i++) {

        echo "Manager: " . print_r($data[$i]["manager"]) . "<br />";

代码正在运行,并且在搜索用户电子邮件或其他属性时,我得到了正确的值。 但是当我在寻找经理时echo "Manager: " . print_r($data[$i]["manager"]) . "&lt;br /&gt;"; 然后我得到经理的 DN(专有名称)。 例如:“Array ([count] => 1 [0] => CN=LASTNAME\, FIRSTNAME,OU=01_User,DC=int,DC=domain,DC=de) 经理:1"

现在的问题是,当我尝试搜索经理的电子邮件地址时,使用 DN 作为过滤器

$result = ldap_search($connect,$ldaptree, "(DN=".$data[$i]["manager"]."") or die ("Error in search query: ".ldap_error($connect));

然后我得到一个“数组到字符串转换错误”。 如果我使用 print_r($data[$i]) 转换为字符串,则会收到“搜索查询错误:搜索过滤器错误”。

所以我的问题是,如何使用 DN 来获取 DN 后面的用户的属性? 是否可以过滤 DN? 我必须处理 DN 字符串吗?

希望有人可以帮助我。谢谢!

【问题讨论】:

    标签: php active-directory ldap distinguishedname


    【解决方案1】:

    您应该能够通过直接调用ldap_search 来检索经理,经理的DN 为BaseDN,过滤器为(objectclass=*)

    $result = ldap_search($connect, $data[$i]['manager'][0], '(objectclass=*)');
    

    我根据 OP 的反馈更新了答案。

    【讨论】:

    • 非常感谢!现在我明白了。但现在我收到“ldap_search(): Search: Invalid DN syntax”错误。如果我使用“print_r($data[$i]['manager'])”也是一样。
    • 怎么可能?因为我使用的是从用户的 manager 属性中获得的 DN。
    • 好的,您的代码是搜索 DN 的正确方法。我的问题是,当我获得用户管理器的 DN 数组值并将其转换为字符串时,总是将 ArrayID 设置为字符串中的第一个字符。我通过删除字符串的第一个字符解决了这个问题。但这怎么会发生呢?还是我做错了什么?! "$managerDN = substr($managerDN, 1);"
    • 这就是我得到的:“1CN=LASTNAME\, FIRSTNAME,OU=01_User,DC=int,DC=domain,DC=de”。如您所见,第一个字符设置为“1”。但为什么呢?
    • 所以当我使用“substr($managerDN, 1);”时它可以工作删除第一个字符。但这只是一种解决方法。不是解决问题的优雅方式...
    【解决方案2】:

    您的代码有一些问题:

    1. 错误消息是正确的。你给它一个数组,而不是一个字符串。我认为您的意思是在那里使用manager 属性($data[$i]["manager"][0],而不是$data[$i])。在搜索结果中,属性都以数组的形式呈现,即使是单值属性(如manager)。

    2. LDAP 查询中缺少右括号。它应该是这样的:

    3. 如果您确实在使用 Active Directory,则该属性称为 distinguishedName,而不是 DN(我相信某些 OpenLDAP 实现使用 DN,这就是文档中出现的原因)。

    所以你的代码应该是这样的:

    $result = ldap_search($connect,$ldaptree, "(distinguishedName=" . $data[$i]["manager"][0] . ")") or die ("Error in search query: ".ldap_error($connect));
    

    【讨论】:

    • 是的,没错。它必须是'$data[$i]["manager"]'。但我仍然得到同样的错误。如果我使用 "$data[$i]["manager"]" 那么我会得到 "数组到字符串转换" 错误。如果我使用 "print_r($data[$i]["manager"])" 那么我得到 "Array ( [count] => 1 [0] => CN=LASTNAME\, FIRSTNAME,OU=01_User,DC=int ,DC=domain,DC=de ) 经理:1"
    • 对。属性通常作为数组本身返回,即使它们是单值的。所以使用$data[$i]["manager"][0]
    • 谢谢!这解决了数组到字符串的转换问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    相关资源
    最近更新 更多