環境
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 は完了しました。"