我是 LDAP 新手,我正在尝试使用 PHP Web 应用程序来与我公司的 Active Directory 服务器通信。
我有以下代码:
$ldap_server = 'ldap://server.domain.local';
$ldap_domain = '@domain.local';
$ldapport = 389;
$ldap_admin_user = "admin_user";
$ldap_admin_password = 'admin_password';
try {
$ldapconn = ldap_connect($ldap_server);
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
$bind = ldap_bind($ldapconn, $ldap_admin_user.$ldap_domain, $ldap_admin_password);
if ($bind) {
$arr = array('cn', 'sAMAccountName');
$ldapsearch = (object)[];
$ldapsearch = ldap_search(
$ldapconn,
'OU=Users,DC=domain,DC=local',
"(objectClass=person)",
$arr
) or die ("Error trying to bind: ".ldap_error($ldapconn));
var_dump ($ldapsearch);
//$entries = ldap_get_entries($ldap, $ldapsearch);
}
else {
echo "SyncError: LDAP bind failed"
}
} catch (\Exception $e) {
echo "SyncError: LDAP connection failed"
}
我得到以下结果:
object(LDAP\Result)#24 (0) { }
但是,如果我在同一台计算机上使用相同的凭据、协议和完全相同的过滤字符串的 LDAP 浏览器 (JXplorer),那么我可以看到结果的层次结构。我不知道为什么 PHP 不抓取这些条目。如果有帮助的话,我正在使用 PHP 8.3.9。这也在 Windows 机器上。
我尝试更改过滤字符串。尝试使用不同的管理员用户进行绑定。在 ldap_connect.conf 中显式声明端口。没有变化。
如果我将我的用户嵌套在另外两个 OU 下也会有影响吗? 例如:我的基本 DN 是当前 OU=Users,DC=domain,DC=Local。但是,如果 OU=Users 内还有两个 OU(OU=Group1 和 OU=Group2),并且我的用户位于这 2 个组中,该怎么办?
我现在无法测试,但我怀疑
var_dump
无法按照您期望的方式在 LDAP\Result
对象上工作。 ldap_search
页面上的示例显示您需要对结果调用
ldap_get_entries
,该结果已在代码中,但已注释掉:
$entries = ldap_get_entries($ldap, $ldapsearch);
此时,
var_dump($entries)
可能会起作用,但您也可以执行echo $entries["count"]
来获取结果数量。