shinke1987.net
雑多な備忘録等のはず。
他のカテゴリ・タブ
目次
PR

WPSでWindowsUpdateの再起動までを自動化。

2017-05-01 2017-05-24

環境

Windows 7 Professional 64bit
WPS:Ver2.0

 

目標

1度実行したら再起動までやってくれる。

ドライバ以外のアップデートを全てインストールする。

 

次の目標

OSを再インストールしてから、

1度実行したら複数回以上の再起動も含めて、

全てのWindowsUpdateの処理を終わらせてくれるスクリプトにしたい。

 

追記(2017年5月2日)

91行目の、

$Installer = $Session.CreateUpdateInstaller()

は、リモートからはできないらしい。
参考→https://technet.microsoft.com/ja-jp/library/security/aa386863.aspx

もしやると、こんなエラーが出る。

"0" 個の引数を指定して "CreateUpdateInstaller" を呼び出し中に例外が発生しました: "アクセスが拒否されました。 (HRESULT からの例外: 0x80070005 (E_ACCESSDENIED))"
$Installer = New-Object -ComObject Microsoft.Update.Installer

とやると解決できるかもしれない。
時間できたら試す。
【平成29年5月9日(火)追記】
ダメだった。そもそもWindowsがリモートでアップデートできないようにしてるみたい。
もうタスクスケジューラ使うしかない。
タスクスケジューラで深夜に実行するように設定して、
その時間のちょい前にWOLとかで起動するようにするしかないかも。

WPSからタスクスケジューラを利用する。
を参考にしたらできるはず。

 

コード

$yyyymmdd = Get-Date -uformat "%Y%m%d"
$NumOfUpdates = 0
$IsThereUpdates = ""
$IsThereInstall = ""
$UpdateTitles = @()
$InstallTitles = @()
$CheckDownload = 0
$FlagDownload = 0
$FlagInstall = 0
$LogResult = ""
$NeedReboot = "再起動は不要です。"

$Today = Get-Date

$Session = New-Object -ComObject Microsoft.Update.Session
$Searcher = $Session.CreateUpdateSearcher()

Write-Host "初期化中。。。`r`n" -ForegroundColor "Yellow"
# $Results = $Searcher.Search("IsInstalled = 0 AND Type = 'Software' And AutoSelectOnWebSites = 1")
$Results = $Searcher.Search("IsInstalled = 0 AND Type != 'Driver'")
$NumOfUpdates = $Results.Updates.Count

# アップデートがあるかを確認。
if ($NumOfUpdates -eq 0) {
    $IsThereUpdates = "利用可能なアップデートはありません。`r`n"
    Write-Host "$IsThereUpdates"
}
else {
    $IsThereUpdates = "利用可能なアップデートがあります:" + $NumOfUpdates + " 件`r`n"
    Write-Host "$IsThereUpdates"
    # アップデートの内容を表示。
    foreach ($Result in $Results.Updates) {
        $UpdateTitles += $Result.Title
        Write-Host "・" $Result.Title
    }
    $CheckDownload = 1
}

# ダウンロードするものがあるかをチェック。
if ($CheckDownload -eq 1) {
    foreach ($Update in $Results.Updates) {
        if ($Update.IsDownloaded) {
            Write-Host "過去にダウンロード済み:" $Update.Title
            $FlagInstall = 1
        }
        else {
            $FlagDownload = 1
            Write-Host "ダウンロード予定:" $Update.Title
        }
    }
}
Write-Host 

# ダウンロードを行う。
$DLColl = New-Object -ComObject Microsoft.Update.UpdateColl
if ($Flagdownload -eq 1) {
    foreach ($Update in $Results.Updates) {
        $DLColl.Add($Update) | Out-Null
    }
    $Downloader = $Session.CreateUpdateDownloader()
    $Downloader.Updates = $DLColl
    $Downloader.Download()
    # ダウンロード後の確認。
    foreach ($Update in $Results.Updates) {
        if ($Update.IsDownloaded) {
            Write-Host "ダウンロード完了:" $Update.Title
            $FlagInstall = 1
        }
        else {
            Write-Host "ダウンロード失敗:" $Update.Title
        }
    }
}
Write-Host 

# インストールを行う。
$InstallColl = New-Object -ComObject Microsoft.Update.UpdateColl
foreach ($Update in $Results.Updates) {
    if ($Update.IsDownloaded) {
        $InstallColl.Add($Update) | Out-Null
        $InstallTitles += $Update.Title
    }
}
if ($InstallColl.Count -eq 0) {
    $IsThereInstall = "インストールできる更新ファイルがありません。"
    Write-Host $IsThereInstall
}
else {
    $IsThereInstall = "インストール予定のアップデート:" + $InstallColl.Count + " 件"
    Write-Host "インストールを開始しました。( " $InstallColl.Count " 件)"
    $Installer = $Session.CreateUpdateInstaller()
    $Installer.Updates = $InstallColl
    $InstallResult = $Installer.Install()
    if ($InstallResult.ResultCode -eq 2) {
        $LogResult = "全ての更新ファイルをインストールしました。"
        Write-Host $LogResult
    }
    if ($InstallResult.ResultCode -eq 3) {
        $LogResult = "エラーは発生しましたが、完了しました。"
        Write-Host $LogResult
    }
    if ($InstallResult.ResultCode -eq 4) {
        $LogResult = "失敗しました。"
        Write-Host $LogResult
    }
    if ($InstallResult.ResultCode -eq 5) {
        $LogResult = "処理がキャンセルされました。"
        Write-Host $LogResult
    }
}

# ログファイル生成。
$LogFile = $yyyymmdd + $Env:ComputerName + ".log"
"Windows Power Shell Scriptで自動生成されたログです。" > $LogFile
"生成したファイル:AutoWU.ps1" >> $LogFile
"生成した年月日:$Today`r`n" >> $LogFile
"=======================================================================`r`n" >> $LogFile
$IsThereUpdates >> $LogFile
for ($i = 0; $i -lt $NumOfUpdates; $i++) {
    "【 " + ($i + 1) + " 】" + $UpdateTitles[$i] >> $LogFile
}
$IsThereInstall >> $LogFile
for ($i = 0; $i -lt $InstallColl.Count; $i++) {
    "【 " + ($i + 1) + " 】" + $InstallTitles[$i] >> $LogFile
}
Write-Host 
"=======================================================================`r`n" >> $LogFile
$LogResult >> $LogFile
$Today = Get-Date
"完了時刻:$Today" >> $LogFile


# 再起動が必要かどうかを確認する。
if ($InstallResult.RebootRequired) {
    $NeedReboot = "再起動が必要です。`r`n10秒後に再起動します。"
    $NeedReboot >> $LogFile
    Write-Host "再起動が必要です。"
    Write-Host "10秒後に再起動します。"
    Start-Sleep -s 10
    shutdown /r /t 0
}
else {
    $NeedReboot >> $LogFile
}

# 完了。
Write-Host "Windows Update は完了しました。"
同一カテゴリの記事