该环境是一个运行带有 Apache 2.2 和 PHP 5.3.19 的带有 SP1 的 Win Server 2008 R2 Standard 的单台服务器。
我有一个 PHP 脚本,它尝试将 LDAP 绑定到 Win Server 2008 R2 Active Directory 并且无论我尝试什么变体都失败了。我放了很多回声来查看每一步的结果,我发现 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 将这些值与什么进行比较?活动目录中的东西?注册表中的东西?还有什么?
搜索这些东西会发现很多例子,但没有一个对我有用。有任何想法吗?