使用 DN(专有名称)的 Active Directory 搜索

Active Directory search using DN (distinguished name)

我正在开发一个 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"]) . "<br />"; 然后我得到经理的 DN(专有名称)。 例如:"Array ( [count] => 1 [0] => CN=LASTNAME\, FIRSTNAME,OU=01_User,DC=int,DC=domain,DC=de ) Manager: 1"

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

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

然后我得到一个 "Array to string convertion error"。 如果我使用 print_r($data[$i]) 转换为字符串,那么我会得到 "Error in search query: Bad search filter".

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

希望有人能帮助我。谢谢!

您的代码有几个问题:

  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));

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

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

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