Синтаксис фильтра поиска

Фильтры поиска позволяют определять критерии поиска и предоставлять более эффективные и эффективные поисковые запросы.

ADSI поддерживает фильтры поиска LDAP, как определено в RFC2254. Эти фильтры поиска представлены строками Юникода. В следующей таблице перечислены некоторые примеры фильтров поиска LDAP.

Фильтр поиска Description
"(objectClass=*)" Все объекты.
"(&(objectCategory=person)(objectClass=user)(!( cn=andy))" Все объекты пользователя, но "энди".
"(sn=sm*)" Все объекты с фамилией, начинающейся с "sm".
"(&(objectCategory=person)(objectClass=contact)(|( sn=Smith)(sn=Джонсон))" Все контакты с фамилией, равной "Смит" или "Джонсон".

 

Эти фильтры поиска используют один из следующих форматов.

<filter>=(<attribute><operator><value>)

or

<filter>=(<operator><filter1><filter2>)

Фильтры поиска ADSI используются двумя способами. Они образуют часть диалекта LDAP для отправки запросов через поставщика OLE DB. Они также используются с интерфейсом IDirectorySearch .

Операторы

В следующей таблице перечислены часто используемые операторы фильтра поиска.

Логический оператор Description
= Равно
~= Приблизительно равно
<= Лексографически меньше или равно
>= Лексографически больше или равно
И И
| ИЛИ
! Логическое НЕ

 

Помимо описанных выше операторов LDAP определяет два идентификатора объекта правила сопоставления (OID), которые можно использовать для побитового сравнения числовых значений. Правила сопоставления имеют следующий синтаксис.

<attribute name>:<matching rule OID>:=<value>

"<имя> атрибута" — это lDAPDisplayName атрибута, "<правило OID" является идентификатором OID> для правила сопоставления, а<> значением является значение, используемое для сравнения. Помните, что пробелы нельзя использовать в этой строке. >Значение< должно быть десятичным числом; оно не может быть шестнадцатеричным числом или константным именем, например ADS_GROUP_TYPE_SECURITY_ENABLED. Дополнительные сведения о доступных атрибутах Active Directory см. в разделе "Все атрибуты".

В следующей таблице перечислены соответствующие правила OID, реализованные LDAP.

Сопоставление правила OID Строковый идентификатор (из Ntldap.h) Description
1.2.840.113556.1.4.803 LDAP_MATCHING_RULE_BIT_AND Совпадение найдено только в том случае, если все биты из атрибута соответствуют значению. Это правило эквивалентно битовой оператору AND .
1.2.840.113556.1.4.804 LDAP_MATCHING_RULE_BIT_OR Совпадение обнаруживается, если биты из атрибута соответствуют значению. Это правило эквивалентно побитовой оператору OR .
1.2.840.113556.1.4.1941 LDAP_MATCHING_RULE_IN_CHAIN Это правило ограничено фильтрами, применяемыми к DN. Это специальный оператор расширенного сопоставления, который проходит цепочку происхождения в объектах вплоть до корня до тех пор, пока он не найдет совпадение.

 

В следующем примере строка запроса ищет объекты группы с набором флагов ADS_GROUP_TYPE_SECURITY_ENABLED . Помните, что десятичное значение ADS_GROUP_TYPE_SECURITY_ENABLED (0x80000000 = 2147483648) используется для значения сравнения.

(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=2147483648))

LDAP_MATCHING_RULE_IN_CHAIN — это соответствующий OID правила, который предназначен для предоставления метода для поиска происхождения объекта. Многие приложения, использующие AD и AD LDS, обычно работают с иерархическими данными, которые упорядочивается отношениями родительского-дочернего элемента. Ранее приложения выполняли транзитивное расширение группы для определения членства в группах, которые использовали слишком много пропускной способности сети; приложения, необходимые для выполнения нескольких циклов, чтобы выяснить, упал ли объект "в цепочке", если ссылка проходит через конец.

Пример такого запроса предназначен для проверка, если пользователь "user1" является членом группы "group1". Для имени пользователя и (cn=user1, cn=users, dc=x) область baseнеобходимо задать базовое имя пользователя и использовать следующий запрос.

(memberof:1.2.840.113556.1.4.1941:=cn=Group1,OU=groupsOU,DC=x)

Аналогичным образом, чтобы найти все группы, в которые "user1" входит пользователь, задайте для базы имя DN контейнера групп; например(OU=groupsOU, dc=x), область subtreeи используйте следующий фильтр.

(member:1.2.840.113556.1.4.1941:=cn=user1,cn=users,DC=x)

Обратите внимание, что при использовании LDAP_MATCHING_RULE_IN_CHAIN область не ограничено — это может быть base, one-levelили subtree. Некоторые такие запросы на поддерев могут быть более интенсивными для процессора, например гонять ссылки с высоким вентилятором; То есть перечисление всех групп, в которые входит пользователь. Неэффективные поисковые запросы регистрируют соответствующие сообщения журнала событий, как и любой другой тип запроса.

Подстановочные знаки

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

Получение всех записей:

(objectClass=*)

Получите записи, содержащие "bob" где-то в общем имени:

(cn=*bob*)

Получение записей с общим именем, превышающим или равным "bob":

(cn>='bob')

Получите всех пользователей с атрибутом электронной почты:

(&(objectClass=user)(email=*))

Получение всех записей пользователей с атрибутом электронной почты и фамилией, равной "смит":

(&(sn=smith)(objectClass=user)(email=*))

Получите все записи пользователя с общим именем, начинающимся с "энди", "стив" или "маргарет":

(&(objectClass=user)(| (cn=andy*)(cn=steve*)(cn=margaret*)))

Получение всех записей без атрибута электронной почты:

(!(email=*))

Формальное определение фильтра поиска выглядит следующим образом (из RFC 2254):

<filter> ::= '(' <filtercomp> ')'
<filtercomp> ::= <and> | <or> | <not> | <item>
<and> ::= '&' <filterlist>
<or> ::= '|' <filterlist>
<not> ::= '!' <filter>
<filterlist> ::= <filter> | <filter> <filterlist>
<item>::= <simple> | <present> | <substring>
<simple> ::= <attr> <filtertype> <value>
<filtertype> ::= <equal> | <approx> | <ge> | <le>
<equal> ::= '='
<approx> ::= '~='
<ge> ::= '>='
<le> ::= '<='
<present> ::= <attr> '=*'
<substring> ::= <attr> '=' <initial> <any> <final>
<initial> ::= NULL | <value><any> ::= '*' <starval>
<starval> ::= NULL | <value>'*' <starval>
<final> ::= NULL | <value>

Маркер <attr> — это строка, представляющая АтрибутТип. Значение> токена <— это строка, представляющая AttributeValue, формат которого определяется базовой службой каталогов.

<Если значение> должно содержать звездочку (*), левую скобку (() или правый скобки ()), то перед символом обратной косой черты (\).

Специальные символы

Если любой из следующих специальных символов должен отображаться в фильтре поиска как литералы, они должны быть заменены указанной escape-последовательностью.

Символ ASCII Замена escape-последовательности
* \2a
( \28
) \29
\ \5c
NUL \00
/ \2f

 

Примечание.

В случаях, когда используется набор символов MultiByte, escape-последовательности, перечисленные выше, должны использоваться, если поиск выполняется ADO с диалектом SQL.

 

Кроме того, произвольные двоичные данные могут быть представлены с помощью синтаксиса escape-последовательности путем кодирования каждого байта двоичных данных с обратной косой чертой (\) и двумя шестнадцатеричными цифрами. Например, четырехбайтовое значение 0x00000004 закодировано как \00\00\00\04 в строке фильтра.

Диалект LDAP

Диалект SQL

Поиск с помощью интерфейса IDirectorySearch

Поиск с помощью объектов данных ActiveX

Поиск с помощью OLE DB