みなさま、こんにちは。WSUS サポート チームです。
WSUS サーバーを長期間運用している、または自動承認規則で製品などにフィルターをかけずに運用していると、知らない間に更新プログラムのインストーラー (コンテンツ ファイル) が多くダウンロードされており、「ディスク サイズの空き容量がない!」といったトラブルが発生することがあります。WSUS は自動でメンテナンスを行う機能を持っておりませんので、ディスク サイズの空き容量が少なくなった場合は、「サーバー クリーンアップ ウィザード」を実行して、不要なファイルを削除する必要があります。
でも、「サーバー クリーンアップ ウィザードを実行しても、あまり不要なファイルが削除されない!空き容量が増えない!」という結果になったことはありませんしょうか。
そこで今回は、WSUS で不要な更新プログラムのインストーラーを確実に削除するためのポイントについてご紹介いたします。
・「サーバー クリーンアップ ウィザード」で WSUS で不要な更新プログラムのインストーラーを削除する
・「サーバー クリーンアップ ウィザード」実行後も 更新プログラムのインストーラーが削除できない場合
「サーバー クリーンアップ ウィザード」で WSUS で不要な更新プログラムのインストーラーを削除する
サーバー クリーンアップ ウィザード項目で「不要な更新ファイル」を実行することで、不要な更新ファイルを削除することができますが、削除対象となる更新プログラムは「拒否済み」のステータスとなっている必要があります。
そのため、以下の流れで不要な更新プログラムのインストーラーを削除します。
(作業の流れ)
STEP1 : 更新プログラムを「拒否済み」とする
↓
STEP2 : サーバー クリーンアップ ウィザードで「不要な更新ファイル」を実行する
「サーバー クリーンアップ ウィザード」実行後も更新プログラムのインストーラーが削除できない場合
上記流れで「サーバー クリーンアップ ウィザード」を実行した場合でも、更新プログラムのインストーラーが削除できないことがあります。代表的な要因は以下の通りです。
<要因 1 : WSUS オプション設定が既定から変更されている>
WSUS オプションの「更新ファイルと更新言語」にて、「更新プログラムが承認されている場合にのみ、更新ファイルをこのサーバーにダウンロードします」のチェックが既定では「オン」です。この設定が、「オフ」の構成の場合には、このままクリーンアップを実行しても「拒否済み」の更新プログラムのインストーラーを削除することは出来ません。このような構成の場合には、既定の「オン」に変更し、クリーンアップウィザード実施後に、再度、「オフ」に戻します。
<要因 2 : 「拒否済み」とした更新プログラムのインストーラーが他の更新プログラムで利用されており、かつ、インストール承認を行っている>
例として、以下の更新プログラムは、同一のインストーラーを利用しています。このような更新プログラムは、一方を「拒否済み」としても、もう一方で「インストール承認」済みの場合には、更新プログラムのインストーラーを削除することが出来ません。
Windows 7 for x64-based Systems 用の更新プログラム (KB974431)
Windows Server 2008 R2 x64 Edition 用の更新プログラム (KB974431)
見分け方としては、WSUS 管理コンソールで、「拒否済み」としても、ファイルの状態列はインストール承認ステータスのままとなります。
<要因 3 : 子 WSUS が「自律」の構成である もしくは 過去に「自律」の 子 WSUS が存在していた>
親子 WSUS 構成で、子 WSUS が「自律」の場合、子 WSUS 側で親 WSUS とは異なる承認情報を保持できます。たとえば、親 WSUS 側では未承認の更新プログラムも、子 WSUS が必要とすれば、親 WSUS は Microsoft Update カタログから更新プログラムのダウンロードを行います。このような処理に伴い、「子 WSUS の要求によりダウンロードした」ものであることを示すフラグを、データベース内のファイル情報に対して設定します。
このフラグが設定されたファイルは、親 WSUS 側でサーバー クリーン アップウィザードを実行しても削除されないよう設計されています。過去に子 WSUS が存在し、現在はすでに登録解除を行っている場合にもこの状態は変化いたしません。このため、サーバー クリーンアップ ウィザードでこのフラグが設定された不要な更新プログラムのインストーラーを削除できるようにするためには、データベースに対して SQL を発行し、フラグを解除する作業が必要になります。
子 WSUS 側で必要とした更新プログラムの有無の確認方法 と 設定されたフラグを解除する方法 (※)をご紹介します。
(※ 重要) データーベース内の情報を変更する操作となりますので、事前に必ず WSUS データーベースのバックアップをご実施ください。
WSUS 3.0 SP2 をデータベースごと移行する方法について
http://blogs.technet.com/b/jpwsus/archive/2012/09/20/wsus-sql-migration.aspx
<< 子 WSUS 側で必要とした更新プログラムの有無の確認 と 設定されたフラグを解除する方法>>
親 WSUS 側で子 WSUS によって必要とされている更新プログラムの有無は、WSUS 管理コンソールから目視で確認をすることができません。以下の手順にて、フラグが設定されている更新プログラムが存在するか確認します。
補足:
手順は、WSUS のデータベースが、SQL Server であるか Windows Internal Database (WID) で
あるかで異なります。どちらのデータベースを現在利用しているかにつきましては、WSUS サーバーの
以下のレジストリから判断できます。
%computername%\MICROSOFT##SSEE となっていれば、WID です。それ以外は SQL Server です。
******
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Update Services\Server\Setup]
- SqlServerName (REG_EXPAND_SZ)
******
SQL Server 環境の手順
1. SQL Server Management Studio を起動し、WSUS のデータベースを実行しているデータベース エンジンに接続します。
2. Microsoft SQL Server Management Studio 画面が起動したら、画面左ペインの[データベース] ツリーを展開します。
3. [SUSDB] を右クリックし [新しいクエリ] をクリックします。
4. 右ペインに表示された新しいクエリ画面に、以下のとおり入力し、ツールバーの [実行] をクリックするかもしくは F5 キーを押して、実行を開始します。
SELECT COUNT(DSSRequestedDownload) FROM dbo.tbFileOnServer WHERE DSSRequestedDownload = 1
※この結果、2 行目に表示される数値が 0 以外であれば、フラグの設定を持つ更新プログラムのが存在しています。
その場合は引き続き下記の手順をご実施します。
<手順>
5. 引き続き下記 2 件のコマンドを順に実行します。
update tbfileOnServer set actualstate=1 where (actualstate=8 or actualstate=9 or actualstate=10) and DSSRequestedDownload = 1
update tbFileOnServer set DSSRequestedDownload = 0 WHERE DSSRequestedDownload = 1
6. 正しく変更されたかの確認のために、下記コマンドを実行します。
SELECT COUNT(DSSRequestedDownload) FROM dbo.tbFileOnServer WHERE DSSRequestedDownload = 1
結果が 0 なら正しく変更されています。
WID 環境の手順
1. 管理者権限でコマンドプロンプトを起動します。
2. 下記コマンドにてフォルダを移動します。
cd /d %ProgramFiles%\Update Services\setup
3. 引き続き下記コマンドを実行します。executesql.exe は実行結果をプロンプト画面に表示しませんので、出力先ファイル名を指定し、その内容を確認する手順となります。「一行として」投入してください。
executesql.exe -S %computername%\MICROSOFT##SSEE -d "SUSDB" -Q "SELECT COUNT(DSSRequestedDownload) FROM dbo.tbFileOnServer WHERE DSSRequestedDownload = 1" -l result1.txt
4. 以下のコマンドを実行して出力ファイル内容を確認します。
TYPE result1.txt
結果出力例)
<no name>
10591
※この結果、2 行目に表示される数値が 0 以外であれば、フラグの設定を持つ更新プログラムのが存在しています。
その場合は引き続き下記の手順をご実施します。
<手順>
5. 引き続き下記2件のコマンドを順に実行します。
executesql.exe -S %computername%\MICROSOFT##SSEE -d "SUSDB" -Q "update tbfileOnServer set actualstate=1 where (actualstate=8 or actualstate=9 or actualstate=10) and DSSRequestedDownload = 1"
executesql.exe -S %computername%\MICROSOFT##SSEE -d "SUSDB" -Q "update tbFileOnServer set DSSRequestedDownload = 0 WHERE DSSRequestedDownload = 1"
6. 正しく変更されたかの確認のため、下記コマンドを実行します。
末尾のファイル名 result2.txt は任意の名前で結構です。
executesql.exe -S %computername%\MICROSOFT##SSEE -d "SUSDB" -Q "SELECT COUNT(DSSRequestedDownload) FROM dbo.tbFileOnServer WHERE DSSRequestedDownload = 1" -l result2.txt
7. 以下のコマンドを実行してファイル内容を確認します。
2 行目に表示される数値が 0 なら正しく変更されています。
TYPE result2.txt
結果出力例)
<no name>
0