###前提・実現したいこと
windowsSever2012R2のwinsowsUpdateスクリプトについて
社内サーバをwindowsserver2012R2に変更しました。
しばらく経過観察していましたが、どうも自動でwindowsUpdateが行われていないようです。
調べたところ、時間指定してのwindowsUpdateはできなく、推奨設定にするとwindowsUpdateが配信されるたびに
勝手にアップデート・再起動されてしまうことが分かりました。
社内で使用しているものなので、突然リブートがかかってしまうのは困るということで、
- windowsUpdateを見つけてインストール・ダウンロードするスクリプトをpowershellで組んで
- batファイルで動かし
- (2を)タスクスケジューラから時間指定で起動させる
手順を行いたいと考えています。
先人が作ったサンプルを拾ったのですが、powershellの経験が皆無のため調べながら改変しています。
しかし、内容が分からない部分があるので解決したいです。
分からない部分のほかに、改変したものにコメントもつけているので、間違った解釈をしているものがあれば指摘してくれたら助かります。
###該当のソースコード
# 例外キャッチのデフォルト設定(ないと例外キャッチしてくれない) $ErrorActionPreference = "Stop" # 引数のメッセージを時刻と一緒にログに書き込むfunction function write_log($Message) { $date = (Get-Date).ToString("yyyyMMdd_HHmmss") $output = $date + " " + $Message $output | Out-File <# ログのパス #> -Append -Encoding utf8 } try{ write_log("Check updates Start") # アップデートのダウンロード(開始) $updateSession = new-object -com "Microsoft.Update.Session" # MicrosoftUpdateSessionオブジェクトのインスタンス化(new-object) $keyWord = "IsInstalled=0 and Type='Software' and BrowseOnly = 0" # 検索キーワード $updates = $updateSession.CreateupdateSearcher().Search($keyWord).Updates # アップデートセッションから検索キーワードに合致しているものを探し出す $downloader = $updateSession.CreateUpdateDownloader() # アップデートセッションからダウンローダーを取得(変数化) $downloader.Updates = $Updates # updateSearcher().Search($keyWord)から引っ張ったアップデートをダウンロード?(ここでダウンロードしているの?) # 変数.Updatesの挙動が分からない・・・ write_log("Check updates End") # アップデートのダウンロード(終了) # アップデートが見つかった時の処理(なかった場合はリブートかけて終了) if ($downloader.Updates.Count -ne "0") { # 利用できるアップデートのインストール write_log("Downloading " + $($downloader.Updates.count) + " updates") $resultcode= @{0="Not Started"; 1="In Progress"; 2="Succeeded"; 3="Succeeded With Errors"; 4="Failed" ; 5="Aborted" } # ステータスのハッシュ $Result= $downloader.Download() # ダウンロード2回目? # アップデートできる状態なら行う?(Hresultとは・・・) if (($Result.Hresult -eq 0) -and (($result.resultCode -eq 2) -or ($result.resultCode -eq 3)) ) { $updatesToInstall = New-object -com "Microsoft.Update.UpdateColl" # UpdateCollのインスタンス化 foreach ($Update in $Updates | where {$_.isdownloaded} ){ $updatesToInstall.Add($Update) | out-null # アップデートファイルの追加?$updatesToInstallってインスタンスの変数じゃないの? write_log($Update.Title) } $installer = $updateSession.CreateUpdateInstaller() # インストーラの宣言 $installer.Updates = $updatesToInstall write_log("Update Install Start") $installationResult = $installer.Install() # アップデートのインストール write_log("Update Install End") # リブート if ($autoRestart -and $installationResult.rebootRequired) { write_log("Status is Reboot Required. Reboot Start") Restart-Computer -Force # -Forceオプションで強制リブート Exit } # リブートif/ } # if/ } # if/ } # try/ # 例外発生時、ログにエラー発生の旨を吐く catch{ write_log("Windows Update Error") }
###特にわからない部分
1.$downloader.Updates = $Updatesの部分など、変数宣言時の「変数.Updates」の挙動
2.($Result.Hresult -eq 0) の「変数名.Hresult」の挙動
3.$updatesToInstall = New-object -com "Microsoft.Update.UpdateColl"でcomオブジェクトが入った変数に
$updatesToInstall.Add($Update)で配列のように別のオブジェクトを追加している理由
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。