ピッシーのメモ帳

気になった情報の保管庫

PowerShellで「プロバイダーによる読み込みエラーです」と表示された

PowerShellでTest-Connectionを使ったときに「プロバイダーによる読み込みエラーです」というエラーメッセージが表示された。その原因と対処方法を調べたので、メモ。

原因

WMI(Windows Management Instrumentation)リポジトリの破損。

PowerShellでは、pingに相当するコマンドレットとしてTest-Connectionがある。このコマンドレットでは、pingのように単体のプログラム(ping.exe)が動いているのではなくWMIオブジェクトのWin32_PingStatusクラスを使用している。

ごくまれにWMIが破損することがあるそうで、WMIが正常に機能しなくなるとオブジェクトを参照できなくなるためこのエラーが発生する。

対処方法

下記の手順でWMIリポジトリを再構築する。

1.エクスプローラーを開き、「C:\Windows\System32\wbem」にアクセスする。

2.サービスを管理者権限で起動する。タスクバーの検索窓から「サービス」と入力するのが楽。

3.「Windows Management Instrumentation」を停止する。

4.WMIと依存関係にあるサービスの停止を求められるので、強制的に停止させる。私の環境では、IP Helperというサービスの停止を求められた。*1

5.サービスの終了を確認後、速やかにRepositoryフォルダを別の名前に変更する。*2時間が経つと自動的にWMIサービスが起動するので注意。

下記画像のように失敗する場合は、WMIサービスが起動中になっているので再度停止させる。

6.サービスから「Windows Management Instrumentation」を開始し、新たにRepositoryフォルダが作成されるまで待つ。

7.Repositoryフォルダが作成されたのを確認できたら、パソコンを再起動する。

補足

似たようなコマンドで、Test-NetConnectionがある。違いについては、以下のページが参考になる。

PowerShell で死活監視

なぜか環境によって微妙に機能が違うみたい。

私は、単にパソコンへの疎通を確認したいときはping、宛先TCPポートの疎通を確認したいときはTest-NetConnectionを使うことが多い。

*1:ここで止めたサービスは後で再起動させたときに自動的に実行されるので、停止したままでも問題ないと思う。

*2:この時点でRepositoryフォルダを削除しても問題ないが、何かあったときすぐに元の状態に戻せるようにあえて削除していない。