かつて山市良と呼ばれたおじさんのブログ

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  vol.233 【新連載】シャットダウンが終わらないVMを即時停止する裏技|Hyper-V 小技・裏技集

 

 

vol.233 【新連載】シャットダウンが終わらないVMを即時停止する裏技|Hyper-V 小技・裏技集

2026年09月10日配信
執筆者:山内 和朗

 今回から始まる新連載「Hyper-V小技・裏技集」シリーズでは、Hyper-Vの仮想環境を利用していて、知っていると便利な小技や裏技を紹介します。今回は、Hyper-Vをよく使っている方ならきっと一度は遭遇したことがある、シャットダウンが終わらない仮想マシン(VM)、どうしたものか問題の解決です。

 

Hyper-Vを使っていて、こんなことはありませんか?

 

 「Hyper-Vマネージャー」(virtmgmt.msc)や「仮想マシン接続」(vmconnect.exe)のメニューからVMのシャットダウンを開始したとき、「シャットダウン中...」の状態が永遠と続き、VMを停止できないという状況に遭遇したことはないでしょうか。そのような状況において、状況を打開しようと、「停止」や「リセット」を実行しようとして拒まれたり(画面1)、VMのゲストのデスクトップに対話もできない場合、いつまで待てば状況が変わるのか、途方にくれるかもしれません。Hyper-Vの検証環境を毎日操作している私は、数か月に一度、そんな場面に遭遇します。

 

画面1 Hyper-Vマネージャーや仮想マシン接続ウィンドウのメニューからシャットダウンを開始したものの、いつまで待っても停止しない。この状態では「停止」や「リセット」も受け付けない
画面1 Hyper-Vマネージャーや仮想マシン接続ウィンドウのメニューからシャットダウンを開始したものの、いつまで待っても停止しない。この状態では「停止」や「リセット」も受け付けない

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

 

画面2 VMの制御を取り戻すための方法の1つは、仮想マシン管理サービスの再起動(停止/開始)
画面2 VMの制御を取り戻すための方法の1つは、仮想マシン管理サービスの再起動(停止/開始)

 

状態が変化しないVMをピンポイントで強制停止する裏技

 

 仮想マシン管理サービスの停止/開始なしで問題の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が即座に停止する
画面3 VMのIDで問題のVMのwmwpプロセスを特定し、タスクを強制終了すると、そのVMが即座に停止する

 この操作でVMは即座に停止されます。このとき、VMに接続していた「仮想マシン接続」ウィンドウや「Hyper-Vマネージャー」には、「'VM名'はシャットダウンできませんでした」エラーが表示されます(画面4)。

 

画面4 この方法でVMを強制終了すると、「仮想マシン接続」ウィンドウや「Hyper-Vマネージャー」には、「'VM名'はシャットダウンできませんでした」エラーが表示される
画面4 この方法でVMを強制終了すると、「仮想マシン接続」ウィンドウや「Hyper-Vマネージャー」には、「'VM名'はシャットダウンできませんでした」エラーが表示される

 

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スクリプト
画面5 状態が変化しないVMを強制終了するPowerShellスクリプト

 

Hyper-V 小技・裏技集 (1)(2)

blog_yamanxworld_subscribe

blog_yamanxworld_comment

blog_yamanxworld_WP_ws2025

最新記事