Share via


Windows 検索でフィルター ハンドラーを作成するためのベスト プラクティス

Microsoft Windows Search では、フィルターを使用して、フルテキスト インデックスに含めるアイテムのコンテンツを抽出します。 コンテンツを抽出するフィルター ハンドラーと、ファイルのプロパティを抽出するプロパティ ハンドラーを記述することで、Windows Search を拡張して新しいファイルの種類または独自のファイルの種類のインデックスを作成できます。 フィルターは、ファイル名拡張子、MIME の種類、またはクラス識別子 (CLSID) によって示されるファイルの種類に関連付けられます。 1 つのフィルターで複数のファイルの種類を処理できますが、各種類は 1 つのフィルターでのみ機能します。

このトピックは、次のセクションで構成されています。

ネイティブ コード

Windows 7 以降では、マネージド コードで記述されたフィルターは明示的にブロックされます。 複数のアドインが実行されるプロセスで CLR のバージョン管理の問題が発生する可能性があるため、ネイティブ コードでフィルターを記述する必要があります。

Windows Search で使用するセキュリティで保護されたアプリケーションを作成するためのプラクティスを次に示します。

クエリ アプリケーションの場合:

  • 検索クライアントを作成するときは、ユーザーに最小限の特権を許可するセキュリティ コンテキストで実行される API を選択する必要があります。 たとえば、ASP ページでは、ユーザー プロセスとして実行される IXSSO クエリ オブジェクトを使用できます。

IFilter と言語リソースの場合:

  • ファイルの種類の新しいフィルター ハンドラーが既存のフィルター登録の代わりにインストールされている場合、インストーラーは現在の登録を保存し、新しいフィルター ハンドラーがアンインストールされた場合に復元する必要があります。 フィルターをチェーンするメカニズムはありません。 そのため、新しいフィルター ハンドラーは、古いフィルターの必要な機能をレプリケートする役割を担います。
  • Windows Search の IFilter、ワード ブレーカー、ステマーは、ローカル セキュリティ コンテキストで実行されます。 バッファーを管理し、正しくスタックするように記述する必要があります。 すべての文字列コピーには、バッファー オーバーランから保護するための明示的なチェックが必要です。 常に、バッファーの割り当てられたサイズを確認し、バッファーのサイズに対してデータのサイズをテストする必要があります。 バッファー オーバーランは、バッファー サイズの制限を適用しないコードを悪用するための一般的な手法です。
  • IFilter、ワード ブレーカー、ステマー コンポーネントは、プロセスとそのすべてのスレッドを終了する ExitProcess 関数 または同様の API を呼び出さないでください。
  • DllMain エントリ ポイントでリソースを割り当てたり解放したりしないでください。 これにより、リソース不足のストレス テスト中にエラーが発生する可能性があります。
  • すべてのオブジェクトをスレッド セーフにコーディングします。 Windows Search は、ワード ブレーカーまたはステマーのインスタンスを 1 つのスレッドで一度に 1 つずつ呼び出しますが、複数のスレッド間で同時に複数のインスタンスを呼び出す場合があります。
  • 一時ファイルの作成やレジストリへの書き込みは避けてください。
  • Microsoft Visual C++ コンパイラを使用する場合は、/GS オプションを使用してアプリケーションをコンパイルしてください。 /GS オプションは、バッファー オーバーランを検出するために使用されます。 /GS オプションは、コンパイルされたコードにセキュリティ チェックを配置します。 詳細については、プラットフォーム SDK の「Visual C++ コンパイラ オプション」セクションの 「DllGetClassObject 関数 /GS (バッファー セキュリティ チェック)」を参照してください。

その他のリソース

フィルター ハンドラーの開発

Windows Search のフィルター ハンドラーについて

フィルター ハンドラーからプロパティを返す

Windows に付属するフィルター ハンドラー

Windows Search でのフィルター ハンドラーの実装

フィルター ハンドラーの登録

フィルター ハンドラーのテスト