0

我正在开发一个 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(专有名称)。例如:“数组([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 字符串吗?

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

4

2 回答 2

1

您的代码有几个问题:

  1. 错误信息是正确的。你给它一个数组,而不是一个字符串。我认为您的意思是在此处使用该manager属性($data[$i]["manager"][0], not $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));
于 2019-10-02T13:34:42.853 回答
1

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

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

我用 OP 的反馈更新了答案。

于 2019-10-04T07:50:01.680 回答