搜尋篩選語法

搜尋篩選可讓您定義搜尋準則,並提供更有效率且有效的搜尋。

ADSI 支援RFC2254中所定義的LDAP搜尋篩選。 這些搜尋篩選會以 Unicode 字串表示。 下表列出LDAP搜尋篩選器的一些範例。

搜尋篩選 描述
“(objectClass=*)” 所有物件。
“(&(objectCategory=person)(objectClass=user)(!(cn=andy))” 所有用戶物件,但 「andy」。
“(sn=sm*)” 所有以 「sm」 開頭的姓氏物件。
“(&(objectCategory=person)(objectClass=contact)(|(sn=Smith)(sn=Johnson))” 所有姓氏等於 「Smith」 或 「Johnson」 的聯繫人。

 

這些搜尋篩選條件會使用下列其中一種格式。

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

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

ADSI 搜尋篩選條件有兩種使用方式。 它們會形成LDAP方言的一部分,以透過OLE DB提供者提交查詢。 它們也會與 IDirectorySearch 介面搭配使用。

操作員

下表列出常用搜尋篩選運算符。

邏輯運算子 描述
= 等於
~= 大致等於
<= 語彙小於或等於
>= 語彙大於或等於
| OR
! NOT

 

除了上述運算符之外,LDAP 還會定義兩個相符的規則對象標識碼 (OID),可用來執行數值的位比較。 比對規則具有下列語法。

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

“<attribute name>” 是 屬性的 lDAPDisplayName ,“<rule OID” 是比對規則的 OID>,而 “<value>” 是用於比較的值。 請注意,此字串中不能使用空格。 “<value>” 必須是十進位數;不能是十六進位數或常數名稱,例如 ADS_GROUP_TYPE_SECURITY_ENABLED。 如需可用 Active Directory 屬性的詳細資訊,請參閱 所有屬性

下表列出LDAP所實作的相符規則 OID。

比對規則 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 如果屬性中的任何位符合值,則會找到相符專案。 此規則相當於位 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」 的成員。 您會將基底設定為使用者 DN (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 時,範圍不受限制,可以是 baseone-levelsubtree。 子樹上的某些這類查詢可能會更密集的處理器,例如追逐具有高扇出的連結;也就是說,列出用戶所屬的所有群組。 沒有效率的搜尋會記錄適當的事件記錄檔訊息,就像任何其他查詢類型一樣。

萬用字元

您也可以將通配符和條件新增至LDAP搜尋篩選器。 下列範例顯示可用來搜尋目錄的子字串。

取得所有項目:

(objectClass=*)

取得包含一般名稱中某個位置 「bob」 的專案:

(cn=*bob*)

取得名稱大於或等於 「bob」 的通用名稱專案:

(cn>='bob')

取得具有電子郵件屬性的所有使用者:

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

取得具有電子郵件屬性且姓氏等於 「smith」 的所有使用者專案:

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

以 “andy”、“steve” 或 “margaret” 開頭的通用名稱取得所有用戶專案:

(&(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>

token <attr> 是代表 AttributeType 的字串。 Token <值> 是一個字串,表示由基礎目錄服務定義其格式的 AttributeValue。

<如果值>必須包含星號 {、左括弧 (() 或右括弧 ()) 字元,則字元前面應該加上反斜杠逸出字元 (\)。

特殊字元

如果下列任何特殊字元必須以常值的形式出現在搜尋篩選中,則必須以列出的逸出序列取代它們。

ASCII 字元 逸出序列替代專案
* \2a
( \28
) \29
\ \5c
NUL \00
/ \2f

 

注意

在使用 MultiByte 字元集的情況下,如果 ADO 使用 SQL 方言進行搜尋,就必須使用上述逸出序列。

 

此外,任意二進位數據可以使用逸出序列語法來表示,方法是使用反斜杠 (\) 編碼每一個字節的二進位數據,後面接著兩個十六進位數位。 例如,篩選字串中的四位元組值0x00000004編碼為 \00\00\00\04。

LDAP 方言

SQL 方言

使用 IDirectorySearch 介面搜尋

使用 ActiveX 資料物件搜尋

使用 OLE DB 搜尋