Php 使用DN(可分辨名称)进行Active Directory搜索
我正在使用PHP函数获取active directory用户的管理员(使用用户的电子邮件地址)。 得到经理后,我想得到经理的电子邮件地址 我使用此代码获取管理器:Php 使用DN(可分辨名称)进行Active Directory搜索,php,active-directory,ldap,distinguishedname,Php,Active Directory,Ldap,Distinguishedname,我正在使用PHP函数获取active directory用户的管理员(使用用户的电子邮件地址)。 得到经理后,我想得到经理的电子邮件地址 我使用此代码获取管理器: //Search using a filter. $result = ldap_search($connect,$ldaptree, "(mail=useremail@domain.de)") or die ("Error in search query: ".ldap_error($connect)); $d
//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 />";
然后我得到一个“数组到字符串转换错误”。
如果我使用print_r($data[$I])转换为字符串,那么我会得到“搜索查询中的错误:错误的搜索过滤器”
所以我的问题是,如何使用DN来获取DN后面的用户属性?
是否可以筛选DN?
我必须处理DN字符串吗
希望有人能帮助我。谢谢大家! 您的代码有几个问题:
管理器
属性($data[$I][“manager”][0]
,而不是$data[$I]
)。在搜索结果中,属性都显示为数组,即使它们是单值属性(如manager
)discriminatedname
,而不是DN
(我相信一些OpenLDAP实现使用DN
,这就是为什么文档中会出现这种情况)$result=ldap_search($connect,$ldaptree,”(differentiedname=“.$data[$i][“manager”][0]”)或die(“搜索查询中的错误:.ldap_Error($connect));
您的代码有几个问题:
管理器
属性($data[$I][“manager”][0]
,而不是$data[$I]
)。在搜索结果中,属性都显示为数组,即使它们是单值属性(如manager
)discriminatedname
,而不是DN
(我相信一些OpenLDAP实现使用DN
,这就是为什么文档中会出现这种情况)$result=ldap_search($connect,$ldaptree,”(differentiedname=“.$data[$i][“manager”][0]”)或die(“搜索查询中的错误:.ldap_Error($connect));
您应该能够通过调用ldap\u search
直接检索管理器,管理器的DN为BaseDN,过滤器为(objectclass=*)
我用OP的反馈更新了答案。您应该能够通过调用
ldap\u search
直接检索管理器,管理器的DN为BaseDN,过滤器为(objectclass=*)
我用OP的反馈更新了答案。是的,没错。它必须是“$data[$i][“manager”]”。但我还是犯了同样的错误。如果我使用“$data[$I][“manager”]”,则会出现“数组到字符串转换”错误。如果我使用“print\u r($data[$I][“manager”]),那么我得到了“Array([count]=>1[0]=>CN=LASTNAME\,FIRSTNAME,OU=01\u User,DC=int,DC=domain,DC=de)manager:1”的权利。属性通常作为数组本身返回,即使它们是单值的。所以请使用
$data[$i][“manager”][0]
。谢谢!这解决了数组到字符串的转换问题!是的,没错。它必须是“$data[$i][“manager”]”。但我还是犯了同样的错误。如果我使用“$data[$I][“manager”]”,则会出现“数组到字符串转换”错误。如果我使用“print\u r($data[$I][“manager”]),那么我得到了“Array([count]=>1[0]=>CN=LASTNAME\,FIRSTNAME,OU=01\u User,DC=int,DC=domain,DC=de)manager:1”的权利。属性通常作为数组本身返回,即使它们是单值的。所以请使用$data[$i][“manager”][0]
。谢谢!这解决了数组到字符串的转换问题!非常感谢!现在我明白了。但现在我得到了“ldap_search():search:Invalid DN syntax”错误。如果我使用“print_r($data[$I]['manager']),也是一样的。这怎么可能呢?因为我使用的是从User.OK的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);”删除第一个字符时,它就起作用了。但这只是一个工作区。这不是解决问题的好办法…非常感谢!现在我明白了。但现在我得到了“ldap_search():search:Invalid DN syntax”错误。如果我使用“print_r($data[$I]['manager']),也是一样的。这怎么可能呢?因为我使用的是从User.OK的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);”删除第一个字符时,它就起作用了。但这只是一个工作区。这不是解决问题的好办法。。。
$result = ldap_search($connect,$ldaptree, "(DN=".$data[$i]["manager"]."") or die ("Error in search query: ".ldap_error($connect));
$result = ldap_search($connect, $data[$i]['manager'][0], '(objectclass=*)');