PHP LDAP 获取作为组成员的成员的用户详细信息

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5327104/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 21:01:19  来源:igfitidea点击:

PHP LDAP Get user details of member which is a member of a group

phpactive-directoryldap

提问by Brigante

I'm trying to create a PHP script that will return some details of each member that is part of a specific group in our Active Directory.

我正在尝试创建一个 PHP 脚本,该脚本将返回属于我们 Active Directory 中特定组的每个成员的一些详细信息。

I have no problem connecting and display the names (CN) of the group members but when it comes to displaying details such as telephone, email and username I'm stuck.

我连接并显示群组成员的姓名 (CN) 没有问题,但是在显示电话、电子邮件和用户名等详细信息时,我被卡住了。

Here's my code I'm trying with. Can anyone see what I'm doing wrong?

这是我正在尝试的代码。谁能看到我做错了什么?

<?php
$ldap_server = "AD_Server.domain.pri:389";
$auth_user = "[email protected]";
$auth_pass = "password";

$base_dn = "OU=IM Groups,OU=GLOBAL,DC=domain,DC=pri";
$filter = "(&(objectCategory=user)(memberOf=IM-ALL_USERS))";

// connect to server
if (!($connect=@ldap_connect($ldap_server))) {
     die("Could not connect to ldap server");
}

// bind to server
if (!($bind = ldap_bind($connect, $auth_user, $auth_pass))) {
     die("Unable to bind to server");
}

// search active directory
if (!($search = ldap_search($connect, $base_dn, $filter))) {
     die("Unable to search ldap server");
}

$number_returned = ldap_count_entries($connect,$search);
$info = ldap_get_entries($connect, $search);

echo "The number of entries returned is ". $number_returned."<p>";

for ($i=0; $i<$info["count"]; $i++) {
   echo "Name is: ". $info[$i]["givenname"][0]."<br>";
   echo "Display name is: ". $info[$i]["displayname"][0]."<br>";
   echo "Email is: ". $info[$i]["mail"][0]."<br>";
   echo "Telephone number is: ". $info[$i]["telephonenumber"][0]."<p>";
}
?>

回答by Brigante

Worked it out using an excellent function created by Sam J Levy.

使用Sam J Levy创建的优秀函数解决了这个问题。

Here's the final code that worked.

这是最终有效的代码。

<?php

function explode_dn($dn, $with_attributes=0)
{
    $result = ldap_explode_dn($dn, $with_attributes);
    foreach($result as $key => $value) $result[$key] = preg_replace("/\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\1')).''", $value);
    return $result;
}

function get_members($group,$user,$password) {
    $ldap_host = "LDAPSERVER";
    $ldap_dn = "OU=some_group,OU=some_group,DC=company,DC=com";
    $base_dn = "DC=company,DC=com";
    $ldap_usr_dom = "@company.com";
    $ldap = ldap_connect($ldap_host);

    ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION,3);
    ldap_set_option($ldap, LDAP_OPT_REFERRALS,0);

    ldap_bind($ldap, $user . $ldap_usr_dom, $password);
    $results = ldap_search($ldap,$ldap_dn, "cn=" . $group);
    $member_list = ldap_get_entries($ldap, $results);

    $dirty = 0;
    $group_member_details = array();

    foreach($member_list[0]['member'] as $member) {
        if($dirty == 0) {
            $dirty = 1;
        } else {
            $member_dn = explode_dn($member);
            $member_cn = str_replace("CN=","",$member_dn[0]);
            $member_search = ldap_search($ldap, $base_dn, "(CN=" . $member_cn . ")");
            $member_details = ldap_get_entries($ldap, $member_search);
            $group_member_details[] = array($member_details[0]['givenname'][0],$member_details[0]['sn'][0],$member_details[0]['telephonenumber'][0],$member_details[0]['othertelephone'][0]);
        }
    }
    ldap_close($ldap);
    return $group_member_details;
}

// Specify the group from where to get members and a username and password with rights to query it
$result = get_members("groupname","username","password");

// The following will create an XML file with the details from $group_member_details
$xml = simplexml_load_string("<?xml version='1.0'?>\n<AddressBook></AddressBook>");
$version = $xml->addChild('version', '1');

foreach($result as $e) {
    $contact = $xml->addChild('Contact');
    $contact->addChild('FirstName', $e[0]);
    $contact->addChild('LastName', $e[1]);
    $phone = $contact->addChild('Phone');
    if ($e[3] == '') {
                $phone->addChild('phonenumber', '0');
        } else {
                $phone->addChild('phonenumber', $e[3]);
        }
    $phone->addChild('accountindex', '0');
    $phone = $contact->addChild('Phone');
    if ($e[2] == '') {
        $phone->addChild('phonenumber', '0');
    } else {
        $phone->addChild('phonenumber', $e[2]);
    }
    $phone->addChild('accountindex', '1');
    $contact->addChild('Group', '0');
    $contact->addChild('PhotoUrl', 'empty');
}

$xml->asXML('phonebook.xml');

?>