検索フィルター構文

検索フィルターを使用すると、検索条件を定義し、より効率的で効果的な検索を行うことができます。

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検索フィルターは2つの方法で使用されます。 これらは、OLE DBプロバイダーを介してクエリを送信するためのLDAP言語の一部を形成します。 IDirectorySearchインターフェイスでも使用されます。

演算子

次の表に、頻繁に使用される検索フィルター演算子を示します。

論理演算子 説明
= 等しい
~= ほぼ等しいです
<= 辞書式で以下
>= 辞書式以上
& かつ
| OR
! NOT

 

上記の演算子に加えて、LDAPでは、数値のビットごとの比較を実行するために使用できる2つの一致規則オブジェクト識別子 (OID) が定義されています。 一致規則の構文は次のとおりです。

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

"<attribute name>"は属性のlDAPDisplayName、"<rule OID>"は一致規則のOID、"<value>"は比較に使用する値です。 この文字列ではスペースを使用できないことに注意してください。"。 <value>は10進数である必要があります。16進数や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の10進値 (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, or subtree。 サブツリーに対するこのようなクエリの中には、高いファンアウトを持つリンクの追跡など、プロセッサに負荷がかかるものがあります。つまり、ユーザーがメンバーになっているすべてのグループを一覧表示します。 非効率な検索では、他の種類のクエリと同様に、適切なイベントログメッセージがログに記録されます。

ワイルドカード

LDAP検索フィルターにワイルドカードと条件を追加することもできます。 次の例は、ディレクトリの検索に使用できる部分文字列を示しています。

すべてのエントリを取得します。

(objectClass=*)

共通名のどこかに 「bob」 を含むエントリを取得します。

(cn=*bob*)

「bob」 以上の共通名を持つエントリを取得します。

(cn>='bob')

email属性を持つすべてのユーザーを取得します。

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

email属性と姓が 「smith」 に等しいすべてのユーザーエントリを取得します。

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

「andy」 、 「steve」 、または 「margaret」 で始まる共通名を持つすべてのユーザーエントリを取得します。

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

email属性を持たないすべてのエントリを取得します。

(!(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>はAttributeTypeを表す文字列です。 トークン<値>は、基になるディレクトリサービスによって形式が定義されているAttributeValueを表す文字列です。

<v値>にアスタリスク(*)、左かっこ(()、右括弧())文字を含める必要がある場合は、その文字の前にバックスラッシュエスケープ文字(\)を付ける必要があります。

特殊文字

次の特殊文字のいずれかをリテラルとして検索フィルターに表示する必要がある場合は、一覧表示されているエスケープシーケンスで置き換える必要があります。

ASCII 文字 エスケープシーケンス置換
* \2a
( \28
) \29
\ \5c
NUL (NUL) \00
/ \2f

 

Note

マルチバイト文字セットが使用されている場合、SQL言語を使用してADOで検索を実行する場合は、上記のエスケープシーケンスを使用する必要があります。

 

また、バイナリデータの各バイトを円記号(\)と2桁の16進数でエンコードすることにより、エスケープシーケンス構文を使用して任意のバイナリデータを表すこともできます。 たとえば、4バイト値0x00000004は、フィルター文字列では\00\00\00\04としてエンコードされます。

LDAP方言

SQL方言

IDirectorySearchインターフェイスを使用した検索

ActiveXデータオブジェクトを使用した検索

OLE DBを使用した検索