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
相关产品推荐
相关产品推荐

