13

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

(&(objectclass=user)(|(memberOf=...)(memberOf=...)...)(|(userprincipalname=...)(displayname=...)))

不幸的是,我们还有一个计算机单元和其他设备存在于 AD 中,对象类为“用户”,所以使用之前的过滤器,我得到了所有用户、计算机、设备、房间等。

这些计算机和设备还有一个对象类“计算机”,因此我需要使用对象类!=“计算机”扩展过滤器,以便仅列出真实用户。到目前为止,我已经尝试了这些过滤器,但它们都不起作用(没有返回数据!):

(&(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/ zh-CN/图书馆/aa746475%28v=vs.85%29.aspx

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

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

4

2 回答 2

28

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

过滤器 ::= "(" filtercomp ")"

不是 ::= "!" 筛选

所以你的过滤器应该是

(&(!(objectclass=computer))(objectclass=user)(|(memberOf=...)(memberOf=...)...)(|(userprincipalname=...)(displayname=...)))
于 2011-03-11T08:56:34.553 回答
7

如果你想获得所有用户,你可以这样做:

(&
   (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 代码中的空格)

于 2011-03-10T17:42:53.693 回答