LoginSignup
13
14

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-09-23

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
}
13
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
14