WSUSについて



●WSUSの再構築について

 参考URL:WSUSの再構築(2017.3.9)

 上記URLを参照して再構築に取り掛かりましたが、確認方法が悪くうまく再構築できませんでした。
 少し手を加えたところ、正常に再構築できましたので、メモとして残します。

    【WSUSの削除】
  • 役割と機能の削除
    役割:Windows Server Update Service
    機能:Windoes Internal Database
     ※上記、WIDの機能が間違いなく削除されるようにチェックが入っているかどうか確認すること。
    を削除
  • OS再起動
  • D:(コンテンツの保存先)のファイル(WSUSContaintsなど)をすべて削除
  • IISのサイトから「WSUSの管理」を削除
  • IISのアプリケーションプールからWSUSを削除
  • C:\Windows\WIDをWID.oldにリネーム(削除でも可)
  • WSUS管理コンソールのキャッシュ %appdata%\Microsoft\MMC\wsusを削除
  •  ※面倒かもしれませんが、1回ずつ再起動した方が良いです。


●WSUSについて(on Windows Server 2016 + DC)

 参考URL:WSUS コンソールにアクセスできない
 参考URL:[解決]WIDインストール失敗-サービスMSSQL$MICROSOFT##WIDを開始できません。

 WSUSとドメインコントローラ(DC)の同居はすんなり構築できないことはWindows Server 2008の頃から分かっていたのですが、ちょっとチャレンジしてみました。
 今回はWindows Server 2016にDC機能を追加する前にWSUSを構築してみました。
 問題なくWSUSをインストールすることができました。
 どのOSからか忘れましたがWindows Firewallが起動してないとWSUSクラインととしても、WSUSサーバとしても更新(同期)できません(仕様らしいです)ので注意してください。
 構築したWSUSの同期が完了し、インターネット上のWSUSからダウンロードも開始し始めました。
 この後、該当サーバをDC化してみたところ、想像していたとおりWSUSのコンソールにも接続できなくなり、同期も停止しているようです。
 サービスからWSUSを再起動しても起動しません。イベントビューアに関係のありそうなエラーが記録されていました。
 インターネットで検索したところ似たような内容の記事(「[解決]WIDインストール失敗-サービスMSSQL$MICROSOFT##WIDを開始できません。」)がありました。
 記事に記載されている方法で対処しました。
 まず、コンピュータの管理からサービスを開き、Windows Internal Databaseのプロパティを開きます。
 「ログオン」タブを選択し、Windows Internal Databaseのパスワードが●●で埋め尽くされている箇所(2行とも)を全部選択して削除し、OKを押して閉じます。
 次に、Windows Server 2016なのでグループポリシー管理を編集モードで開きます。
 「Default Domain Default Policy」を右クリックし「編集」を選択。
 「コンピューターの構成」ー「ポリシー」ー「Windowsの設定」ー「セキュリティの設定」ー「ローカルポリシー」ー「ユーザー権利の割り当て」と開きます。
 「サービスとしてログオン」を開き「これらのポリシーの設定を定義する」にチェックを入れ、「NT SERVICE\ALL SERVICES」アカウントを強制的に追加します。
 ポリシーが設定されていることが確認できたら、コマンドプロンプトを開きます。
 「gpupdate /force」コマンドでグループポリシーをアップデートします。
 この後、サービスでWSUS(Windows Update)を再起動したところコンソールに正常に接続できるようになり、DCの機能を追加する以前と同様に、同期後、ファイルをダウンロードするようになりました。

●不要な更新プログラムを拒否済みにする方法

 参考URL:不要な更新プログラムは「拒否済み」に設定しよう!

 

●WSUSクリーンアップ ウィザードにてタイムアウトが発生する

 参考URL:WSUS クリーンアップ ウィザードにてタイムアウトが発生する
 参考URL:WSUS DB インデックスの再構成の手順について
 参考URL:WSUS メンテナンス ガイド

その1

 WSUS管理画面(GUI)のクリーンアップウィザードを実行すると頻繁にタイムアウトを引き起こします。
 これは定期的にクリーンアップを実施していないことが原因であることが多いようです。
 GUIでダメならCUI(コマンドプロンプト)で実施してみます。
Powershell -Command "Get-WsusServer | Invoke-WsusServerCleanup -CompressUpdates -CleanupObsoleteUpdates"
Invoke-WsusServerCleanup : 実行タイムアウトの期限が切れました。操作完了前にタイムアウト期間が過ぎたか、サーバーが応答し
ていません。
発生場所 行:1 文字:18
+ ... susServer | Invoke-WsusServerCleanup -CompressUpdates -CleanupObsolet ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (Microsoft.Updat...rCleanupCommand:InvokeWsusServerCleanupCommand) [Invoke-
   WsusServerCleanup]、SqlException
    + FullyQualifiedErrorId : UnexpectedError,Microsoft.UpdateServices.Commands.InvokeWsusServerCleanupCommand
 何度も手動で試してみましたが、同じエラーが表示され続けます。WSUS DBのインデックス再構築を実施(途中からMicrosoft SQL Server Managementをインストールして実施)したところ、60万以上のフラグメントが解消されたようなログが出力されます(この作業を何度も繰り返しました)。
Estimating fragmentation: Begin. 2019-03-13 11:02:26.913
Number of indexes to rebuild: 11
Estimating fragmentation: End. 2019-03-13 11:03:07.483
2019-03-13 11:03:08.163 Executing: ALTER INDEX [nc1BundleDependency] ON [dbo].[tbBundleDependency] REORGANIZE
2019-03-13 11:03:08.473 Done.
2019-03-13 11:03:08.473 Executing: ALTER INDEX [PK__tbXml__D14A66A91C5FD132] ON [dbo].[tbXml] REORGANIZE
2019-03-13 11:03:12.657 Done.
2019-03-13 11:03:12.657 Executing: ALTER INDEX [UQ__tbRevisi__FFEE7450C7C5F31B] ON [dbo].[tbRevision] REORGANIZE
2019-03-13 11:03:12.663 Done.
2019-03-13 11:03:12.663 Executing: ALTER INDEX [nc6DeploymentRevision] ON [dbo].[tbDeployment] REORGANIZE
2019-03-13 11:03:12.670 Done.
2019-03-13 11:03:12.670 Executing: ALTER INDEX [nc2DeadDeployment] ON [dbo].[tbDeadDeployment] REORGANIZE
2019-03-13 11:03:18.410 Done.
2019-03-13 11:03:18.410 Executing: ALTER INDEX [nc1PreComputedLocalizedProperty] ON [dbo].[tbPreComputedLocalizedProperty] REORGANIZE
2019-03-13 11:03:36.750 Done.
2019-03-13 11:03:36.750 Executing: ALTER INDEX [PK__tbEventI__94C75A078AD0A943] ON [dbo].[tbEventInstance] REORGANIZE
2019-03-13 11:03:37.537 Done.
2019-03-13 11:03:37.540 Executing: ALTER INDEX [nc3EventInstanceConstraint] ON [dbo].[tbEventInstance] REORGANIZE
2019-03-13 11:03:37.733 Done.
2019-03-13 11:03:37.733 Executing: ALTER INDEX [nc2EventInstance] ON [dbo].[tbEventInstance] REORGANIZE
2019-03-13 11:03:38.090 Done.
2019-03-13 11:03:38.093 Executing: ALTER INDEX [nc_EventNamespaceID_EventID] ON [dbo].[tbEventInstance] REORGANIZE
2019-03-13 11:03:38.140 Done.
2019-03-13 11:03:38.140 Executing: ALTER INDEX [nc1FileForRevision] ON [dbo].[tbFileForRevision] REORGANIZE
2019-03-13 11:03:45.913 Done.
Estimated number of pages in fragmented indexes: 624744
Estimated number of pages freed: 317
Updating all statistics.2019-03-13 11:03:46.093
 手動でやり続けるのは面倒なので、タスクスケジューラを使用して(Powershell -Command "Get-WsusServer | Invoke-WsusServerCleanup -CompressUpdates -CleanupObsoleteUpdates"を)5分毎に実行するように設定しました。
 8時間後、更に1日後にインデックス再構築を実行しましたが、同様に60万以上のフラグメントの処理を実施した、というログが出力され続け、結局のところ丸2日以上経過した後にインデックス再構築を実施したところ、フラグメントの処理が一桁になりました。
 2年近く放置していましたので、やはり、定期的にクリーンアップとインデックス再構築は実施する必要がありそうです。
 クリーンアップとインデックス再構築を毎回タスクスケジューラに用のスクリプトを登録しました。
▼クリーンアップ用コマンド
Powershell -Command "Get-WsusServer | Invoke-WsusServerCleanup -CompressUpdates -CleanupObsoleteUpdates -CleanupObsoleteComputers -CleanupUnneededContentFiles -DeclineExpiredUpdates -DeclineSupersededUpdates" > d:\wsus\wsusClean.txt
▼インデックス再構築用コマンド(環境によってSQLCMD.EXEのインストール場所が異なることがあります)
"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE" -S \\.\pipe\Microsoft##WID\tsql\query -i C:\WSUS\wsusdbmaintenance.sql -I -o d:\wsus\reindexout.txt
"C:\Program Files (x86)\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn\SQLCMD.EXE" -S \\.\pipe\Microsoft##WID\tsql\query -i C:\wsus\SUSDBMaint.sql -I -o d:\wsus\reindexout.txt
 SQLCMD.EXEへのパスが間違っていると下記のようなエラーが表示されることがあります。
Failed to load resource sqlcmd.rll


その2

 上記の「クリーンアップ用コマンド」を定期的に実行する場合、WSUSコンソールで自動同期のタイミングとバッティングすると、結果として「取り消されました」ということになり自動同期が失敗します。
 そこでクリーンアップ用コマンドを下記の2つに分け、それぞれ用にタスクスケジューラを作成しました。
Powershell -Command "Get-WsusServer | Invoke-WsusServerCleanup -CompressUpdates -CleanupObsoleteUpdates > d:\wsus\wsusClean.txt ← ①
Powershell -Command "Get-WsusServer | Invoke-WsusServerCleanup -CleanupObsoleteComputers -CleanupUnneededContentFiles -DeclineExpiredUpdates -DeclineSupersededUpdates" > d:\wsus\wsusCleanOther.txt ← ⓶
 ①のタスクスケジューラを1日24個に分割し、1時間に1個のタスクになるよう下記のとおり設定(基本タスクの作成)します。
CleanupObsolete0000 ← 0時台用のスケジューラ
CleanupObsolete0100 ← 1時台用のスケジューラ
CleanupObsolete0200 ← 2時台用のスケジューラ
 :
 :
CleanupObsolete2300 ← 23時台用のスケジューラ
 設定内容は下記のとおりです。
CleanupObsolete0000(0時台用)のスケジューラ
 仮設定作業
  名前:CleanupObsolete0000
  トリガー(いつタスクを開始しますか):毎日
  毎日:開始:2019/5/1 00:00:00(「タイムゾーン間で同期」はチェックを入れない)
     間隔:1日
  操作:「プログラムの開始」を選択
  プログラムの開始:プログラム/スクリプト:powershell
  引数の追加(オプション):-Command "Get-WsusServer | Invoke-WsusServerCleanup -CompressUpdates -CleanupObsoleteUpdates > d:\wsus\wsusClean.txt
  開始(オプション):(空欄のまま)
 このままでは設定したタスクは1日に1回指定した時刻のみ動作するだけです。これではまだ設定が足りませんので、更に設定をいじります。該当タスクのプロパティを開きます。
 「全般」タブ:「ユーザーがログオンしているかどうかにかかわらず実行する」を選択
        「パスワードを保存しない」にはチェックを入れない
 「トリガー」タブ:設定されている内容を選択し編集します。
          詳細設定:「繰り返し間隔」で「10分間」、「継続時間」で「1時間」を選択します。
          (これで0時台は10分間隔でタスクが動作します。)
 「OK」をクリックし「トリガーの編集」を閉じます。
 (全般・トリガー・操作・条件・設定・履歴が表示されている)該当プロパティの「OK」をクリックし、タスクを実行するアカウントを尋ねられますのでアカウント(通常はadministrator)とパスワードを入力します。
 残りのタスク23個も同様に作業し、作業後、自動同期と重なりそうな時間帯のタスクのみを無効にします。

 ⓶のタスクを作成します。
WSUSCleanUpOther(3時間毎)のスケジューラ
 仮設定作業
  名前:WSUSCleanUpOther
  トリガー(いつタスクを開始しますか):毎日
  毎日:開始:2019/5/1 00:10:00(「タイムゾーン間で同期」はチェックを入れない)
     間隔:1日
  操作:「プログラムの開始」を選択
  プログラムの開始:プログラム/スクリプト:powershell
  引数の追加(オプション):-Command "Get-WsusServer | Invoke-WsusServerCleanup -CleanupObsoleteComputers -CleanupUnneededContentFiles -DeclineExpiredUpdates -DeclineSupersededUpdates" > d:\wsus\wsusCleanOther.txt
  開始(オプション):(空欄のまま)
 このままでは設定したタスクは1日に1回指定した時刻のみ動作するだけです。これではまだ設定が足りませんので、更に設定をいじります。該当タスクのプロパティを開きます。
 「全般」タブ:「ユーザーがログオンしているかどうかにかかわらず実行する」を選択
        「パスワードを保存しない」にはチェックを入れない
 「トリガー」タブ:設定されている内容を選択し編集します。
          詳細設定:「繰り返し間隔」で「3時間」、「継続時間」で「1日間」を選択します。
          (これで毎日3時間毎にタスクが動作します。)
 「OK」をクリックし「トリガーの編集」を閉じます。
 (全般・トリガー・操作・条件・設定・履歴が表示されている)該当プロパティの「OK」をクリックし、タスクを実行するアカウントを尋ねられますのでアカウント(通常はadministrator)とパスワードを入力します。
 ⓶のタスクスケジューラは3時間毎に動作しますので、場合によっては自動同期と重なってしまい自動同期が動作する場合があります。これは、自動同期を3回/日や6回/日にすることにより、タスクと自動同期が重ならないタイミングがあるようにすればその時に自動同期できますので、それで良とします。

 最後にインデックス再構築用コマンドのタスクを作成します。
WSUSCleanUpOther(3時間毎)のスケジューラ
 仮設定作業
  名前:WSUS DBRE-Index
  トリガー(いつタスクを開始しますか):毎日
  毎日:開始:2019/5/1 00:50:00(「タイムゾーン間で同期」はチェックを入れない)
     間隔:1日
  操作:「プログラムの開始」を選択
  プログラムの開始:プログラム/スクリプト:"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE"
  引数の追加(オプション):-S \\.\pipe\Microsoft##WID\tsql\query -i C:\WSUS\wsusdbmaintenance.sql -I -o d:\wsus\reindexout.txt
  開始(オプション):(空欄のまま)
 このままでは設定したタスクは1日に1回指定した時刻のみ動作するだけです。これではまだ設定が足りませんので、更に設定をいじります。該当タスクのプロパティを開きます。
 「全般」タブ:「ユーザーがログオンしているかどうかにかかわらず実行する」を選択
        「パスワードを保存しない」にはチェックを入れない
 「トリガー」タブ:設定されている内容を選択し編集します。
          詳細設定:「繰り返し間隔」で「2時間」、「継続時間」で「1日間」を選択します。
          (これで毎日2時間毎にタスクが動作します。)
 「OK」をクリックし「トリガーの編集」を閉じます。
 (全般・トリガー・操作・条件・設定・履歴が表示されている)該当プロパティの「OK」をクリックし、タスクを実行するアカウントを尋ねられますのでアカウント(通常はadministrator)とパスワードを入力します。
 3種類のタスクを作成しましたが、タスク開始時刻が微妙に異なっている点に注意が必要です。これはWSUSコンソールで設定する自動同期の間隔及び開始タイミング、各タスクの開始から終了までの稼働時間を考慮したものになっています。これは環境によって異なりますので、環境に合った開始時刻及び間隔を設定してください。

●Windows 10製品の取捨選択

 参考URL:WSUS で選択する Windows 10 の製品分類について