WmiPrvSE.exe のアプリケーション エラーについて

皆さん、こんにちは。
Windows サポート チームです。

今回は、弊社で把握している Windows Server 2012 R2、及び、Windows Server 2016 において、同時に大量の 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"
}

2. 作成したスクリプトを複数の PowerShell 上で実行します。

3. スクリプトを実行し続けるとエラーが発生し始めます。

4. エラー発生時のイベントを確認すると、スタック オーバーフローの例外 (0xc00000fd、STATUS_STACK_OVERFLOW) が発生しています。

本事象については、次期バージョンでの改善を検討中です。
現時点で本事象を回避するためには、同時に発行される WMI クエリーの数をご調整ください。