Windows Updateをコマンドから実行する方法

Windows Updateをコマンドから実行する方法。

企業などでは、Windowsマシンの更新を管理する場合、WSUS、Windows Intune、SCCMなどのMicrosoft製のツールを利用して集中管理するのが一般的ですが、ツールを利用するほど台数が多くない場合は、更新処理をスクリプト化する方法もおすすめです。

更新処理をスクリプト化して、更新結果をテキストファイルでファイルサーバーなどに保存するようにしておけば、一台ずつ画面を開いて更新結果を確認する手間を削減できます。

そこでここでは、PowerShellからWindows Update Agent APIやWindowsUpdateモジュールを使って、更新プログラムの検索/ダウンロード/インストールを実行する方法を解説します。

Windows Update Agent APIを使った方法

Windows Update Agent API は、システム管理者やプログラマがWindows Updateにアクセスできるインターフェイスとして古くから利用されており、以下のようなPowerShellスクリプトを作成すれば、標準機能のみでWindows Updateによる更新プログラムの確認・ダウンロード・インストールを管理できます。

# セッション作成
$UpdateSession = New-Object -ComObject Microsoft.Update.Session
$UpdateSearcher = $UpdateSession.CreateUpdateSearcher()

Write-Host 'Phase1:更新プログラムを検索しています...'
$SearchResult = $UpdateSearcher.Search("IsInstalled=0 and IsHidden=0")
$TotalUpdates = $SearchResult.Updates.Count
if ($TotalUpdates -eq 0) {
    Write-Host '未インストールの更新プログラムはありません。'
    Read-Host '終了するには、エンターキーを押してください。' | Out-Null
    Exit 0
}


Write-Host ''
Write-Host 'Phase2:未インストールの更新プログラムリストを作成しています...'
$UpdatesToDownload = New-Object -ComObject Microsoft.Update.UpdateColl
foreach ($Update in $SearchResult.Updates) {
    if ($Update.EulaAccepted -eq $false) {
        $Update.AcceptEula()
    }
    $UpdatesToDownload.Add($Update) | Out-Null
    Write-Host "$($Update.Title) [Type: $($Update.Type)]"
}
Write-Host "Total件数:$TotalUpdates"


Write-Host ''
Write-Host 'Phase3:更新プログラムをダウンロードします...'
Read-Host "処理を開始するときは、エンターキーを押してください。" | Out-Null
$Downloader = $UpdateSession.CreateUpdateDownloader()
$Downloader.Updates = $UpdatesToDownload
Write-Host '更新プログラムのダウンロード中...'
$DownloadResult = $Downloader.Download()
if($DownloadResult.ResultCode -ne 2){
    Write-Output $Error[0]
}


Write-Host ''
Write-Host 'Phase4:更新プログラムをインストールします...'
Read-Host "処理を開始するときは、エンターキーを押してください。" | Out-Null

$RebootRequired = $false

for ($i = 0; $i -lt $TotalUpdates; $i++) {
    $CurrentUpdate = $SearchResult.Updates.Item($i)
    $CurrentNumber = $i + 1
    
    # 現在の進捗を表示
    Write-Host "[インストール中 $CurrentNumber / $TotalUpdates] " -NoNewline
    Write-Host "$($CurrentUpdate.Title)... "
    
    $SingleUpdateColl = New-Object -ComObject Microsoft.Update.UpdateColl
    $SingleUpdateColl.Add($CurrentUpdate) | Out-Null
    
    $Installer = $UpdateSession.CreateUpdateInstaller()
    $Installer.Updates = $SingleUpdateColl
    $InstallResult = $installer.Install()
    
    if ($InstallResult.ResultCode -ne 2) {
        Write-Warning "失敗 (コード: $($InstallResult.ResultCode))"
    }
    if ($InstallResult.RebootRequired) {
        $RebootRequired = $true
    }
}
Write-Host "更新プログラムのインストールが完了しました。"
if ($rebootRequired) {
    Write-Host "更新プログラムの適用にはシステムの再起動が必要です。"
    Read-Host '今すぐ再起動するときは、エンターキーを押してください。' | Out-Null
    Restart-Computer -Force
}

なお、プレビュー更新プログラムや手動インストールが必要なデバイスドライバはWindows Update Agent APIから更新を自動化できないのでご注意ください。

WindowsUpdateモジュールを使った方法

PowerShellで、より簡単にWindows Updateの更新プログラムのチェックやインストールを行いたい場合は、WindowsUpdateモジュールを使った方法がおすすめです。

WindowsUpdateモジュールを使って更新プログラムのチェックやインストールを実行する方法は、まず、以下のコマンドでWindowsUpdateモジュールを使用できるようにします。

if (-not(Test-Path ".\Modules")){New-Item -Path ".\Modules" -ItemType Directory}
Save-Module -Name PSWindowsUpdate -Path ".\Modules"
Import-Module ".\Modules\PSWindowsUpdate"

モジュールを使えるようにした後は、更新プログラムの有無をチェックするときは、以下のコマンドを実行します。

PS> Get-WindowsUpdate

更新プログラムをダウンロードまで行いたいときは、以下のコマンドを実行します。

PS> Get-WindowsUpdate -Download

必要な更新プログラムのインストールまで行いたいときは、以下のコマンドを実行します。更新プログラムのインストール後に再起動が必要な場合は、再起動するかの質問が表示されます。

PS> Get-WindowsUpdate -Install -AcceptAll

更新プログラムのインストール後に自動的に再起動させたいときは、以下のようにコマンドを実行します。

PS> Get-WindowsUpdate -Install -AcceptAll -AutoReboot

更新プログラムの適用履歴を確認したいときは、以下のコマンドを実行します。

PS> Get-WUHistory

Windows Updateをコマンドから実行する方法。

なお、ここでは基本的なコマンドの紹介のみでしたが、WindowsUpdateモジュールのより詳しい使い方を知りたい方は、以下のコマンドでヘルプを確認してみるとよいでしょう。

PS> Get-Help Get-WindowsUpdate -detailed

あとがき

個人的な印象としては、WindowsUpdateモジュールを使った方法は安定性に少し不安を感じますが手軽さの面ではおすすめで、スクリプト作成が可能ならWindows Update Agent APIを使った方法をおすすめします。