使用 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 字符串吗?
希望有人能帮助我。谢谢!
您的代码有几个问题:
错误信息正确。你给它一个数组,而不是一个字符串。我想你的意思是在那里使用 manager
属性($data[$i]["manager"][0]
,而不是 $data[$i]
)。在搜索结果中,属性都以数组形式呈现,即使它们是单值属性(如manager
)。
您在 LDAP 查询中缺少右括号。它应该是这样的:
如果您确实在使用 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 的反馈更新了答案。
我正在开发一个 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 字符串吗?
希望有人能帮助我。谢谢!
您的代码有几个问题:
错误信息正确。你给它一个数组,而不是一个字符串。我想你的意思是在那里使用
manager
属性($data[$i]["manager"][0]
,而不是$data[$i]
)。在搜索结果中,属性都以数组形式呈现,即使它们是单值属性(如manager
)。您在 LDAP 查询中缺少右括号。它应该是这样的:
如果您确实在使用 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 的反馈更新了答案。