You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LDAP筛选问题:无法正确获取非计算机且未禁用的用户

搞定LDAP筛选非计算机且未禁用用户的问题

嘿,我看了你的代码,发现筛选器里有个容易踩的坑,这大概率是你遇到困难的原因!

首先,你写的&是HTML实体转义后的字符,但LDAP筛选器需要直接用&作为逻辑与的操作符,服务器根本认不出&是什么,所以这会导致筛选条件失效。另外,你的属性数组里重复了displayName,虽然不影响功能,但可以顺手优化掉。

修正后的完整代码

// 把HTML实体&换成LDAP能识别的&
$filter = "(&(objectClass=user)(!(objectClass=computer))(!(userAccountControl:1.2.840.113556.1.4.803:=2)))";
// 移除重复的displayName,让数组更干净
$attr = array("displayName", "samaccountname", "thumbnailPhoto", "mail", "IPPhone","employeeid");
$result = ldap_search($link, $ldap_dn, $filter, $attr);
$entries_full = ldap_get_entries($link, $result);

给你拆解下筛选器的逻辑

  • (objectClass=user):匹配所有属于用户类的对象(注意哦,AD里计算机对象也继承自user类,所以这一步会把计算机也包含进来)
  • !(objectClass=computer):专门排除计算机对象,确保只拿到真正的用户
  • !(userAccountControl:1.2.840.113556.1.4.803:=2):这个按位匹配规则是对的!它会检查userAccountControl属性的第2位(禁用标志),加上!就表示排除被禁用的用户,只保留活跃账号

额外给你个更精准的小技巧

如果是在Active Directory环境里,用objectCategory来区分用户和计算机更靠谱,因为它是单值属性,不会有继承混淆的问题。你可以把筛选器改成这样:

$filter = "(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))";

objectCategory=person直接锁定了用户对象,不用再额外排除计算机,逻辑更清晰,结果也更准确。

内容的提问来源于stack exchange,提问作者Michel Ayres

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:18:43