Udostępnij przez


Składnia filtru wyszukiwania

Filtry wyszukiwania umożliwiają definiowanie kryteriów wyszukiwania i zapewnianie bardziej wydajnych i efektywnych wyszukiwań.

Interfejs ADSI obsługuje filtry wyszukiwania LDAP zdefiniowane w RFC2254. Te filtry wyszukiwania są reprezentowane przez ciągi Unicode. W poniższej tabeli wymieniono kilka przykładów filtrów wyszukiwania LDAP.

Filtr wyszukiwania Opis
"(objectClass=*)" Wszystkie obiekty.
"(&(objectCategory=person)(objectClass=user)(!( cn=andy))" Wszystkie obiekty użytkownika, ale "andy".
"(sn=sm*)" Wszystkie obiekty o nazwisku rozpoczynającym się od "sm".
"(&(objectCategory=person)(objectClass=contact)(|( sn=Smith)(sn=Johnson))" Wszystkie kontakty z nazwiskiem równym "Smith" lub "Johnson".

 

Te filtry wyszukiwania używają jednego z następujących formatów.

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

lub

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

Filtry wyszukiwania ADSI są używane na dwa sposoby. Stanowią one część dialektu LDAP do przesyłania zapytań za pośrednictwem dostawcy OLE DB. Są one również używane z interfejsem IDirectorySearch.

Operatorów

W poniższej tabeli wymieniono często używane operatory filtru wyszukiwania.

Operator logiczny Opis
= Równe
~= W przybliżeniu równe
<= Leksykograficznie mniejsze lub równe
>= Leksykograficznie większe lub równe
& I
| LUB
! NIE

 

Oprócz powyższych operatorów protokół LDAP definiuje dwa pasujące identyfikatory obiektów reguł (OID), których można użyć do przeprowadzania porównań bitowych wartości liczbowych. Reguły dopasowywania mają następującą składnię.

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

"<nazwa atrybutu>" to lDAPDisplayName atrybutu "<rule OID>" jest identyfikatorem OID dla zgodnej reguły, a wartość<>" jest wartością do porównania. Należy pamiętać, że w tym ciągu nie można używać spacji. "<wartość>" musi być liczbą dziesiętną; nie może to być liczba szesnastkowa ani stała, taka jak ADS_GROUP_TYPE_SECURITY_ENABLED. Aby uzyskać więcej informacji na temat dostępnych atrybutów usługi Active Directory, zobacz Wszystkie atrybuty.

W poniższej tabeli wymieniono zgodne identyfikatory OID reguły implementowane przez protokół LDAP.

Pasujący OID reguły Identyfikator ciągu (z Ntldap.h) Opis
1.2.840.113556.1.4.803 LDAP_MATCHING_RULE_BIT_AND Dopasowanie jest znajdowane tylko wtedy, gdy wszystkie bity z atrybutu są zgodne z wartością. Ta reguła jest równoważna bitowemu operatorowi AND.
1.2.840.113556.1.4.804 LDAP_MATCHING_RULE_BIT_OR Dopasowanie zostanie znalezione, jeśli jakiekolwiek bity z atrybutu są zgodne z wartością. Ta reguła jest równoważna bitowemu operatorowi OR.
1.2.840.113556.1.4.1941 LDAP_MATCHING_RULE_IN_CHAIN Ta reguła jest ograniczona do filtrów, które mają zastosowanie do dn. Jest to specjalny operator dopasowania "rozszerzonego", który prowadzi łańcuch przodków w obiektach aż do momentu znalezienia dopasowania.

 

Poniższy przykładowy ciąg zapytania wyszukuje obiekty grupy, które mają ustawioną flagę ADS_GROUP_TYPE_SECURITY_ENABLED. Należy pamiętać, że wartość dziesiętna ADS_GROUP_TYPE_SECURITY_ENABLED (0x80000000 = 2147483648) jest używana dla wartości porównania.

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

LDAP_MATCHING_RULE_IN_CHAIN jest zgodnym identyfikatorem OID reguły, który został zaprojektowany w celu zapewnienia metody wyszukiwania przodków obiektu. Wiele aplikacji korzystających z usług AD i AD LDS zwykle współpracuje z danymi hierarchicznymi, które są uporządkowane według relacji nadrzędny-podrzędny. Wcześniej aplikacje wykonywały przejściowe rozszerzanie grupy w celu określania członkostwa w grupach, które używały zbyt dużej przepustowości sieci; aplikacje potrzebne do wykonania wielu rund, aby ustalić, czy obiekt spadł "w łańcuchu", jeśli link jest przechodzi do końca.

Przykładem takiego zapytania jest sprawdzenie, czy użytkownik "user1" jest członkiem grupy "group1". Należy ustawić bazę na (cn=user1, cn=users, dc=x) DN użytkownika i zakres na base, a następnie użyć następującego zapytania.

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

Podobnie, aby znaleźć wszystkie grupy, które "user1" jest członkiem, ustaw bazę na grupę identyfikator DN kontenera; na przykład (OU=groupsOU, dc=x) i zakres do subtreei użyj następującego filtru.

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

Należy pamiętać, że w przypadku korzystania z LDAP_MATCHING_RULE_IN_CHAINzakres nie jest ograniczony — może to być base, one-levellub subtree. Niektóre takie zapytania dotyczące poddrzew mogą być bardziej intensywnie obciążające procesory, takie jak pościgowanie linków z wysokim wentylatorem; oznacza to wyświetlenie listy wszystkich grup, których członkiem jest użytkownik. Nieefektywne wyszukiwania będą rejestrować odpowiednie komunikaty dziennika zdarzeń, podobnie jak w przypadku dowolnego innego typu zapytania.

Symbole wieloznaczne

Możesz również dodać symbole wieloznaczne i warunki do filtru wyszukiwania LDAP. W poniższych przykładach pokazano podciągy, których można użyć do przeszukiwania katalogu.

Pobierz wszystkie wpisy:

(objectClass=*)

Pobierz wpisy zawierające ciąg "bob" gdzieś w nazwie pospolitej:

(cn=*bob*)

Pobierz wpisy o nazwie pospolitej większej lub równej "bob":

(cn>='bob')

Pobierz wszystkich użytkowników z atrybutem poczty e-mail:

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

Pobierz wszystkie wpisy użytkownika z atrybutem e-mail i nazwiskiem równym "smith":

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

Pobierz wszystkie wpisy użytkownika o nazwie pospolitej rozpoczynającej się od "andy", "steve" lub "margaret":

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

Pobierz wszystkie wpisy bez atrybutu wiadomości e-mail:

(!(email=*))

Formalna definicja filtru wyszukiwania jest następująca (z 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>

Token <attr> jest ciągiem reprezentującym atrybut AttributeType. Wartość tokenu <> jest ciągiem reprezentującym wartość AttributeValue, której format jest zdefiniowany przez podstawową usługę katalogową.

Jeśli wartość <> musi zawierać gwiazdkę (*), lewy nawias (() lub prawy nawias ()), znak powinien być poprzedzony znakiem ucieczki ukośnika odwrotnego (\).

Znaki specjalne

Jeśli którykolwiek z następujących znaków specjalnych musi pojawić się w filtrze wyszukiwania jako literały, muszą zostać zastąpione przez wymienioną sekwencję ucieczki.

Znak ASCII Zamiana sekwencji ucieczki
* \2a
( \28
) \29
\ \5c
NUL \00
/ \2f

 

Nuta

W przypadkach, gdy jest używany zestaw znaków wielobajtowych, sekwencje ucieczki wymienione powyżej muszą być używane, jeśli wyszukiwanie jest wykonywane przez ADO z dialektem SQL.

 

Ponadto dowolne dane binarne mogą być reprezentowane przy użyciu składni sekwencji ucieczki przez kodowanie każdego bajtu danych binarnych z ukośnikiem odwrotnym (\), a następnie dwie cyfry szesnastkowe. Na przykład wartość czterech bajtów 0x00000004 jest zakodowana jako \00\00\00\00\04 w ciągu filtru.

dialektu LDAP

dialektu SQL

wyszukiwanie za pomocą interfejsu IDirectorySearch

wyszukiwanie za pomocą obiektów danych ActiveX

wyszukiwanie za pomocą OLE DB