我正在使用LDAP Active Directory并尝试列出所有用户。我有这个完美的过滤器:
(&(objectclass=user)(|(memberOf=...)(memberOf=...)...)(|(userprincipalname=...)(displayname=...)))
不幸的是,我们在AD中还有一个计算机单元和其他设备,其中包含对象类“user”,因此,通过以前的过滤器,我获得了所有用户,计算机,设备,房间等。
这些计算机和设备还有一个对象类“计算机”,因此我需要使用objectclass!=“computer”扩展过滤器,以便仅列出真实用户。到目前为止,我尝试过这些过滤器,它们都没有工作(没有数据返回!):
(&(objectclass=user)(!objectclass=computer)(|(memberOf=...)(memberOf=...)...)(|(userprincipalname=...)(displayname=...)))
(&(objectclass=user)(!(objectclass=computer))(|(memberOf=...)(memberOf=...)...)(|(userprincipalname=...)(displayname=...)))
(!(objectclass=computer))(&(objectclass=user)(|(memberOf=...)(memberOf=...)...)(|(userprincipalname=...)(displayname=...)))
(!objectclass=computer)(&(objectclass=user)(|(memberOf=...)(memberOf=...)...)(|(userprincipalname=...)(displayname=...)))
(真实用户没有对象类“计算机”)。
我正在使用PHP ldap实现,因此使用ldap_search()
方法。
找到了“不等于”的语法,例如在这里:http://technet.microsoft.com/en-us/library/aa996205%28EXCHG.65%29.aspx或此处:http://msdn.microsoft.com/en-us/library/aa746475%28v=vs.85%29.aspx
也许我可以尝试过滤DN中的用户(!CN = Computers),但首先我想过滤(!objectclass = computer),因为这对我来说更合乎逻辑。
objectclass!=“computer”表达式的正确语法是什么?
答案 0 :(得分:20)
与您提供的first link相反,(!objectclass=computer)
不是有效的过滤器表达式。它应该是(!(objectclass=computer))
。请参阅RFC 2254:
filter :: =“(”filtercomp“)”
not :: =“!”过滤
所以你的过滤器应该是
(&(!(objectclass=computer))(objectclass=user)(|(memberOf=...)(memberOf=...)...)(|(userprincipalname=...)(displayname=...)))
答案 1 :(得分:4)
如果您想要所有用户,您可以这样做:
(&
(objectclass=user)
(!(objectClass=computer))
)
看起来您正在尝试获取属于特定组成员且具有指定主席名的用户(对吗?)。如果是这样,你可以这样做:
(&
(objectclass=user)
(!(objectClass=computer))
(|
(userPrincipalName=username@domain.com)
(displayName=John Doe)
)
(|
(memberOf=CN\=group1,CN\=Groups,DC\=domain,DC\=com)
(memberOf=CN\=group2,CN\=Groups,DC\=domain,DC\=com)
)
)
这些工作在我的最后(您可能需要删除PHP代码中的空格)