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