环境是运行带有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中的东西?注册表中的东西?还有别的吗?
搜索这些东西会有很多例子,但没有一个对我有用。有什么想法吗?
答案 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);
如果我找出原因,我会发布它。