Заметки о Windows и других программных продуктах Microsoft...

LDAP-фильтры для поиска объектов в Active Directory. Часть 1

LDAP-фильтры для поиска объектов в Active Directory. Часть 1

Есть много способов найти что либо в Active Directory, но одним из самых эффективных является использование LDAP-фильтров. Они универсальны и их  можно использовать как в командной строке, так и из графической оснастки.

Текстовая форма поисковых LDAP-фильтров определена в RFC 4515. Синтаксис LDAP-фильтра имеет вид:

<Фильтр>=(<Атрибут><оператор сравнения><значение>)

В фильтре могут использоваться следующие операторы сравнения.

 

Оператор Значение
= Равно
>= Больше или равно
<= Меньше или равно
~= Приблизительно равно

 

Например, следующий фильтр возвращает все объекты, у которых значение атрибута cn (common name) равно Vasya:

(cn=Vasya)

Для проверки воспользуемся командлетом Get-ADObject с параметром LdapFilter:

Get-ADObject -LdapFilter "(cn=Vasya)"

простой LDAP-запрос

 

Кстати, вместо имени атрибута можно использовать его идентификатор (Attribute-Id). Например атрибут cn имеет Id 2.5.4.3, соответственно предыдущий фильтр можно изменить следующим образом:

(2.5.4.3=Vasya)

использование ID атрибута

 

Примечание. Список атрибутов AD с описанием можно найти здесь https://docs.microsoft.com/en-us/windows/win32/adschema/attributes-all.

 

При наличии нескольких условий поиска фильтры можно комбинировать с помощью логических операторов.

 

Оператор Значение
& (И) Все условия должны быть выполнены
| (ИЛИ) Любое количество условий может быть соблюдено
! (НЕ) Условие не должно быть выполнено

 

В этом случае синтаксис фильтра будет таким:

(<Оператор><Фильтр1><Фильтр2>)

Для примера отберем объекты с cn равным Vasya и sn (surname) равным Pupkin:

(&(cn=Vasya)(sn=Pupkin))

комбинирование условий

 

Немного изменим задачу и отберем все объекты, у которых или cn равно Vasya или sn равно Pupkin:

(|(cn=Vasya)(sn=Pupkin))

условие ИЛИ

 

Можно использовать сразу несколько логических операторов в одном фильтре, главное не запутаться в скобках. Составим фильтр, который выдаст объекты с cn равно Vasya или sn равно Pupkin, у которых cn не равен Fedor:

(&(|(cn=Vasya)(sn=Pupkin)(!(cn=Fedor)))

несколько логических операторов в одном фильтре

Фильтр по атрибутам objectClass и objectCategory

Как видно из примера, фильтр возвращает нам как объекты пользователей, так и компьютеров. Уточнить параметры поиска можно с помощью атрибутов objectCategory и objectClass. Оба этих атрибута позволяют задать тип (класс) искомого объекта, однако между ними есть существенное отличие. Атрибут objectClass может принимать несколько значений, тогда как objectCategory имеет только одно значение, поэтому фильтры с использованием objectCategory  точнее. Для большей эффективности поиска можно использовать оба этих атрибута. Возможны следующие комбинации.

 

 objectCategory objectClass  Результат
person user Пользователи
person Пользователи и контакты
person contact Контакты
user Пользователи и компьютеры
computer Компьютеры
user Пользователи и контакты
contact Контакты
computer Компьютеры
person Пользователи, компьютеры и контакты
contact Пользователи и контакты
group Группы
group Группы
person organizationalPerson Пользователи и контакты
organizationalPerson Пользователи, компьютеры и контакты
organizationalPerson Пользователи и контакты

 

С помощью следующего фильтра отберем всех пользователей с именем Vasya:

(&(objectClass=user)(objectCategory=person)(cn=Vasya))

фильтр для пользователей

Символы подстановки

При составлении LDAP-фильтра можно пользоваться знаками подстановки (wildcards). Если точнее, то поддерживается всего один подстановочный символ * (звездочка), который может заменять любое количество символов. Так следующий фильтр найдет всех пользователей, у которых имя начинается с буквы V:

(&(objectClass=user)(objectCategory=person)(cn=V*))

подстановочные символы (wildcards)

 

Подстановочные символы очень удобно использовать для проверки наличия значения заданного атрибута. Для примера найдем всех пользователей, у которых заполнен атрибут mail:

(&(objectClass=user)(objectCategory=person)(mail=*))

проверка наличия атрибута

 

В некоторых случаях вместо подстановочных символов можно использовать операторы сравнения >= и <=. Например с помощью такого фильтра выведем тех пользователей, у которых имя начинается с буквы V и далее по алфавиту (т.е. V,W,X,Y,Z):

(&(objectClass=user)(objectCategory=person)(cn>=V))

неточное соответствие

Спец символы

При использовании в LDAP-фильтрах следующих спец. символов они описываются в шестнадцатеричном представлении.

 

Символ Представление
* \2A
& \26
( \28
) \29
< \3C
> \3e
= \3d
~ \7e
\ \5c
/ \2f
| \7c
Nul \00

 

Другими словами, если вы хотите использовать эти символы как обычные текст, то их необходимо заменить на соответствующие коды. Например, ищем группу с экзотическим именем Users*):

(&(objectCategory=group)(cn=Users\2A\29))

Примечание. Закрытые круглые скобки в значении атрибута не требуют использования hex-кодов. К примеру фильтр (cn=Us(e)rs)) является вполне корректным.

спец символы

 

Для начала хватит. А в следующей статье мы копнем поглубже и рассмотрим расширенные фильтры поиска.

 
 
Комментарии

Пока нет комментариев.