搜尋篩選語法
搜尋篩選可讓您定義搜尋準則,並提供更有效率且有效的搜尋。
ADSI 支援 RFC2254 中所定義的 LDAP 搜尋篩選。 這些搜尋篩選準則是由 Unicode 字串表示。 下表列出 LDAP 搜尋篩選準則的一些範例。
| 搜尋篩選 | 描述 |
|---|---|
| 「 (objectClass=*) 」 | 所有物件。 |
| 「 ( (& objectCategory=person) (objectClass=user) (! (cn=andy) ) ) 」 | 所有使用者物件,但 「andy」。 |
| 「 (sn=sm*) 」 | 所有具有開頭為 「sm」 之姓氏的物件。 |
| 「 (& (objectCategory=person) (objectClass=contact) (| (sn=Smith) (sn=Smith) ) ) 」 | 所有姓氏等於 「Smith」 或 「Smith」 的連絡人。 |
這些搜尋篩選準則使用下列其中一種格式。
<filter>=(<attribute><operator><value>)
或
(<operator><filter1><filter2>)
ADSI 搜尋篩選準則會以兩種方式使用。 他們會形成 LDAP 方言的一部分,以便透過 OLE DB 提供者提交查詢。 它們也會與 IDirectorySearch 介面搭配使用。
運算子
下表列出常用的搜尋篩選運算子。
| 邏輯運算子 | 描述 |
|---|---|
| = | 等於 |
| ~= | 大約等於 |
| <= | 語彙小於或等於 |
| >= | 語彙大於或等於 |
| & | AND |
| | | 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時,範圍不受限—可以是 base 、 one-level 或 subtree 。 子樹上的某些這類查詢可能會耗用更多處理器,例如搜尋具有高展開連結的連結;也就是說,列出使用者所屬的所有群組。 沒有效率的搜尋會記錄適當的事件記錄檔訊息,如同任何其他類型的查詢一樣。
萬用字元
您也可以將萬用字元和條件新增至 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 < 值 > 是一個字串,代表屬性值,其格式是由基礎目錄服務所定義。
<如果值 > 必須包含星號 (*) 、左括弧 ( () 或右括弧 () ) 字元,則字元前面應該有反斜線逸出字元 (\) 。
特殊字元
如果下列任何特殊字元必須以常值的形式出現在搜尋篩選中,則必須以列出的逸出序列取代它們。
| ASCII 字元 | 逸出序列替代專案 |
|---|---|
| * | \2a |
| ( | \28 |
| ) | \29 |
| \ | \5c |
| NUL | \00 |
| / | \2f |
注意
在使用 MultiByte 字元集的情況下,如果搜尋是由具有SQL方言的 ADO 執行,則必須使用上述逸出序列。
此外,任意二進位資料可以使用逸出序列語法來表示,方法是使用反斜線 (\) 編碼每個位元組的二進位資料,後面接著兩個十六進位數位。 例如,篩選字串中的四位元組值0x00000004編碼為 \00\00\00\04。
相關主題