Php 使用DN(可分辨名称)进行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

我正在使用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));
    $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

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

  • 如果您确实在使用Active Directory,则该属性被称为
    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

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

  • 如果您确实在使用Active Directory,则该属性被称为
    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=*)');