Синтаксис фильтра поиска
Фильтры поиска позволяют определять критерии поиска и предоставлять более эффективные и эффективные поисковые запросы.
ADSI поддерживает фильтры поиска LDAP, как определено в RFC2254. Эти фильтры поиска представлены строками Юникода. В следующей таблице перечислены некоторые примеры фильтров поиска LDAP.
Фильтр поиска | Описание |
---|---|
"(objectClass=*)" | Все объекты. |
"(&(objectCategory=person)(objectClass=user)(!( cn=andy))" | Все объекты пользователя, но "энди". |
"(sn=sm*)" | Все объекты с фамилией, начинающейся с "sm". |
"(&(objectCategory=person)(objectClass=contact)(|( sn=Smith)(sn=Джонсон))" | Все контакты с фамилией, равной "Смит" или "Джонсон". |
Эти фильтры поиска используют один из следующих форматов.
<filter>=(<attribute><operator><value>)
или
<filter>=(<operator><filter1><filter2>)
Фильтры поиска ADSI используются двумя способами. Они образуют часть диалекта LDAP для отправки запросов через поставщика OLE DB. Они также используются с интерфейсом IDirectorySearch.
Операторов
В следующей таблице перечислены часто используемые операторы фильтра поиска.
Логический оператор | Описание |
---|---|
= | Равно |
~= | Приблизительно равно |
<= | Лексографически меньше или равно |
>= | Лексографически больше или равно |
& | И |
| | ИЛИ |
! | НЕ |
Помимо описанных выше операторов LDAP определяет два идентификатора объекта правила сопоставления (OID), которые можно использовать для побитового сравнения числовых значений. Правила сопоставления имеют следующий синтаксис.
<attribute name>:<matching rule OID>:=<value>
"<имя атрибута>" является lDAPDisplayName атрибута, "<правило OID>" является OID для соответствующего правила, а "<значение>" — это значение, используемое для сравнения. Помните, что пробелы нельзя использовать в этой строке. "<значение>" должно быть десятичным числом; не может быть шестнадцатеричным числом или константным именем, например ADS_GROUP_TYPE_SECURITY_ENABLED. Дополнительные сведения о доступных атрибутах Active Directory см. в всех атрибутов.
В следующей таблице перечислены соответствующие правила OID, реализованные LDAP.
Сопоставление правила OID | Строковый идентификатор (из Ntldap.h) | Описание |
---|---|---|
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 | Совпадение обнаруживается, если биты из атрибута соответствуют значению. Это правило эквивалентно побитовой или оператору. |
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 — это соответствующий идентификатор правила, предназначенный для предоставления метода для поиска происхождения объекта. Многие приложения, использующие AD и AD LDS, обычно работают с иерархическими данными, которые упорядочивается отношениями родительского-дочернего элемента. Ранее приложения выполняли транзитивное расширение группы для определения членства в группах, которые использовали слишком много пропускной способности сети; приложения, необходимые для выполнения нескольких циклов, чтобы выяснить, упал ли объект "в цепочке", если ссылка проходит через конец.
Пример такого запроса предназначен для проверки того, является ли пользователь "user1" членом группы "group1". Вы задали бы базовое значение (cn=user1, cn=users, dc=x)
пользователя DN и области 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 в строке фильтра.
Связанные разделы
-
поиск с помощью OLE DB