Edited at

PowerShellでWindows Updateが有効かどうかと最終インストール日時を確認する

More than 3 years have passed since last update.

Windows UpdateがちゃんとされてるのかチェックしたくてPowerShellでチェック処理を書いたので貼っておく。

以下のスクリプトでは判定条件として「更新プログラムを自動的にインストールする」に設定されてる、もしくは「更新プログラムをチェックし、ダウンロードとインストールを行うかは自分で選ぶ」かつ「最終インストール日からの経過日時が31日以内」の場合にOKになるようになってるけど、情報が取れたら判定処理は好みで微調整して下さい。

ポイントは Microsoft.Update.AutoUpdate のCOMオブジェクトを生成して、そこからWindows Update関連のデータを拾ってくる。

function Check-OsUpdate{

$osUpdate = @{}
$windowsUpdate = New-Object -ComObject "Microsoft.Update.AutoUpdate"
# サービスの状態(常駐しているかの設定を確認してるだけなので自動更新する設定になっているかはNotificationLevelを見ないと分からない)
$osUpdate["ServiceEnabled"] = $windowsUpdate.ServiceEnabled
# 更新の設定
$osUpdate["NotificationLevel"] = $windowsUpdate.Settings.NotificationLevel
$NotificationLevelMsg =""
switch ($windowsUpdate.Settings.NotificationLevel) {
# 未設定
0 { $notificationLevelMsg = 'not_configured' }
# 更新プログラムをチェックしない(推奨されません)
1 { $notificationLevelMsg = 'disabled' }
# 更新プログラムをチェックし、ダウンロードとインストールを行うかは自分で選ぶ
2 { $notificationLevelMsg = 'prompts_before_download' }
# 更新プログラムをダウンロードし、インストールを行うかは自分で選ぶ
3 { $notificationLevelMsg = 'prompts_before_installation' }
# 更新プログラムを自動的にインストールする(推奨)
4 { $notificationLevelMsg = 'automatically_installed' }
# 不明
default { $notificationLevelMsg = "unknown level($($windowsUpdate.Settings.NotificationLevel))" }
}
$osUpdate["NotificationLevelMsg"] = $notificationLevelMsg
# 更新プログラムの最終チェック日時(GMTなので9時間ずれてる)
$osUpdate["LastSearchSuccessDate"] = $windowsUpdate.Results.LastSearchSuccessDate
# 更新プログラムのインストール日時(GMTなので9時間ずれてる)
$osUpdate["LastInstallationSuccessDate"] = $windowsUpdate.Results.LastInstallationSuccessDate
# 最終インストール日からの経過日時
$osUpdate["LastInstallationElapsedDays"] = ((Get-Date) - $windowsUpdate.Results.LastInstallationSuccessDate).Days

# チェック処理
if (($windowsUpdate.Settings.NotificationLevel -eq 4) -or
(($windowsUpdate.Settings.NotificationLevel -gt 1) -and ($osUpdate["LastInstallationElapsedDays"] -lt 31))) {
$osUpdate["CheckStatus"] = "OK"
} else {
$osUpdate["CheckStatus"] = "NG"
}
return $osUpdate
}