与Win Server 2008 R2 Standard AD的LDAP绑定失败

时间:2013-07-22 17:30:35

标签: ldap bind

环境是运行带有Apache 2.2和PHP 5.3.19的Win Server 2008 R2 Standard SP1的单个服务器。

我有一个PHP脚本尝试对Win Server 2008 R2 Active Directory进行LDAP绑定,无论我尝试什么变体,都会失败。我放了很多回声来查看每一步的结果,我发现ldap_connect总是连接起来。我可以把总垃圾放在URL中,它永远不会失败。我的PHP脚本的最新版本执行匿名绑定,然后执行失败的ldap_search。

这是脚本(实际域名,用户&pswd已更改):

<?php

    define(LDAP_OPT_DIAGNOSTIC_MESSAGE, 0x0032);

    ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
    echo "<br>LDAP set debug level: " . ldap_errno($ad) . ' ' . ldap_error($ad);

    $LDAPhost = 'ldap://myDomain.com';
    $LDAPport = '3268';
    $ad = ldap_connect($LDAPhost, $LDAPport);
    echo "<br>LDAP connect to $LDAPhost: " . ldap_errno($ad) . ' ' . ldap_error($ad);

    if ($ad) {

        ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3);
        echo "<br>LDAP set protocol to version 3: " . ldap_errno($ad) . ' ' . ldap_error($ad);

        ldap_set_option($ad, LDAP_OPT_REFERRALS, 0);
        echo "<br>LDAP set referrals to 0: " . ldap_errno($ad) . ' ' . ldap_error($ad);

        $bind = ldap_bind($ad);
        echo "<br>LDAP bind: " . ldap_errno($ad) . ' ' . ldap_error($ad);

        $baseDN = 'CN=Users,DC=myDomain,DC=com';
        $filter = '(objectClass=*)';
        $search = ldap_search($ad, $baseDN, $filter);
        echo "<br>LDAP search $baseDN $filter: " . ldap_errno($ad) . ' ' . ldap_error($ad);

        if ($rec = ldap_get_entries($ad, $search)) {
            echo "<br>LDAP get entries: " . ldap_errno($ad) . ' ' . ldap_error($ad);

            for ($i = 0; $i < $rec["count"]; $i++) {

                echo "<br>$rec[0]['uid'][0]";
                echo "<br>$rec[0]['givenname'][0]";

            }

        } else {
            echo '<br>Record not found.';
        }

        ldap_close($ad);
    } else {
        echo '<br><br>Could not connect.';
    }
?>

显示的结果是:

LDAP set debug level:
LDAP connect to ldap://myDomain.com: 0 Success
LDAP set protocol to version 3: 0 Success
LDAP set referrals to 0: 0 Success
LDAP bind: 0 Success
LDAP search CN=Users,DC=myDomain,DC=com (objectClass=*): 1 Operations error
Record not found.

使用Windows LDP.exe实用程序,我能够使用测试中使用的相同用户/ pswd凭据进行绑定。

我很想知道确切地说要放什么作为基本DN,即什么是ldap_bind比较这些值? Active Directory中的东西?注册表中的东西?还有别的吗?

搜索这些东西会有很多例子,但没有一个对我有用。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您需要的基本DN是AD中的有效DN。你如何找到基础DN?那么你需要查看rootDSE,看看namingContexts属性的含义。

如果你有一个带有ldapsearch的Unix盒子,你可以做一个 ldapsearch -x -h mydomain.com -p3268 | less以查看namingContexts值是什么。

默认情况下,AD通常有4 namingContexts个值。 (没有AD盒进行快速测试)。许多GUI LDAP工具可以让您连接并查看rootDSE,或者使用GUI方式查看它。

答案 1 :(得分:0)

有一点需要注意的是,如果基本DN似乎不起作用且您确定所有内容,请尝试使用2003格式的用户名:user @ domain而不是DN。似乎存在一个问题,即从2003控制器迁移到2008控制器的域可能会出现使用PHP LDAP功能进行绑定的问题。我没有完整的细节,因为我仍在探索它,但2003格式适用于2008 R2域控制器。以下是测试中使用的示例基本函数。

# $ldapconn = a valid connection
# $username = a username in the format 'username@domain'
# #password = the password for the above user

function ad_auth($ldapconn,$username,$password){
    ldap_set_option ($ldapconn, LDAP_OPT_REFERRALS, 0);
    ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
    try {
        $ldap_bind = ldap_bind($ldapconn, $username, $password);
    } catch (Exception $e){
        # Your error code
    }
    return $ldap_bind;
}

用法:$rs = ad_auth($ldapconn,$username,$password);

如果我找出原因,我会发布它。