Event1644Reader.ps1 を使用して Windows Server での LDAP クエリのパフォーマンスを分析する

この記事では、Windows Server で Active Directory イベント ID 1644 を分析するのに役立つスクリプトについて説明します。 スクリプトを 使用する手順を 確認し、 問題を分析します

適用対象: Windows Server 2012 R2
元の KB 番号: 3060643

Event1644Reader.ps1 スクリプトについて

Active Directory イベント ID 1644 は、ディレクトリ サービス イベント ログに記録されます。 このイベントは、Active Directory ドメイン コントローラーによって処理される、コストの高い、非効率的、または低速のライトウェイト ディレクトリ アクセス プロトコル (LDAP) 検索を識別します。 NTDS General イベント ID 1644 をフィルター処理して、アクセスされた Active Directory データベース内のオブジェクトの数、返されたオブジェクトの数、またはドメイン コントローラーの LDAP 検索実行時間に基づいて、Directory Services イベント ログ内の LDAP 検索を記録できます。 イベント ID 1644 の詳細については、「 修正プログラム 2800945 Active Directory イベント ログにパフォーマンス データを追加する」を参照してください。

Event1644Reader.ps1 は、保存された Directory Service イベント ログでホストされている 1644 イベントからデータを抽出するWindows PowerShell スクリプトです。 次に、そのデータを Microsoft Excel スプレッドシートの一連のピボット テーブルにインポートして、管理者が、これらのクエリを生成しているドメイン コントローラーとクライアントによってサービスされている LDAP ワークロードに関する分析情報を得るのに役立ちます。

スクリプトを取得する方法

スクリプトは、Core Infrastructure and Security ブログの投稿 「Active Directory でコストが高く、非効率的で実行時間の長い LDAP クエリを見つける方法」から入手できます。

注:

スクリプトはブログ投稿に添付され、ファイル名 Event1644Reader.zip

スクリプト センターの免責事項
サンプル スクリプトは、Microsoft 標準サポート プログラムまたはサービスではサポートされていません。 サンプル スクリプトは現状のまま提供され、いかなる保証も伴いません。 さらに、Microsoft は、商品性、特定目的への適合性を含む一切の黙示の保証をいたしかねます。 本サンプル スクリプトおよびドキュメントの使用または性能に起因するすべてのリスクは、お客様が負うものとします。 サンプル スクリプトおよびドキュメントを使用したこと、または使用できなかったことに伴って生じるいかなる損害 (業務利益の損失、業務の中断、業務情報の損失、金銭上の損失、その他一切の損害) についても、Microsoft、Microsoft に帰属する作者、スクリプトの作成、製造、または納入に関与したその他のすべての人員は、いかなる場合も責めを負わないものとします。

オンライン ピアのサポート
オンライン ピア サポートについては、 公式スクリプティング ガイズ フォーラムに参加してください。 サンプル スクリプトでフィードバックを提供したりバグを報告したりするには、このスクリプトの [ ディスカッション ] タブで新しいディスカッションを開始します。

スクリプトの使用方法

イベント ID 1644 でキャプチャされた LDAP クエリをより適切に分析するには、次の手順に従います。

  1. トラブルシューティングを行っているドメイン コントローラーが拡張 ** 1644 イベント メタデータをキャプチャしていることを確認します。

    注:

    Windows Server 2012 R2 では、LDAP クエリとその他のメタデータの期間を記録することで、拡張 1644 イベント ログが追加されました。 拡張 1644 イベント ログは、修正プログラム 2800945によって、Windows Server 2012、Windows Server 2008 R2、および Windows Server 2008 にバックポートされました。

  2. 次の Field Engineering レジストリ エントリの値を 5 に設定します。 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics\Field Engineering

    注:

    フィールド エンジニアリング ログの詳細度を 5 に設定すると、ディレクトリ サービス イベント ログに他のイベントが記録されます。 アクティブに 1644 イベントを収集していない場合は、フィールド エンジニアリングを既定値の 0 にリセットします。 (この操作では再起動は必要ありません)。

  3. 次のレジストリ エントリが存在する場合は、値をミリ秒単位で目的のしきい値に変更します。 特定のレジストリ エントリが存在しない場合は、その名前の新しいエントリを作成し、その値を必要なしきい値 (ミリ秒単位) に設定します。

    レジストリ パス データ型 既定値
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters\Search Time Threshold (ミリ秒) DWORD 30,000
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters\Expensive Search Results Threshold DWORD 10,000
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters\Inefficient Search Results Threshold DWORD 1,000

    注:

    • フィールド エンジニアリング ログ レベルが有効になっていて、検索時間しきい値 (ミリ秒) レジストリ エントリが使用されていない場合、または 0 に設定されている場合、時間しきい値の既定値は 30,000 ミリ秒です。 (この操作では再起動は必要ありません)。
    • 1 つの方法は、非効率的な検索結果のしきい値と高価な検索結果のしきい値の両方のレジストリ設定のレジストリ値を設定し、検索時間保留 (msecs) で識別されるイベントに焦点を当てることです。 100 ミリ秒などの大きな値から開始し、環境内で発生しているクエリを最適化するときに、値を段階的に減らします。
    • Event1644Reader.ps1 は、複数のドメイン コントローラーからのイベントを解析できます。 LDAP 検索を確認するすべてのドメイン コントローラーで、フィールド エンジニアリング、検索時間、コストが高く、非効率的なレジストリ キー設定を構成します。
  4. Event1644Reader.ps1 [Core Infrastructure and Security Blog]\(コア インフラストラクチャとセキュリティ ブログの投稿\) からスクリプトを取得できます。Active Directory で、1644 イベントを含む保存された Active Directory Service EVTX ファイルを分析するコンピューターに対して 、高価で非効率的で実行時間の長い LDAP クエリを見つける方法 に関する記事からスクリプトをダウンロードします。

    このコンピューターには、Microsoft Excel 2010以降のバージョンがインストールされており、スクリプトで解析されるディレクトリ サービス イベント ログをホストするための十分なディスク領域が必要です。

  5. 1644 イベント ログを有効にしたドメイン コントローラーから、1644 イベントを含む保存された Directory Service イベント ログを 1644 分析コンピューターにコピーします。

  6. Windows エクスプローラーで、Event1644Reader.ps1 ファイルを右クリックし、[PowerShell で実行] を選択します。

    この手順のスクリーンショットを次に示します。

    Event1644Reader.ps1 ファイルを右クリックし、[PowerShell で実行] を選択します。

  7. Y キーを押して、必要に応じて PowerShell 実行ポリシーをバイパスします。

  8. 解析する EVTX ファイルのパスを指定します。

  9. 次のスクリーンショットとしてプロンプトが表示されたら、次のアクションを実行します。

    Event1644Reader.ps1 ファイルの実行に関する PowerShell コマンド。

    • Enter キーを押して、Enent1644Reader.ps1 ファイルと同じディレクトリにあるすべての EVTX ファイルを解析します。
    • 解析する drive:\path EVTX ファイルを含むパスを入力します。

    注:

    Event1644Reader.ps1 は、スクリプトが実行されるたびにターゲット パスに配置されているすべてのアップレベル ディレクトリ サービス イベント ログ内の 1644 イベントを解析します。

  10. ワークシートを開いてデータを確認し、一連のタブを確認し、必要に応じて Excel スプレッドシートを保存します。 ワークシートのタブの詳細については、「 1644Reder.ps1によって作成された Excel スプレッドシートのチュートリアル」セクションを 参照してください。

    注:

    *.csv ツールによってビルドされたファイルは自動的に削除されません。 調査が完了したら、*.csv ファイルを消去することを検討してください。

詳細

Event1644Reader.ps1 によって作成される Excel スプレッドシートのチュートリアル

Event1644Reader.ps1 は、保存された Directory Service イベント ログ内の 1644 イベントからメタデータを抽出し、そのデータを Microsoft Excel スプレッドシート内の一連のタブ付きワークシートにインポートします。

次の表は、各タブに含まれるデータをまとめたものです。

タブ 説明
RawData イベント ID 1644 によってキャプチャされた各データ フィールドは、個別の列にインポートされます。 データ フィルター処理は自動的に有効になっており、任意の列ヘッダーを並べ替えたりフィルター処理したりできます。 PowerShell スクリプトまたは管理者が指定したディレクトリと同じディレクトリに存在する複数のドメイン コントローラーの 1644 イベント ログが存在する場合は、フィルターを使用して、特定のドメイン コントローラーを対象とする LDAP クエリを表示します。
Top_StartingNode 特定のサンプルの LDAP クエリの対象となるディレクトリ パーティションの並べ替えられた一覧を提供します。 ほとんどのクエリが 1 つのパーティション (スキーマ、構成、またはドメイン) で発生している場合は、そのパーティションを残りのピボット テーブルのフィルターとして追加することを検討してください。 ドリルスルーの詳細では、上位のフィルター (LDAP クエリなど)、それらのクエリを発行したクライアント IP、およびそれらのクエリの日付とタイム スタンプが公開されます。
Top_Callers Lists LDAP クエリを発行したクライアント IP アドレスを、総計の割合で降順で検索カウントします。 実行中の合計の割合は、上位の呼び出し元を識別するのに役立ちます。 (つまり、上位 10 人または 20 人の呼び出し元が、多すぎる呼び出しが問題であると仮定して、クエリ ボリュームの 80% を生成している可能性があります)。 ドリルスルーの詳細では、特定のサンプルでクライアントが発行した各 LDAP クエリのフィルターと日付と時刻の手順が公開されます。
Top_Filters Lists最も頻繁に発行される LDAP クエリを、降順で実行します。 これには、平均検索時間が含まれます。 ドリルスルーの詳細では、LDAP クライアントの IP アドレスと、各クエリが送信された日時が公開されます。
呼び出し元別 TotalSearchTime サンプル内のすべての LDAP クエリで、クライアント IP アドレスを合計検索時間の降順でListsします。 ドリルスルーの詳細は、LDAP クエリと、各クエリが発行された日時を識別します。
フィルターによる TotalSearchTime Lists LDAP クエリを、検索時間の降順で指定します。 ドリルスルーの詳細では、LDAP クライアントの IP アドレスと、一致する各クエリが送信された日時が公開されます。
検索時間のランク 時間ベースの四分位数で発生した LDAP クエリの数を表示します。 クエリの速度が低下すると、問題が発生します。 クエリが頻繁に発行されない場合は、より高速なクエリが適しています。 Microsoft Exchange では、Exchange サーバーによって発行された LDAP クエリを 50 ミリ秒以下で解決することを望んでいます。 そのため、最初の四分位数グループは、その時間 "バケット" に焦点を当てます。
空白ピボット これは、シナリオの特定のデータを表示するために必要に応じて変更できる空白のピボット テーブルです。

シナリオ分析

LDAP クエリが遅い場合、またはドメイン コントローラーで CPU 使用率が高い場合は、過剰に発行されたクエリ、非効率的なクエリ、これらのクエリの組み合わせ、非同期スレッド キュー (ATQ) プールの枯渇、または多くの変更通知が原因である可能性があります。

クライアントがコストの高い、非効率的、または多数の LDAP クエリを発行する場合は、Event1644Reader.ps1 を使用してドメイン コントローラー上のデータを収集し、クライアントの IP アドレスを識別します。 次に、このようなクエリを、クライアント コンピューター上のプロセス ID、プロセス名、または呼び出し元アプリケーションにマップします。

次の表に、この問題に対して考えられる最適化の一覧を示します。

最適化/軽減策 概要
過剰なワークロードを停止します。 ロットまたは LDAP クエリによってサービスが停止する場合は、上位の呼び出し元クライアントに焦点を当て、過剰なワークロードのソースを特定して排除します。

アプリケーションを識別するためのオプションとしては、PROCMON、ETL/ETW トレース、デバッグ分析を使用して、クライアントで LDAP クエリを生成するアプリケーションを特定できます。 もう 1 つの方法は、サービスをトッピングするか、LDAP クエリを生成しているアプリケーションを削除するという 2 除算アプローチを使用することです。 発行されたクエリは、呼び出し元のアプリケーションまたはプロセスに影響を与えます。
更新された LDAP クエリ オプティマイザーをインストールします。 Windows Server 2012 R2 には、ほとんどのクエリのパフォーマンスを向上させる更新された LDAP クエリ オプティマイザーが含まれています。 Windows Server 2012 R2 のサブセットは、Windows Server 2008 R2 にバックポートされ、修正プログラム 2862304でWindows Server 2012されます。
クライアントがサイト最適なドメイン コントローラーにクエリを送信していることを確認します。 WAN 経由で LDAP クエリを送信すると、ドメイン コントローラーへの LDAP クエリの配信とクライアントへの応答にネットワーク待機時間が発生します。 Active Directory のクライアント コンピューターとサーバー コンピューターに Active Directory サイトとサブネット定義が存在することを確認します。

アプリケーションに、リモート サイト ドメイン コントローラーまたは読み取り/書き込み可能なドメイン コントローラーへのハードコーディングされた参照が、サイトに最適なドメイン コントローラーが存在する場合にのみ含まれていないことを確認します。
ソフトウェア開発者と協力して、クエリの発行頻度を減らします。 これには、キャッシュの使用が含まれます。 効率的に発行されたクエリでも、クエリが頻繁に発行される場合は、適切なサイズと構成されたドメイン コントローラーを打ち負かす可能性があります。
アプリケーションでは、ネットワーク、LDAP、CPU の負荷を軽減するために、クエリ ボリュームまたはキャッシュ クエリの結果を調整する必要がある場合があります。
LDAP クエリをより迅速に実行するように最適化します。 より迅速に実行するには、クエリ構文を再構築する必要がある場合があります。
フィルター内でクエリ要素を左または右に移動すると、パフォーマンスが向上します。
"not" を二重に追加すると、クエリのパフォーマンスが向上する可能性があります。
ツリー内の下位のクエリを開始して、アクセスされるオブジェクトの数を減らすことを検討してください。
クエリによって返される属性の数を減らします。
必要に応じて、Active Directory 属性にインデックスを追加します。 インデックスを追加すると、クエリのパフォーマンスが向上します。 これにより、データベース サイズが大きくなります。また、インデックスの作成中に Active Directory レプリケーションが一時的に遅延する可能性があります。
クエリ オプティマイザーとその他のコンポーネントにコードの欠陥が存在するかどうかを判断します。 LDAP クエリ オプティマイザーやその他のコンポーネントの欠陥により、スループットが低下する可能性があります。

既知の問題

Excel スプレッドシートの値は、英語以外の言語を使用するコンピューターでは適切に表示またはレンダリングされません。

たとえば、これは、Get-Culture Windows PowerShell コマンドレットがリージョン設定を次のように示す場合に、コンピューターで発生します。

PS C:\Windows\System32\WindowsPowerShell\v1.0> Get-Culture  
LCID Name DisplayName  
---- ---- -----------
1031 de-DE German (Germany)

PS C:\Windows\System32\WindowsPowerShell\v1.0> Get-UICulture

LCID Name DisplayName  
---- ---- -----------
1033 en-US English (United States)

この場合、Excel スプレッドシートの数値は次のスクリーンショットのようにレンダリングされます。

Excel スプレッドシートの問題の数値。

この問題を解決するには、コントロール パネルの [リージョン設定] 項目で Decimal シンボルをピリオド (.) に変更します。

LDAP クエリの詳細については、次のブログを参照してください。 Active Directory でコストが高く、非効率的で実行時間の長い LDAP クエリを見つける方法