Windowsの運用管理を快適にする10の裏ワザ/表ワザ
[ テクニカルライター 山市 良 ]

テクニック.2 - Windows Updateはお任せではなく、戦略的に

2021年08月17日配信
2023年09月28日更新

yamaichi_tec002_top_1800x540

 

 Windows 10になって、Windows Updateの仕組みは大幅に再設計され、Windows 8.1以前のようなユーザー側でコントロールできる部分が少なくなりました。Windows 10になってからも、新しいバージョンで次々に変更が加えられてきています。

 Windows 10のWindows Updateの仕組みは、Windows Server 2016以降のデスクトップエクスペリエンスにも共通のものが搭載されています。中には、長期運用が前提のWindows Serverには余計とも思える機能もあります。例えば、再起動が必要な品質更新プログラムのインストールで再起動待ちになり、そのまま放置すると、アクティブ時間外に自動的に再起動が始まってしまう仕様がWindows Serverにも組み込まれています。また、[更新プログラムのチェック]をクリックすると、インストールが必須ではないオプションの更新プログラムのダウンロードとインストールが始まってしまうのも同じOSビルドのWindows 10と同じです。

 WindowsおよびWindows Serverの品質更新プログラムは米国時間で毎月第2火曜日にセキュリティ更新を含む累積更新プログラムがリリースされ(Bリリースと呼ぶことがあります)、自動更新が有効な場合は自動配布されます。2021年4月時点では、Windows 10バージョン1809およびWindows Server 2019以降を対象に、その翌週、または翌々週にWindowsと.NET Frameworkのそれぞれに対してオプションの更新プログラムがリリースされます(Cリリース、累積更新プログラムのプレビューと呼ぶことがあります)。.NET FrameworkのBリリース、Cリリースについては、リリースされない月もあります。

 オプションの更新プログラムは新たなセキュリティ更新を含まないため、インストールは任意です。オプションの更新プログラムで修正される問題を抱えていて、できるだけすぐに問題を解消したい、重要な変更点をテストしたいといった場合にのみインストールすればよいのです。しかし、[更新プログラムのチェック]をクリックしてしまうと、意図せず、オプションの更新プログラムを受け取ってしまいます(画面1)。

 

001

画面1 [更新プログラムのチェック]をクリックしてしまうと、意図せず、オプションの更新プログラムのダウンロードとインストールが
始まってしまうことがある。アクティブ時間外の自動再起動もサーバーの安定運用を妨げる余計な機能

 

■ 長く変わらず、信頼できるWindows Update Agent(WUA)API

 古いバージョンのWindowsから引き継いだ、変更されていない更新機能の1つに、Windows Update Agent(WUA)APIを利用する方法があります。

 以下のサイトにWUA APIを利用して更新プログラムの確認、ダウンロード、インストールを行うサンプルスクリプトWUA_SearchDownloadInstall.vbsが公開されています。

Searching, Downloading, and Installing Updates
https://docs.microsoft.com/ja-jp/windows/win32/wua_sdk/searching--downloading--and-installing-updates

 以前は更新の各ステップをY/Nの入力で対話的に実行するシンプルなスクリプトでしたが、最近、いくつかの新しいパラメーターをサポートする高機能版に差し替えられました(古いスクリプトは別のURLのページにアーカイブされています)。新しいスクリプトをパラメーター無しで実行すると、以前のスクリプトと同様に対話的に更新の確認、インストールの選択、ダウンロード、およびインストールを行うことができます。このスクリプトを利用して更新プログラムをインストールするには、管理者権限で実行する必要があります。

 次のように/Automateパラメーターを追加して実行すると、利用可能な更新プログラムを確認し、検出されたすべてをインストールできます(画面1)。ただし、EULA(ライセンス条項)に同意する必要がある更新プログラムについてはスキップされます。

Cscript WUA_SearchDownloadInstall.vbs /Automate 

 

002

画面2 WUA_SearchDownloadInstall.vbsによる更新プログラムのインストールの自動化

 

*2 旧サンプルスクリプトのアーカイブ先

https://docs.microsoft.com/en-us/previous-versions/windows/desktop/aa387102(v%3dvs.85)

 現在のWindows 10およびWindows Server 2019以降は、Windowsの累積更新プログラムのプレビューはWindows 10で新たに追加されたUpdateOrchestratorサービスによって検出されます。WUA APIは、Windowsの累積更新プログラムのプレビュー(Cリリース)や定例外のオプションの更新プログラム(Out-of-bandリリース)は検出しません。.NET Frameworkの累積更新プログラムのプレビュー(Cリリース)はWUA APIの検索対象に入ります。

 

SconfigユーティリティとWindows Admin  CenterはWUA APIで動く

  Windows ServerはSconfigというテキストベースのユーティリティを搭載しています。Windows Server 2012以降のSconfigユーティリティはWindows Serverのインストールの種類(GUI使用サーバー/デスクトップエクスペリエンスとServer Core)に関係なく、どちらでも利用できます。Sconfigユーティリティの[6 更新プログラムのダウンロードとインストール]は、WUA APIを利用するWSHスクリプト(C:\Windows\System32\ja-jp\WUA_SearchDownloadInstall.vbs)として実装されており、利用可能な更新プログラムの検索、インストールする更新プログラムの選択、およびダウンロードとインストールを実行できます(画面3)。本書で紹介したサンプルスクリプトと同じファイル名ですが、内容は異なります。現在の高機能版に差し替えられる前の古いバージョンのWUA_SearchDownloadInstall.vbsをベースとしています。

※Windows Server 2022/Azure Stack HCIからはPowerShellで Sconfig が構築されています。

 前述したように、WUA APIはWindowsの累積更新プログラムのプレビューを検出しません。そのため、Sconfigを利用すればデスクトップエクスペリエンス環境で意図せずWindowsの累積更新プログラムのプレビューがインストールされるのを防止できます。なお、「推奨される更新プログラムのみ(R)」の検索は現在、期待どおりに機能しなくなりました。これは検索条件(Criteria)としての「AutoSelectOnWebSites=1」が推奨される更新プログラムに設定されない場合があるためです。

 

003画面3 Windows Serverはインストールの種類に関わらず、Sconfigユーティリティを使用可能。[6 更新プログラムのダウンロードとインストール]はWUA APIを利用したスクリプトで実装されている

 

 マイクロソフトは2018年4月、HTML5ベースのサーバー管理アプリWindows Admin Centerをリリースし、概ね半期 に一度、更新バージョンをリリースしています。Windows Admin Centerは、Windows Server 2012 R2以降の Windows Server、フェールオーバークラスター、Azure Stack HCIクラスター、およびWindows 10のリモート管理 に対応しています。Windows Admin Centerの[更新プログラム]ツールはWUA APIを利用して不足している更新プ ログラムの確認とインストールの選択、ダウンロードとインストールを行います。再起動が必要な更新プログラムがあ る場合は、再起動の日時をスケジューリングして実施することができるので、更新プログラムのインストールに起因す る再起動が業務時間内に行われるのを回避できます(画面4)。

 

004

画面4 Windows Admin Centerを利用すると、更新のための再起動を計画的に実施できる

 

■不足しているセキュリティ更新をレポートする(オンラインスキャン)

 WUA_SearchDownloadInstall.vbsに/NoDownloadおよび/NoInstallパラメーターを指定して実行すると、ダウンロー ドとインストールは行わずに、スキャン結果だけをレポートしてくれます。この機能は稼働中のサーバーの更新状態を調査するのに便利です(画面5)。なお、スキャンの実行のみであれば、管理者権限は不要です。

Cscript WUA_SearchDownloadInstall.vbs /NoDownload /NoInstall 

 

005

画面5 WUA_SearchDownloadInstall.vbsでスキャンだけを実施し、不足している更新プログラムを調査する

 

■不足しているセキュリティ更新をレポートする(オフラインスキャン)

 WUA_SearchDownloadInstall.vbsはオフラインスキャンにも対応しています。最新のオフラインスキャンファイルであるWSUSSCN2.cabを入手し、/OfflineパラメーターにWSUSSCN2.cabのパスを指定すると(C:\work\WSUSSCN2.cabのように、絶対パスで指定する必要があります)、インターネット接続の制限されたコンピューターに対してスキャンを実行することができます。オフラインスキャンもスキャンの実行のみであれば、管理者権限は不要です。 

Cscript  WUA_SearchDownloadInstall.vbs /Offline:<絶対パス>\WSUSSCN2.cab /NoDownload  /NoInstall 

最新のWSUSSCN2.cabのダウンロード(米国時間毎月第2火曜日に更新)

http://download.windowsupdate.com/microsoftupdate/v6/wsusscan/wsusscn2.cab

 

 オンラインスキャンは、オプションの更新プログラムをインストールが必要な更新プログラムとして検出しますが、オ フラインスキャンは自動配布対象のセキュリティ更新および重要な更新のみを対象としています。次のようにオフライ ンスキャンと/Automateオプションを組み合わせることで、オフラインスキャンに基づいて本当に必要な更新プログラ ムだけを自動的にインストールすることができ便利です(画面6)。更新プログラムのダウンロードとインストールまで 行う場合、管理者権限で実行する必要があります。

Cscript WUA_SearchDownloadInstall.vbs /Offline:<絶対パス>\wsusscn2.cab /Automate

 

006

画面6 最新のWSUSSCN2.cabを使用してオフラインスキャンを実施する。/NoDownload /NoInstallパラメーターの 代わりに/Automateパラメーターを指定すると、オフラインスキャンに基づいてインストールを行うことも可能

 

■更新履歴を表示する

 WindowsおよびWindows Serverのデスクトップエクスペリエンスには、インストールの成功と失敗を含む更新の履歴 を表示する機能があります。Windows ServerのServer Coreには更新の履歴を表示する機能はありません。

 WUA APIを利用した次のサンプルスクリプトGet-WUHistory.vbsを使用すると、Windows標準の更新の履歴と同等の 履歴情報を取得することができます(画面7)。Windows ServerのServer Coreでも利用できます。履歴情報を取得 するために、管理者権限は必要ありません。

 

Get-WUHistory.vbsのスクリプト 注:UTF-8ではなくANSIコード(シフトJIS)で保存すること

 Set  objSession = CreateObject("Microsoft.Update.Session") 

 Set  objSearcher = objSession.CreateUpdateSearcher 

 intCount  = objSearcher.GetTotalHistoryCount 

 Set  colHistory = objSearcher.QueryHistory(0, intCount) 

 For  Each objHistory In colHistory 

 If objHistory.HResult = 0 then 

 WScript.Echo DateAdd("h",9,objHistory.Date) & ",  " & objHistory.Title & ", 成功" 

ElseIf objHistory.HResult = -2145116140  then 

 WScript.Echo  DateAdd("h",9,objHistory.Date) & ", " &  objHistory.Title & ", 成功(再起動が必要な更新)" 

Else 

 WScript.Echo  DateAdd("h",9,objHistory.Date) & ", " &  objHistory.Title & ", 失敗(エラーコード:0x" & Hex(objHistory.HResult) & ")" 

 End If 

 Next 

  

 このスクリプトはインストールの結果コードに基づいて、成功(0)と失敗(0以外)を判断し、失敗の場合はエラーコ ードを出力します。エラーコードの一覧は以下のサイトで確認することができます。2つ目のIf文で評価している-2145116140(0x80242014)は再起動の保留状態を示しており、再起動されると結果コードに0がセットされます。しかし、筆者が確認した限り、Windows 10バージョン2004および20H2では再起動後も結果コードが0にセットされない不具合があるようです。そのため、「成功(再起動が必要な更新)」として出力するようにしました。

Windows Update の一般的なエラーと軽減策

https://docs.microsoft.com/ja-jp/windows/deployment/update/windows-update-errors

 

007

画面7 WUA APIを利用して成功/失敗を含む更新プログラムのインストール履歴を取得する

 

■ディスク領域節約と更新時間の改善に効く、Windows Updateのクリーンアップ

 Windows Updateを実施して、安定運用の状態を確認できている場合は、定期的に、例えば数か月に一度にWindows Updateのクリーンアップを実施することをお勧めします。Windows Updateのクリーンアップを実施すると、古いファ イルの削除や圧縮が行われ、ディスクの使用領域を数GB単位で解放できる場合があります。また、次回のWindows Updateのパフォーマンス改善を期待できます。ただし、クリーンアップ後は古い更新プログラムをアンインストールで きなくなるため、必ず安定運用の状態にあることを確認してから実施してください。

 Windows Updateのクリーンアップを実施するには、[ディスククリーンアップ](cleanmgr.exe)を管理者権限で実 行し、[Windows Updateのクリーンアップ]を選択します(画面8)。クリーンアップで増加するディスク領域のサイズは不正確な場合があります(例:1MBや3.66 TBといったありえないサイズを報告)が、クリーンアップの実施には影響はありません。Windows 10の場合、[ディスククリーンアップ]ではなく、[設定]アプリの[システム|記憶域|一時ファイル]から[Windows Updateのクリーンアップ]を選択して削除することもできます。

 コンピューターのスペックやインストールされている更新プログラムの数にもよりますが、通常、数時間かかかります。100%に近くなっても、それから数時間かかることもあるので、根気よく待ってください。

 

008

画面8 [ディスククリーンアップ](cleanmgr.exe)を実行してWindows Updateのクリーンアップを選択

 

 [ディスククリーンアップ](cleanmgr.exe)は、WindowsおよびWindows Server 2016以降のデスクトップエクス ペリエンスに標準で含まれます。Windows Server 2012 R2以前の場合は、サーバーの機能[デスクトップエクスペリ エンス]を有効化することでインストールされます。Server Coreでは使用できません。また、理由は不明ですが、 Windows Serverの場合は[Windows Updateのクリーンアップ]の項目が表示される場合とされない場合があるようです。

Windows Serverでのディスククリーンアップの使用について

https://docs.microsoft.com/ja-jp/windows-server/storage/file-server/disk-cleanup

 Server Coreの場合、および[Windows Updateのクリーンアップ]の項目が表示されない場合は、次のコマンドラインを管理者権限で実行することで、同様の効果が期待できます。/ResetBaseパラメーターは省略できますが、指定することでより多くの領域を解放できます(画面12)。ただし、アンインストール用に保持されていた、更新で置き換えられたバイナリがすべて削除されることに注意してください。/ResetBaseパラメーターを指定しない場合、不要なコンポーネントだけがクリーンアップされ、コンポーネントストア(C:¥Windows¥WinSxS)のサイズが最適化されます。

DISM /Online /Cleanup-Image /StartComponentCleanup /ResetBase 

 

009

画面9 Server CoreでWindows Updateの不要なコンポーネントと更新で置き換えられた古いバイナリをクリーンアップする

 

%WINDIR%¥SoftwareDistributionのリセット

 Windows 10およびWindows Server 2016以降のWindows Updateが原因不明のエラーで失敗を繰り返す場合、更新 プログラムのダウンロード先(¥Download)やデータベース(¥DataStore¥Datastore.edbなど)を含む%Windir%¥SoftwareDistributionディレクトリをリセットする(削除して再作成させる)ことで解消する場合があります。 SoftwareDistributionディレクトリの再作成を含むWindows Updateのコンポーネントのリセットの完全な手順については、以下のドキュメントで説明されています。

Windows Update - 追加リソース|Windows Update のコンポーネントをリセットする方法

https://docs.microsoft.com/ja-jp/windows/deployment/update/windows-update-resources#how-do-i-reset-windows-update-components

 

 上記の手順は複雑ですが、SoftwareDistributionのリセットだけで多くの問題が解消します。それには、コマンドプロ ンプトを管理者として開き、次の一連のコマンドラインを実行してWindows Update関連のサービスを停止し(ほとんどの場合、wuauservの停止のみでよい)、%WINDIR%\SoftwareDistributionディレクトリをリネーム後に削除します。

 NET STOP wuauserv 

 NET STOP bits 

 NET STOP cryptsvc 

 NET STOP msiserver 

 NET STOP usosvc 

 NET STOP dosvc 

 REN %WINDIR%¥SoftwareDistribution SoftwareDistibution.old 

 RD %WINDIR%¥SoftwareDistibution.old /S 

  Windows Update(wuauserv)サービスが自動開始されてしまうとSoftwareDistributionディレクトリのリネームに失敗するので、その場  合は再度停止後にすばやくリネームしてください。もしくは、Windows Updateサービスのスタートアップを“無効”に変更してコンピューターを再起動し、SoftwareDistributionディレクトリをリネーム後に“手動”に戻します。

 

※本ページは2022年6月22日現在の情報です。

 

■ ホワイトペーパーをダウンロードする

  こちらのページの続きを含めた、全10テクニックをまとめたホワイトペーパーをご覧いただけます。以下のフォームよりお申込みください。

 

■ Windows Update の適用状況を正確に把握する方法

 山市氏がご紹介したテクニックをより簡単に実施する方法をご紹介します。

詳しくはこちらをご確認ください。
https://www2.say-tech.co.jp/special/ryo-yamaichi/say/tec-002

最新記事