※本記事はマイクロソフト社員によって公開されております。
※この記事は過去に作成され、公開された記事を再編したものです。
本記事は 2018 年 3 月 12 日に WmiPrvSE.exe のアプリケーション エラーについて に公開された記事、および 2019 年 3 月 12 日に WmiPrvSE.exe のアプリケーション エラーについて に公開された記事を再編したものです。
皆さん、こんにちは。Windows サポートチームです。
今回は、Windows Server 2012 R2 以降の Windows Server OS (Windows Server 2016 / Windows Server 2019) において、同時に大量の WMI クエリーを発行した際に発生する可能性のあるアプリケーション エラーについてご紹介します。
概要 - Symptom
Windows Management Instrumentation (WMI) はシステムの管理情報を操作、参照するためのインターフェースを提供している Windows OS の基幹となるサービスです。
そのため、サーバーやクライアントの監視を行っているアプリケーションでは、WMI サービスを使用して管理情報を収集されていることが多いかと思います。
同じ WMI クラスに対する WMI クエリーが同時、かつ大量 (目安としては 50 ほど) に発行されると、WmiPrvSE.exe がアプリケーション エラー (イベント ID: 1000) に至ってしまう可能性があります。
例外コードは 0xc00000fd (STATUS_STACK_OVERFLOW) が記録されます。
ログの名前 : Application
ソース : Application Error
イベント ID : 1000
レベル : エラー
説明:
障害が発生しているアプリケーション名: wmiprvse.exe、バージョン: 6.3.9600.18264、タイム スタンプ: 0x56e1b40e
障害が発生しているモジュール名: DNSAPI.dll、バージョン: 6.3.9600.17415、タイム スタンプ: 0x54503d8f
例外コード: 0xc00000fd
※例外コードが 0xc00000fd と異なるアプリケーション エラーの場合は、本事象には該当しません。
原因 - Cause
WMI クエリーが発行されると、WMI クラスに対応したプロバイダーをロードしている WmiPrvSE.exe 内のキューにリクエストが追加されていきます。
そして、WmiPrvSE.exe がキューに追加されたリクエストを順次処理します。
しかし、WmiPrvSE.exe が 1 つあたりのリクエストを処理する速度よりも、キューにリクエストが追加されていく速度が上回ってしまった場合、キューにリクエストが増え続けてしまい、スタックオーバーフローの例外 (0xc00000fd、STATUS_STACK_OVERFLOW) が発生し、アプリケーション エラーに至ります。
例として、弊社では以下の手順でスタックオーバー フローが発生することを確認しております。
下記スクリプトを ps1 ファイルとして保存します。
sample.ps1 1
2
3while(1){
gwmi -query "select * from Win32_TerminalService"
}作成したスクリプトを複数の PowerShell 上で実行します。
- スクリプトを実行し続けるとエラーが発生し始めます。
- エラー発生時のイベントを確認すると、スタック オーバーフローの例外 (0xc00000fd、STATUS_STACK_OVERFLOW) が発生しています。
回避策 - Workaround
本事象について弊社にて認識している問題となりますが、現時点におきまして本事象を回避するためには、同時発行される WMI クエリー数をご調整くださいますようお願い申し上げます。
更新履歴 - Update History
- 2018/03/12 : 本 Blog の公開
- 2022/02/15 : 再編版の公開