LDAP/AD过滤器 - "objectclass不等于"不起作用

sha*_*yyx 9 php ldap active-directory ldap-query

我正在使用LDAP Active Directory并尝试列出所有用户.我有这个完美的过滤器:

(&(objectclass=user)(|(memberOf=...)(memberOf=...)...)(|(userprincipalname=...)(displayname=...)))
Run Code Online (Sandbox Code Playgroud)

不幸的是,我们还有AD中的计算机单元和其他设备与对象类"用户",所以使用以前的过滤器,我得到了所有用户,计算机,设备,房间等.

这些计算机和设备还有一个对象类"计算机",因此我需要使用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=...)))
Run Code Online (Sandbox Code Playgroud)

(真实用户没有对象类"计算机").

我正在使用PHP ldap实现,所以使用ldap_search()方法.

"不等于"语法在此处找到:http://technet.microsoft.com/en-us/library/aa996205%28EXCHG.65%29.aspx或此处:http://msdn.microsoft.com/ EN-US /库/ aa746475%28V = vs.85%29.aspx

也许我可以尝试过滤DN中的用户(!CN = Computers),但首先我想过滤(!objectclass = computer),因为它对我来说更合乎逻辑.

objectclass!="computer"表达式的正确语法是什么?

use*_*421 20

与您提供的第一个链接相反,(!objectclass=computer)它不是有效的过滤器表达式.它应该是(!(objectclass=computer)).请参阅RFC 2254:

filter :: ="("filtercomp")"

不是:: ="!" 过滤

所以你的过滤器应该是

(&(!(objectclass=computer))(objectclass=user)(|(memberOf=...)(memberOf=...)...)(|(userprincipalname=...)(displayname=...)))
Run Code Online (Sandbox Code Playgroud)


dea*_*bry 5

如果您想吸引所有用户,则可以执行以下操作:

(&
   (objectclass=user)
   (!(objectClass=computer))
)
Run Code Online (Sandbox Code Playgroud)

看来您正在尝试获取属于特定组成员且具有指定主体名称的用户(对吗?)。如果是这样,您可以执行以下操作:

(&
    (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)
    )
)
Run Code Online (Sandbox Code Playgroud)

这些都对我有效(您可能需要在PHP代码中删除空格)