かつて山市良と呼ばれたおじさんのブログ
セイテクエンジニアのブログ かつて山市良と呼ばれたおじさんのブログ vol.240 自動化スクリプト ─ Windows Update|Hyper-V 小技・裏技集
2026年10月08日配信
執筆者:山内 和朗
「Hyper-V小技・裏技集」シリーズでは、Hyper-Vの仮想環境を利用していて、知っていると便利な小技や裏技を紹介します。vol.237では、PowerShell DirectとCopy-VMFileの使いこなしについて説明しました。これらを活用した、VMのゲスト側タスクの自動化例を紹介しています。
※ここで紹介するサンプルコードは、PowerShellスクリプト(.ps1)内に記述することを想定しています。-ErrorAction Stopパラメーターは、エラー時にスクリプト全体を停止します。PowerShellウィンドウに入力して実行した場合は、エラーが発生しても以後のスクリプトは停止しないため、別のエラーが発生する可能性があることに注意してください。
| ※9月17日(木)開催、第8回 セイテク・シス管道場のアーカイブビデオが公開されました。 お知らせ. 9月17日(木)開催の第8回 セイテク・シス管道場のアーカイブ視聴が可能になりました [2026.10.06] |
前回は、Hyper-Vホスト側に用意したテスト用スクリプトをCopy-VMFileを使用してVMのゲストにコピーし、Invok-Commandを使用してリモート実行するという、VMを利用したテストの自動化スクリプトを紹介しました。今回は、同じ方法を利用して、以下の記事で紹介したWindows Update用PowerShellスクリプト「WUA_SearchDownloadInstall.ps1」をリモート実行させ、更新後の再起動までを自動化してみたいと思います。Hyper-Vホストから、Windows VMのWindows Updateを完全制御するスクリプトです。
vol.124 WUA_SearchDownloadInstall.vbsのPowerShell化|Windowsトラブル解決[2025年07月24日配信]
WUA_SearchDownloadInstall.ps1は、Microsoftがサンプルとして公開している「WUA_SearchDownloadInstall.vbs」の主要な機能を私がPowerShell化したものです。Windows Updateの更新プログラムの検索からダウンロード、インストールまではWUA_SearchDownloadInstall.ps1の-Automateパラメーターを使用します。WUA_SearchDownloadInstall.ps1には、再起動まで自動化する-CompleteToShutdownパラメーターも存在しますが、WUA_SearchDownloadInstall.ps1では再起動させず、別の方法(レジストリの参照)で再起動を判断しています。
今回作成したPowerShellのコードは、次の一連の作業を自動化します(画面1)。
ロールバック用にVMのチェックポイントを作成する。
VMの統合サービスの「ゲスト サービス インターフェイス」の現在の設定を保存する。
VMの統合サービスの「ゲスト サービス インターフェイス」が無効の場合は有効化する。
WUA_SearchDownloadInstall.ps1をVMゲストのC:¥にコピーする。
VMの統合サービスの「ゲスト サービス インターフェイス」の設定を元に戻す。
Invoke-CommandでWUA_SearchDownloadInstall.ps1 -Automateをリモート実行する。
レジストリを参照して再起動の必要性を判断する。
再起動が必要な場合は、再起動を開始する。
複数回再起動の可能性を考慮し、VMのHeatbeatが900秒(15分)間連続して“Ok*”であれば、再起動完了と見なす。
VMをシャットダウンして停止する。
(プレーンテキストでダウンロード/表示)
※ この例のようにスクリプト内に平文パスワードを記述することは推奨されません。平文パスワードを排除する方法については、vol.238の「スクリプトから平文パスワードを排除する簡単な方法」を参照してください。

画面1 VMを起動し、Windows Updateを実行して、再起動、シャットダウンまでを自動化するPowerShellスクリプトの実行例(画面のクリックで拡大)
今回、再起動の必要性の判断には次のコードを使用しました。レジストリの2つの場所のいずれかにRebootRequiredキーが存在すれば再起動待ちの状態と判断できます。
| if ((Test-Path "HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired") -or ` (Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending")) { return $true } else { return $false } |
Windows Updateを完了させるための再起動は、複数回、再起動が行われることがあり、PowerShellのコードには複数回の再起動を吸収するコードが含まれています。以下に、実際の実行例をビデオにしました。複数回の再起動を待機できていることを確認できるでしょう。
リファレンス(Microsoft Learn):
Get-VM(Hyper-V)| Start-VM(Hyper-V)| Stop-VM(Hyper-V)| Checkpoint-VM(Hyper-V)| Invoke-Command(PowerShell)| Copy-VMFile(Hyper-V)| Export-Clixml(PowerShell)| Import-Clixml(PowerShell)| Windows Update Agent API(Windows アプリ開発)