【问题标题】:How to get list of users from LDAP directory using PHP?如何使用 PHP 从 LDAP 目录中获取用户列表?
【发布时间】:2012-11-15 19:02:48
【问题描述】:
$ldaphost = "my_host_name";
$ds=ldap_connect($ldaphost) or die("Could not connect to $ldaphost"); 
ldap_set_option ($ds, LDAP_OPT_REFERRALS, 0);
ldap_set_option ($ds, LDAP_OPT_PROTOCOL_VERSION, 3);

if ($ds) 
{ 
    $basedn = 'my_dc_string';
    $samaccountname = 'my_user_name';
    $filters = "(samaccountname={$samaccountname})";
    $result = ldap_search($ds, $basedn, $filters);
}

如何使用 PHP 从 LDAP 获取所有用户的列表?上面的代码在 ldap_search 函数上失败了,给出了这个警告

“警告:ldap_search():搜索:操作错误”

我的用户名、ldaphost 等都是正确的。不过我不确定过滤器。

【问题讨论】:

    标签: php ldap


    【解决方案1】:
    /**
     * Get a list of users from Active Directory.
     */
    $ldap_password = 'PASSWORD';
    $ldap_username = 'USERNAME@DOMAIN';
    $ldap_connection = ldap_connect(HOSTNAME);
    if (FALSE === $ldap_connection){
        // Uh-oh, something is wrong...
    }
    
    // We have to set this option for the version of Active Directory we are using.
    ldap_set_option($ldap_connection, LDAP_OPT_PROTOCOL_VERSION, 3) or die('Unable to set LDAP protocol version');
    ldap_set_option($ldap_connection, LDAP_OPT_REFERRALS, 0); // We need this for doing an LDAP search.
    
    if (TRUE === ldap_bind($ldap_connection, $ldap_username, $ldap_password)){
        $ldap_base_dn = 'DC=XXXX,DC=XXXX';
        $search_filter = '(&(objectCategory=person)(samaccountname=*))';
        $attributes = array();
        $attributes[] = 'givenname';
        $attributes[] = 'mail';
        $attributes[] = 'samaccountname';
        $attributes[] = 'sn';
        $result = ldap_search($ldap_connection, $ldap_base_dn, $search_filter, $attributes);
        if (FALSE !== $result){
            $entries = ldap_get_entries($ldap_connection, $result);
            for ($x=0; $x<$entries['count']; $x++){
                if (!empty($entries[$x]['givenname'][0]) &&
                     !empty($entries[$x]['mail'][0]) &&
                     !empty($entries[$x]['samaccountname'][0]) &&
                     !empty($entries[$x]['sn'][0]) &&
                     'Shop' !== $entries[$x]['sn'][0] &&
                     'Account' !== $entries[$x]['sn'][0]){
                    $ad_users[strtoupper(trim($entries[$x]['samaccountname'][0]))] = array('email' => strtolower(trim($entries[$x]['mail'][0])),'first_name' => trim($entries[$x]['givenname'][0]),'last_name' => trim($entries[$x]['sn'][0]));
                }
            }
        }
        ldap_unbind($ldap_connection); // Clean up after ourselves.
    }
    
    $message .= "Retrieved ". count($ad_users) ." Active Directory users\n";
    

    【讨论】:

    • 这行得通...除了结果集是空的,正在调查它。谢谢
    • 太棒了。得到它的工作。现在开始获取所有用户的所有信息
    【解决方案2】:

    来自php.net

    ldap_connect()    // establish connection to server
       |
    ldap_bind()       // anonymous or authenticated "login"
       |
    do something like search or update the directory
    and display the results
       |
    ldap_close()      // "logout"
    

    您应该使用ldap_bind() 登录并在所有操作后使用ldap_close() 关闭连接。

    Example usage here.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 2015-04-07
      相关资源
      最近更新 更多