Фильтр LDAP / AD - «объектный класс не равен» не работает - PullRequest
9 голосов
/ 10 марта 2011

Я работаю с 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/en-us/library/aa746475%28v=vs.85%29.aspx

Может бытьЯ мог бы попытаться отфильтровать пользователей, где (! CN = Computers) в DN, но сначала я бы хотел отфильтровать (! Objectclass = computer), так как это более логично для меня.

Какой правильный синтаксис для objectclass! = "Компьютер" выражение?

Ответы [ 2 ]

20 голосов
/ 11 марта 2011

В отличие от указанной вами первой ссылки , (!objectclass=computer) не является допустимым выражением фильтра. Это должно быть (!(objectclass=computer)). См. RFC 2254:

filter :: = "(" filtercomp ")"

not :: = "!" фильтр

Итак, ваш фильтр должен быть

(&(!(objectclass=computer))(objectclass=user)(|(memberOf=...)(memberOf=...)...)(|(userprincipalname=...)(displayname=...)))
5 голосов
/ 10 марта 2011

Если вы пытаетесь получить всех пользователей, вы можете просто сделать это:

(&
   (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-коде)

...