次の方法で共有


検索フィルターの構文

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

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 インターフェイスでも使用されます。

演算子

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

論理演算子 形容
= 等しい
~= ほぼ等しい
<= 辞書式の次の値以下
>= 辞書式的に次の値以上
& そして
| 又は
! じゃない

 

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

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

"<属性名>" は属性の lDAPDisplayName、"<rule OID>" は照合ルールの OID、"<値>" は比較に使用する値です。 この文字列ではスペースを使用できないことに注意してください。 "<値>" は 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 LDS と 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-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>

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

<値> アスタリスク (*)、左かっこ (()、または右かっこ ()) 文字を含める必要がある場合は、文字の前に円記号エスケープ文字 (\) を付ける必要があります。

特殊文字

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

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

 

手記

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

 

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

LDAP 方言

SQL 言語

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

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

OLE DB を使用した検索