皆さん、こんにちは。
Windows サポート チームです。
今回は、同時に大量の WMI クエリーを発行した際に発生する可能性のあるアプリケーション エラーについてご紹介します。
Windows Management Instrumentation (WMI) はシステムの管理情報を操作、参照するためのインターフェースを提供している Windows OS の基幹となるサービスです。
そのため、サーバーやクライアントの監視を行っているアプリケーションでは、WMI サービスを使用して管理情報を収集されていることが多いかと思います。
同じ WMI クラスに対する WMI クエリーが同時、かつ大量 (目安としては 50 ほど) に発行されると、WmiPrvSE.exe がアプリケーション エラー (イベント ID: 1000) に至ってしまう可能性があります。
※例外コードが 0xc00000fd と異なるアプリケーション エラーの場合は、本事象には該当しません。
WMI クエリーが発行されると、WMI クラスに対応したプロバイダーをロードしている WmiPrvSE.exe 内のキューにリクエストが追加されていきます。
そして、WmiPrvSE.exe がキューに追加されたリクエストを順次処理します。
しかし、WmiPrvSE.exe が 1 つあたりのリクエストを処理する速度よりも、キューにリクエストが追加されていく速度が上回ってしまった場合、キューにリクエストが増え続けてしまい、スタック オーバーフローの例外 (0xc00000fd、STATUS_STACK_OVERFLOW) が発生し、アプリケーション エラーに至ります。
例として、弊社では以下の手順でスタック オーバー フローが発生することを確認しております。
1. 下記スクリプトを Ps1 ファイルとして保存します。
while(1){
gwmi -query “select * from Win32_TerminalService”
}