2020年9月30日水曜日

WMIが破損した時に復旧する方法

仕事中に遭遇したトラブルで何とか解決出来た事を備忘録的に書かせて頂きたいと思います。

ちょっと「プログラムでエラーが出るから診て欲しい」と依頼され、色々と調査したところ、なんとWindows 10のWMIという仕組みが破損している事が判明しました。

WMIとは、平たく言うとアプリケーションからパソコンのハード情報を読み取るために使う仕組みの事で、ウインドウズ・マネージメント・インストゥルメンテーションの略なんですね。

自分が作ったアプリから、動いているPCのIPアドレスを取得するとか、そういう時に使えます。

あと、PCのプロパティを見るとメインRAMの容量とか表示されますけど、あれもこのWMI使ってるので、仕組みが破損すると正しく表示されなくなります...(今回分かった)


■確認方法(自己流)

↑WMIが破損してるかどうか、簡単に確認する方法なんですが、たとえばPowerShellでもって...

    GET-WMIOBJECT -LIST | ?{$_ -MATCH "WIN32_NETWORK"}
  
というコマンドを入力すると、ネットワークアダプターがらみのWMIのクラスがリストアップされて来るのですが、破損していると何もリストアップされません。

WMIが破損していても、プログラムは特にコンパイルエラーにはならず、実行時にへグるのが怖い所。


■復旧方法(自己流)

(1)まずはPowerShellを使って以下のコマンドでWMIをストップさせないといけないんですが、破損したシステムだと、ストップしたら間髪入れずに勝手にリスタートしてしまうので、次の(2)が成功するまで(1)と(2)を繰り返すような事になります!! ↓
    NET STOP WINMGMT
  


(2)コマンドでもエクスプローラーでも良いので、フォルダ「C:\Windows\System32\wbem」に入り、そこにあるフォルダ「Repository」を何でも良いのでリネームする準備をしておきます。 ↓
↑それで、(1)でWMIを止めて、止まっている間に(2)でRepositoryフォルダをリネームします。

普通は、リスタートのコマンドを入力しないとリスタートしないのですが、破損したコンピューター上のWMIは(実際にやってみて分かった)止めてもすぐに勝手にリスタートしてしまうんですね。

全部がそうかは分かりません。

リスタートしてしまうと、WMIがフォルダをロックしてしまうので、リネームが出来なくなります。

止めても勝手にリスタートしてしまうトラップにハマりかけましたが、急いでリネームを繰り返したら間に合って成功し、事なきを得ました。


(3)成功するとRepositoryフォルダが再作成されて復旧します!!

リスタートは勝手になる(なった)んですが、もしもリスタートしない時は以下のコマンドでリスタートします。

    NET START WINMGMT
  


当該のフォルダが無いと、WMIが作り直してくれるので、それが完了すると復旧となります。

アプリケーションはだいたい1分後くらいに使用開始すると良い感じです。※時間は計測したわけではなく体感

上記の話は、私が実際にやってみてこうだった、という話であって、全員が同じとは限らないのですが...。

そもそも何でWMIが破損するのだろう...。