PowerShellによるWindowsUpdateの自動化
通常、WindowsUpdateの設定で自動更新は可能です。それが使えない時のためのPowerShellを使った自動化の仕方の備忘録です。
シンクライアント環境で特定のアプリをサーバにいれて、クラウド利用してもらっています。
ユーザーから、「WindowsUpdateのポップアップがでるが、どうすればいいのか」と言われました。
ユーザー権限なので実施しても多分コケます。…とは回答できないので(^^;
「管理者で実施しますので作業不要です」と回答しました。
社内環境なので、帯域を節約するためWSUSサーバーを立てています。
それはいいのですが、インストールの自動化オプションを抑止しているため、ユーザー側でインストールを実行しないといけません。ここを自動化してやるのが今回の目的。
スクリプトの実行準備
TechnetにPowerShellスクリプトがあったので、それを自動実行できるようにカスタマイズしていきます。
Windows Update PowerShell Module
こちらからPSWindowsUpdate.zipを落としてきます。どこに置くか環境を確認してみます。
1 2 |
PS C:\windows\system32> $env:PSModulePath C:\Users\[User]\Documents\WindowsPowerShell\Modules;C:\Program Files\WindowsPowerShell\Modules;C:\windows\system32\WindowsPowerShell\v1.0\Modules |
ユーサフォルダについては、パスは通ってますが存在しないらしいので(^^;作った上で移動します。
1 |
PS C:\windows\system32> mkdir C:\Users\[User]\Documents\WindowsPowerShell\Modules |
この際展開した「PSWindowsUpdate」フォルダごと移動してください。
インターネットから落としたファイルは「実行がブロックされる」ことがあるので、インターネットから落としました、というZoneIDを削除する必要があります。
Microsoftがsysinternalsで配っているstreamsを使ってZoneIDを削除します。
1 2 3 4 5 6 7 8 9 10 11 |
PS C:\Users\[User]\Documents\WindowsPowerShell> <span style="color: #ff0000;">.\streams.exe -d -s .\Modules\*</span> streams v1.60 - Reveal NTFS alternate streams. Copyright (C) 2005-2016 Mark Russinovich Sysinternals - www.sysinternals.com C:\Users\[User]\Documents\WindowsPowerShell\Modules\Add-WUServiceManager.ps1: Deleted :Zone.Identifier:$DATAstrea …(中略) C:\Users\[User]\Documents\WindowsPowerShell\Modules\Update-WUModule.ps1: Deleted :Zone.Identifier:$DATA |
ここまできてようやくImportです。
1 |
PS C:\Users\[User]\Documents\WindowsPowerShell\Modules> Import-Module PSWindowsUpdate |
自動実行をするためのオプション設定
次は自動実行するためのオプションを探しましょう。
使うスクリプトはGet-WUInstallだけでよさそうです。
Helpをみるとものすごいたくさんのオプションがあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
名前 Get-WUInstall 概要 Download and install updates. 構文 Get-WUInstall [[-UpdateType] ] [[-UpdateID] <String[]>] [[-RevisionNumber] ] [[-CategoryIDs] ] [-IsInstalled] [-IsHidden] [-WithHidden] [[-Criteria] ] [-ShowSearchCriteria] [[-RootCategories] <String[]>] [[-Category] <String[]>] [[-KBArticleID] <String[]>] [[-Title] ] [[-Severity] <String[]>] [[-NotCategory] <String[]>] [[-NotKBArticleID] <String[]>] [[-NotTitle] ] [[-NotSeverity] <String[]>] [[-MaxSize] ] [[-MinSize] ] [-IgnoreUserInput] [-IgnoreRebootRequired] [[-ServiceID] ] [-WindowsUpdate] [-MicrosoftUpdate] [-ListOnly] [-DownloadOnly] [-AcceptAll] [-AutoReboot] [-IgnoreReboot] [-AutoSelectOnly] [-Debuger] [-WhatIf] [-Confirm] [] 説明 Use Get-WUInstall to get list of available updates, next download and install it. There are two types of filtering update: Pre search criteria, Post search criteria. - Pre search works on server side, like example: ( IsInstalled = 0 and IsHidden = 0 and CategoryIds contains '0fa1201d-4330-4fa8-8ae9-b877473b6441' ) - Post search work on client side after downloading the pre-filtered list of updates, like example $KBArticleID -match $Update.KBArticleIDs Update occurs in four stages: 1. Search for updates, 2. Choose updates, 3. Download updates, 4. Install updates. 関連するリンク http://gallery.technet.microsoft.com/scriptcenter/2d191bcd-3308-4edd-9de2-88dff796b0bc http://msdn.microsoft.com/en-us/library/windows/desktop/aa386526(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/aa386099(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/ff357803(VS.85).aspx Get-WUServiceManager Get-WUList |
特にオプションの説明がないので、動かしてやって適当なオプションを探しましょう(^_^;
(ソース読めって話もありますけどw)
まずはオプション無しで動かします。
1 |
PS C:\script> Get-WUInstall |
オプションなしだと、確認ダイアログが出てしまうようです。
下記だと確認ダイアログなしでちゃんと動いてくれました。
1 |
PS C:\script> Get-WUInstall -AcceptAll |
1 2 3 4 5 6 7 8 9 |
X Status KB Size Title - ------ -- ---- ----- 2 Accepted KB4018288 11 MB Microsoft Office 2013 (KB4018288) 64 ビット版 のセキュリティ更新プログラム 2 Accepted KB4018330 224 MB Microsoft Office 2013 (KB4018330) 64 ビット版 のセキュリティ更新プログラム 2 Accepted KB4093115 16 MB 2018-04 x64 ベース システム用 Windows Server 2012 R2 向けセキュリティのみの品質更新プログラム (KB4093115) … 3 Failed KB4018288 11 MB Microsoft Office 2013 (KB4018288) 64 ビット版 のセキュリティ更新プログラム 3 Failed KB4018330 224 MB Microsoft Office 2013 (KB4018330) 64 ビット版 のセキュリティ更新プログラム 3 Downloaded KB4093115 16 MB 2018-04 x64 ベース システム用 Windows Server 2012 R2 向けセキュリティのみの品質更新プログラム (KB4093115) … 4 Installed KB4093115 16 MB 2018-04 x64 ベース システム用 Windows Server 2012 R2 向けセキュリティのみの品質更新プログラム (KB4093115) … Reboot is required. Do it now ? [Y/N]: |
と思ったら、再起動するかどうかを聞いて来るようです。
いったん中断します。
ユーザがログインしてないことをquery sessionで確認し、Get-WURebootStatusを使用します。
1 2 |
PS C:\script> Get-WURebootStatus localhost: Reboot is required. Do it now ? [Y/N]: y |
-AutoReboot か -IgnoreRebootするかどちらかです。
Rebootはユーザに告知が必要な気がするので、今回は-IgnoreRebootで実施します。
1 |
PS C:\script> Get-WUInstall -AcceptAll -IgnoreReboot |
っていうか、進まない。
コントロールパネルからWindowsUpdateをみると、エラーが出ているようです。
エラー番号「80246007」で検索すると、バックグラウンド インテリジェント転送サービス(BITS)を再起動する、という情報が出てきます。
モジュールの容量が大きいので途中でダウンロードがコケてごみが残っているのでしょう。
ソースを見るとGet-WUInstallは、「0x80240044」以外のエラーコードを拾わない作りになっています。
このエラーは「管理者権限がないとタスクが実行できないセキュリティポリシーになってるよ」ってことみたいです。。
つまり権限問題以外は何度もリトライしてみてください、というコンセプトみたいです。
「本サーバは、毎晩再起動がかかります」という運用ポリシーに変えないとだめかもしれません。
とりあえず、下記をタスクスケジューラに入れて様子を見ることにします。
設定項目名 | 内容 |
---|---|
プログラム/スクリプト | %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe |
引数の追加 | -Command “C:\Users\[User]\Documents\WindowsPowerShell\Modules¥Get-WUInstall.ps1 -AcceptAll -AutoReboot” |
開始 | なし |
まとめ
- Windows Update PowerShell Moduleで自動化できる。
- Updateがコケることがあるので、何度も自動リトライするように設定する。
- 自動受入、自動再起動のオプションをつけて、タスクスケジューラに登録する。
- ダウンロードがコケた場合に備えて、定期Rebootを設定する。
Windowsサーバですから、定期リブートはしなきゃいけないですよねぇ…。
“PowerShellによるWindowsUpdateの自動化” に対して2件のコメントがあります。