かつて山市良と呼ばれたおじさんのブログ
セイテクエンジニアのブログ かつて山市良と呼ばれたおじさんのブログ vol.233 【新連載】シャットダウンが終わらないVMを即時停止する裏技|Hyper-V 小技・裏技集
2026年09月10日配信
執筆者:山内 和朗
今回から始まる新連載「Hyper-V小技・裏技集」シリーズでは、Hyper-Vの仮想環境を利用していて、知っていると便利な小技や裏技を紹介します。今回は、Hyper-Vをよく使っている方ならきっと一度は遭遇したことがある、シャットダウンが終わらない仮想マシン(VM)、どうしたものか問題の解決です。
「Hyper-Vマネージャー」(virtmgmt.msc)や「仮想マシン接続」(vmconnect.exe)のメニューからVMのシャットダウンを開始したとき、「シャットダウン中...」の状態が永遠と続き、VMを停止できないという状況に遭遇したことはないでしょうか。そのような状況において、状況を打開しようと、「停止」や「リセット」を実行しようとして拒まれたり(画面1)、VMのゲストのデスクトップに対話もできない場合、いつまで待てば状況が変わるのか、途方にくれるかもしれません。Hyper-Vの検証環境を毎日操作している私は、数か月に一度、そんな場面に遭遇します。

画面1 Hyper-Vマネージャーや仮想マシン接続ウィンドウのメニューからシャットダウンを開始したものの、いつまで待っても停止しない。この状態では「停止」や「リセット」も受け付けない
VMのシャットダウン(Stop-VM)操作は何らかのタイムアウトで失敗となり、操作の中止はたはVMのシャットダウン/停止で終わる場合があります(例: Windowsのシャットダウンスクリプトはタイムアウト10分で失敗します)。私はそんなに気長に待っていられないので、Hyper-Vマネージャーの「サービス停止」「サービスの開始」を実行して、仮想マシン管理サービス(Hyper-V Virtual Machine Managementサービス)を停止、開始して、スタックしている現在の状態(シャットダウン中...)を破棄して、正常シャットダウンなしでVMを停止してました(画面2)。

画面2 VMの制御を取り戻すための方法の1つは、仮想マシン管理サービスの再起動(停止/開始)
仮想マシン管理サービスの停止/開始なしで問題のVMだけを即座に停止する方法があります。それにはまず、PowerShellで次のコマンドラインを実行して、VMのID(GUID)を調べます。
| Get-VM -Name "VM名" |Select Name, State, IdまたはVMId |
タスクマネージャー(Taskmgr.exe)を開き、「詳細」タブに切り替え、列名の上で右クリックして「列の選択」を選択し、「コマンドライン」を表示させます。検索ボックスに“vmwp”(vmwpはVMごとに1つの仮想マシンワーカープロセス)と入力すると、現在実行中のすべてのVMのvmwpプロセスが表示されるので、「ユーザー名」列や「コマンドライン」列にVMのIDが含まれるものを特定し、右クリックして「タスクの終了」を選択します(画面3)。

画面3 VMのIDで問題のVMのwmwpプロセスを特定し、タスクを強制終了すると、そのVMが即座に停止する
この操作でVMは即座に停止されます。このとき、VMに接続していた「仮想マシン接続」ウィンドウや「Hyper-Vマネージャー」には、「'VM名'はシャットダウンできませんでした」エラーが表示されます(画面4)。

画面4 この方法でVMを強制終了すると、「仮想マシン接続」ウィンドウや「Hyper-Vマネージャー」には、「'VM名'はシャットダウンできませんでした」エラーが表示される
PowerShellによるVMのIDの確認とタスクマネージャーによるタスクの強制終了までの一覧の操作は、実に簡単にスクリプト化できます。PowerShellで次のコマンドラインを実行するだけです(画面5)。
| $vmName = "vm01" $vm = Get-VM -Name $vmName $vmwp = Get-CimInstance Win32_Process -Filter "Name='vmwp.exe'" | Where-Object { $_.CommandLine -match $vm.Id } $vmwp.ProcessId Stop-Process -Id $vmwp.ProcessId -Force #または #taskkill /PID $vmwp.ProcessId /F |
PowerShell 7(少なくとも7.3以降)であれば、Get-ProcessのCommandLineプロパティが使用できるため、次のように簡潔なスクリプトで記述することもできます(画面5)。
| $vmName = "VM名" $vm = Get-VM -Name $vmName $vmwp = get-process -name "vmwp"| Where-Object {$_.Commandline -match $vm.Id} Stop-Process -Id $vmwp.Id -Force |
(※ PowerShell 7で実行できます)

画面5 状態が変化しないVMを強制終了するPowerShellスクリプト
Hyper-V 小技・裏技集 (1)|(2)