WinMgmtのエラーってなに?

Windows 2000のイベントビューワでWinMgmtに[×]マークが出てしまいます。原因と対策を教えてください。



イベントビューワのアプリケーションログを参照すると,次のようなパラメータでエラーが多数記録されている場合があります。

イベントの種類:エラーイベント
イベントソース:WinMgmtイベント
イベントカテゴリ:なし
イベントID:37(または41,61)
説明:ライブラリ内で不明な問題が発生したため,WMI ADAPは<ファイル名>パフォーマンスライブラリを読み込むことができませんでした

イベントの種類:エラーイベント
イベントソース:WinMgmtイベント
イベントカテゴリ:なし
イベントID:41
説明:Collect関数で時間違反があったため, ADAPは<ファイル名>パフォーマンスライブラリを処理できませんでした。または009 サブキーで値が見つからなかったため,WMI ADAPはパフォーマンスライブラリ<ファイル名>のオブジェクトインデックス<インデックス番号>を作成しませんでした

イベントの種類:エラーイベント
イベントソース:WinMgmtイベント
イベントカテゴリ:なし
イベントID:61
説明:open関数で時間違反があったため,WMI ADAPは<ファイル名>パフォーマンスライブラリを処理できませんでした。

 WinMgmt.exeは,Windowsのクライアント管理をしているオブジェクトへのアクセスを行うファイルです。ただ,このファイルを理解するには専門的な知識が必要になるため,今回はこのエラーが発生した場合の対処法にしぼって紹介しましょう。
 このようなエラーイベントは,パフォーマンスカウンタ(システムのパフォーマンスを示す変数の集合体)を収集するためのパフォーマンスライブラリ(perfproc.dllなど)を呼び出すときに,パフォーマンスカウンタに問題があるか,パフォーマンスライブラリのモジュールが無効な戻り値を記録した場合(パフォーマンスライブラリが破損している)に発生します。
 しかし,実際のエラー発生時は,パフォーマンスカウンタは正常に動作しており,パフォーマンスライブラリも破損していないことがほとんどです。
 これは,単にパフォーマンスライブラリが,誤って無効な戻り値を記録してしまっていることが原因です(パフォーマンスライブラリが破損していると誤って認識されている)。このため,このようなエラーイベントが発生しても,パフォーマンスカウンタの利用には,とくに支障はありません。
 とはいえ,いちいちエラーが誤表示されるのは,あまり気分がよくありません。
 エラーの説明部分に記されているとおり,エラーイベントを発生させているのは,WMI(Windows Management Instruction)においてパフォーマンスカウンタオブジェクトを収集/管理しているADAP(AutoDiscovery/AutoPurge)プロセスです。
 つまり,エラーを解消するには,ADAPプロセスにパフォーマンスライブラリが正常な状態であることを強制的に認識させる必要があります。そのために,下記の操作を行ってください。

1. [スタート]→[プログラム]→[アクセサリ]→[コマンドプロンプト]を選択する。
2. 次のコマンドを実行して,いったんレジストリ中のADAP関連の情報をすべて削除する(画面2)。

 WINMGMT /CLEARADAP

 これにより,"HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\[カウンタ]\Performance"キーから,次のレジストリ値がすべて削除される。

 WbemAdapFileSize
 WbemAdapFileTime
 WbemAdapStatus
3. タスクマネージャを起動して,[プロセス]タブに切り替える。
4. 「WinMgmt.exe」のPID(プロセスID)の数値を確認する(画面3)。
5. 次のコマンドを実行して,カウンタ情報をリセットするためにADAPプロセスを起動する。

 WINMGMT /RESYNCPERF "winmgmt PID"

「winmgmt PID」 には,手順4で確認した数値を入力する。例えば,PIDが"624"ならば,「WINMGMT /RESYNCPERF 624」となる。
 これにより,手順2で削除したレジストリ情報が再登録される。
6. Windowsを再起動する。

 設定後もエラーが解消されていない場合は,PC起動時に実行されるほかの処理の負荷により,パフォーマンスカウンタの応答速度が低下していることが考えられます。
 次の手順に沿って,タイムアウトの時間を延長させます。

1. レジストリエディタを起動する。
2. "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\[カウンタ]\Performance"キーを開く(画面4)。
3. 次の値を追加する。
 
 値の名前:Collect Timeout
 データ型:DWORD値
 値のデータ:10000(10進数)

4. Windowsを再起動する。

 それでもエラーが解消されない場合は,次の設定を追加してください。

1. レジストリエディタを起動する。
2. "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\[カウンタ]\Performance"キーを開く。
3. 次の値を追加する。

 値の名前:WbemAdapStatus
 データ型:DWORD値
 値のデータ:0(10進数)

4. "HKEY_LOCAL_MACHINE\Software\Microsoft\Wbem\CIMOM"キーを開く。
5. 次の値を追加する。

 値の名前:ADAPPerflbTimeout
 データ型:DWORD値
 値のデータ:180(10進数)

6. Windowsを再起動する。

 設定後,ここまで紹介した対策でエラーが解消されない場合は,パフォーマンスカウンタ自体の問題が考えられます。
 その場合は,Windows 2000リソースキットに含まれる「Exctrlst.exe」ユーティリティを利用して,該当するサービスのパフォーマンスカウンタを無効に設定します。
1. Windows 2000リソースキットが手元にない場合は,次のFTPからファイルをダウンロードする。
       ftp://ftp.microsoft.com/reskit/win2000/exctrlst.zip

2. exctrlst.zipを適当なフォルダに解凍する。
3. 解凍したファイルの中からexctrlst.exeを実行して,「Extensible Counter List」を起動する(画面5)。
4. [Sort Order]から[Service]を選択する。
5. [Extensible Performance Counters]から,該当するサービスのパフォーマンスカウンタを選択して,[Performance Counters Enabled]のチェックを外す。
6. 「Extensible Counter List」を終了して,Windowsを再起動する。

※各レジストリキーにおける[カウンタ]部分には,エラーイベントの説明部分に記されるパフォーマンスライブラリのモジュールに対応するパフォーマンスカウンタが入ります。例えば,「perfproc.dll」と記録されている場合は「PerfProc」になります。
(佐野直樹)



画面2 コマンドプロンプトで「WINMGMT /CLEARADAP」と「WINMGMT/RESYNCPERF "winmgmt PID"」を実行して,ADAPプロセスにパフォーマンスライブラリが正常であることを認識させる



画面3 タスクマネージャを起動して,「WinMgmt.exe」のPIDを調べる



画面4 レジストリを編集して,該当するパフォーマンスカウンタの応答速度を上げる



画面5 「Extensible Counter List」を利用して,問題のあるパフォーマンスカウンタを強制的に無効にする