【設定・構築編】Windows Server Update Services(WSUS)の活用・自動メンテナンス設定

今回はWindows Server Update Servives(以下WSUS)の構築とその後の運用のためのチューニングにフォーカスした【設定・構築編】の記事です。「構築」だけの記事は結構あるけども、その後のチューニングまで紹介している記事やサイトって意外とないものです。そしてチューニングのやり方はあるけど、コマンドだけ紹介されていて、コマンドを実行するための事前準備などの記載がないのでそのコマンドが通らないという罠にハマる笑。WSUSって何？という方はWSUSについては【概要編】を見ていただければご理解頂けると思いますので、そちらを見てください。

[【概要編】Windows Server Update Services(WSUS)とは？【初心者向け】](https://qiita.com/u-bayashi/items/53f62564e524aec54f1a)

# 今回のゴール
今回のゴールとする内容について記載します。

・WSUSを構築し、Microsoftサーバから更新情報を取得する
・Windows PCへの更新情報配布を管理する設定を行う
・WSUSのチューニングおよびDB更新等の運用管理をタスクスケジューラで自動化する

## なぜチューニング、DB更新が必要なのか？
WSUSはDBをもっており、それなりのリソースを消費します。このDBのメンテナンスがやっかいでして、自動でメンテナンスがされないので放置しておくとDBに不要データが溜まっていき、パフォーマンスが落ちていきます。そのうちアクセスしようとしてもエラーが表示されるようになります。またDBが利用できるリソース(メモリやＮＷ帯域)を適切にチューニングしていないとDBがサーバリソースを占領して他の機能動作に影響がでたり、メンテナンス処理が全然進まなくなったりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/da7d0589-12e1-ae00-0a4c-f40c5bf3069e.png)

こうなるとPowershellやMicrosoft SQL Server Management Studio(以下SSMS)でコマンド実行をして、ひたすらメンテナンス処理が終わるのを待つ必要があります。


:::note warn
最悪WSUSの再構築になる可能性があります。当社の社内環境はそうなりました....
:::


# 前提環境(免責事項)
・WSUSはWindows Server 2022で構築利用します。
・Windows PCへのWSUS利用設定（更新情報の取得先をWSUSに向ける設定）にGPOを利用しますので、同時にActiveDirectory(AD)の構築も必要です。
　※今回AD構築部分は本題でないので割愛します
・メモリ、HDDはMicrosoft社の推奨値以上に搭載しているマシンを想定します。
 　※経験上メモリは最低8GB、HDDは500GB以上ないと運用は難しいと思います
・WSUSのDBは**Windows Internal Database(WID)** を利用します。

:::note info
WID は、Windows に組み込まれているミニマムなデータベースです。WSUS用のDBの選択肢としてSQLサーバもありますが「ロードバランサーで負荷分散したい」などの要望がなければ基本的にWIDで問題ないです。
[Microsoft公式ページ](https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/hh852344(v=ws.11)?redirectedfrom=MSDN)の「次の場合には、Windows Internal Database を使用することをお勧めします。」以降に説明があります。
:::

・SSMSの日本語版をインストールして、クエリ動作確認を行います。
・メンテナンス処理はタスクスケジューラに登録して、定期自動実行できる環境にします。
・当方はMicrosoft社とは関係ありません。本番環境への設定は自己責任になります。


# 設定の流れ
① サーバにWSUSおよびAD機能(ドメインコントローラ)をインストール
② WSUSの基本設定（Microsoftサーバとの同期方法や配布管理する製品、分類の設定
③ ADの基本設定（ドメインフォレストの作成とドメインコントローラ機能の登録）※割愛
④ 管理対象PCへWSUSを利用するようにGPO作成、GPOの適用
⑤ WSUSをチューニングするためのツール類のインストール
⑥ WSUSのチューニングと運用自動化のための設定

## ① サーバにWSUSおよびAD機能をインストール

事前にWSUSのDB用にCドライブ直下に"WSUS”というフォルダを作成して、そこにWSUSのDBをインストールする形で進めます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/7f956657-b951-b820-a16c-11287a758fe9.png)

ではWSUSをサーバマネージャーの「役割と機能の追加」からインストールしていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/6c216dcc-0428-3b82-cc16-a1cd4991edea.png)


ここは特に気にすることなく、通常の方法でインストールを進めてください。AD機能（ドメインコントローラ）インストールの際には固定IPを振っておく必要があるので、DHCPの場合は事前に固定IPに変更しておいてください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/32233a04-a98a-4dde-0327-c4db433652b8.png)

途中の「役割サービスの選択」で”WID Connectivity”と”WSUS Service”にチェックを入れて、その他はデフォルト値のまま進めてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/517678df-ee1b-0393-e817-818cd271db60.png)

「次の場所に更新プログラムを保存します」に”C:¥WSUS”と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/9e693460-3fd1-a10f-8b99-8af0117592a8.png)

アップストリームサーバで「Microsoft Updateから同期する」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/7f6c9e99-855d-2aaf-53ba-3e2e5b342c1d.png)

いったんこれで初期同期を行いましょう。「接続の開始」をクリックすると初回同期が開始されます。同期完了までに5時間以上かかる場合があるので気長に待ちましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/b9dcad8c-806d-5928-bc72-b1d95a91504d.png)



同期が完了するとサーバマネージャの「ツール」にWindows Update Serviceという項目ができており、アクセスするとこんな感じでWSUSの管理コンソールが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/825e0d84-b121-21e8-494d-ca0f43fc439e.png)









## ② WSUSの基本設定（Microsoftサーバとの同期方法や配布管理する製品、分類の設定)
管理コンソールから細々した設定を追加していきます。左側メニューの「オプション」をクリックし、各項目を設定します。

### 製品と分類
配布対象の製品は環境に合わせて追加・削除を行ってください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/6f02b5e5-8ccc-f6ab-1dab-9d7f56125a75.png)


配布したい分類を選択します。今回はデフォルトの設定値から「Upgrades」は外した分類にチェックを入れます。　※FUは止めておきたいため、Upgradesを外しています。また「ドライバー」は絶対に含めないでください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/c96d87ba-ada4-af49-15f2-67c8e4120416.png)


### 更新ファイルと更新言語
言語は「英語」と「日本語」を選択します。
※すべての更新プログラムは英語の言語パックに基づくため、必ず英語を含める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/dae5f54d-7bec-85f5-ecac-5ed6665b5358.png)


### 同期スケジュール
「自動で同期する」を選択し、任意の時間を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/1e300877-3554-d00a-e11c-83e07e595544.png)


### 自動承認
デフォルトだと各クライアントPCへの更新データ配布は管理者が配信の承認をしないと配布されない設定になっています。修正プログラムや重要な更新は勝手に配信してもらいたいのでチェックを入れておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/8c3b8f7d-7b44-19f8-4ab2-7627a4150889.png)

その他にも色々設定はありますので、運用環境に応じて設定してください。

## ③ ADの基本設定（ドメインフォレストの作成とドメインコントローラ機能の登録）※割愛
本記事の趣旨から逸れるので割愛します。一般的なAD構築方法と同じです。


## ④ 管理対象PCへWSUSを利用するようにGPO作成、GPOの適用

[WSUS クライアントのグループ ポリシー:その 1 – 基本編](https://jpmem.github.io/blog/wsus/2019-04-16_01/)　を参考にGPOを作成し、クライアントPC（コンピュータオブジェクト）が所属しているOUに適用させます。



## ⑤ WSUSをチューニングするためのツール類のインストール

### SSMSのインストール
まずSSMSをDLしていきます。「ssms 日本語　ダウンロード」でWeb検索すればで1番上に表示されると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/9b7ab257-36e2-dace-581d-c1283e76b780.png)

SSMSの用途ですがWSUS用DBのWIDには専用管理ツールがないため、SQL管理ツールのSSMSを利用してDB管理を行います。管理をするといっても今回は自動メンテナンス設定にするので、実際にはあまり使うことはありません。



 [SQL Server Management Studio (SSMS) のダウンロード](https://learn.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16)の日本語のリンクをクリックし、DLします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/4b91b6c2-5333-d154-5fb1-a33d95dcdd59.png)

DL後はファイルを実行してインストールを進めます。特に変わったことはせずに、デフォルトのまま進めてください。こんな感じになればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/0a5da355-b1b8-70b4-6e1c-3b7d5df4ab15.png)

インストール完了後は「スタートボタン」横の検索欄で"SSMS"と入力すると表示されると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/7af9acea-d414-7054-1124-543d5c06c694.png)



SSMSを起動すると以下のようなログイン画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/96fe965c-1bd6-72d2-e88b-5e80c4a3373a.png)

以下の内容でログイン実行してください。

【サーバ種別】：データベースエンジン
【サーバ名】："\\.\pipe\MICROSOFT##WID\tsql\query"　※""は実際には不要です。　
【認証】：Windows認証
【暗号化】：オプション　←デフォルトだと「必須」になっていますが必須ままだとログインできないです

今のところはとりあえずログインできればOKです

### sqlcmd utilityのインストール
WIDのインデックス整理のクエリコマンドをタスクスケジューラで実行できるようにsqlcmd utilityというツールをインストールします。このツールがあることによってWIDのインデックス整理のクエリコマンドが書かれたファイル（.sql形式のファイル）を実行できるようになります。

Webで「sqlcmd utility download」で検索するとこれまた１番上に出てくると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/5151d5f7-43d5-e98e-9ab2-a8728994ba88.png)



「sqlcmd(ODBC)」タブからx86のsqlcmdツールをDLします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/5b7eabd2-32e4-1304-c184-0e5a097e1389.png)

あとはDLファイルを実行して、デフォルト設定のままインストールしていきます。インストール完了すると「C:\Program Files (x86)\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn」に”SQLCMD.EXE”が入っていると思います。※もしかすると環境によってはパスが違うかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/0762c019-2b8a-479f-5a45-92ecc948dfb1.png)

sqlcmd utilityはここまで確認できればOKです。

## ⑥ WSUSのチューニングと運用自動化のための設定
WSUSはデータベースとクライアントPCのアクセスインターフェースとなるIISで構成されています。そのためこの2点をチューニングし、パフォーマンスを保てるようにします。

### SQLサーバメモリ利用上限値の設定
利用DBはWIDなのになぜSQLのチューニングなのかと疑問に思うかもしれませんが、どうもWIDがSQL Expressの派生版らしくSQLのチューニングと言いつつ実際はWIDのチューニングです。

[WIDとは(wiki参照)](https://en.wikipedia.org/wiki/Windows_Internal_Database)

WSUSを運用する上でこのSQL(WID)が中々に曲者で、デフォルトの状態ではメモリ利用上限値がサーバのスペックを超えている値に設定されています。すると何かDB側で処理が入るとサーバのメモリリソースが全てSQLに持っていかれて、その他機能の動作に支障をきたすことがあります。DBにゴミが溜まり、その処理にリソースが割かれ、更に更新データがきて処理が始まり（以下ループ）の状態になると高負荷状態でWSUS管理コンソールが開かないという事態に陥るわけです。そうならないようにSQLが使えるメモリ使用量を制限するというわけです。
では具体的な設定方法ですが、コマンドプロンプトで行っていきます。（GUIで設定する方法は探しても見つかりらない...）

```
＃DBへ接続
sqlcmd -E -S \\.\pipe\MICROSOFT##WID\tsql\query　

＃表示設定変更
EXEC sp_configure 'show advanced options',1
go
Reconfigure
go

＃設定前の確認
EXEC sp_configure
go
###ここで現在の設定状態の確認ができます。###
[min server memory]と[max server memory]の値を確認しましょう。


＃最小メモリの設定（今回は1GBに設定します）
EXEC sp_configure 'min server memory',1024
go
Reconfigure
go

＃最大メモリの設定（今回は8GBに設定します）
EXEC sp_configure 'max server memory', 8192
go
Reconfigure
go

＃設定後の確認
EXEC sp_configure
go

```
設定変更後の情報が表示されますので以下を確認しましょう。
・max server memory (MB)のconfig_valueとrun_valueが8192になっていることを確認します。
・min server memory (MB)のconfig_valueとrun_valueが1024になっていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/487c2dbc-d30a-58a2-cce2-01d4e4f00206.png)


これでSQLサーバメモリ利用上限値の設定はOKです。




### IISアプリケーションプールのチューニング
続いてIISのチューニングをしていきます。

サーバマネージャからIISを起動し、「アプリケーションプール」-「WSUSPool」を選択し、右クリックします。項目の中から「詳細設定」を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/c12e4ebc-eef6-ec50-9b19-a3ee8097a74c.png)


チューニングする項目と内容は以下です。

:::note info
本項目はMicrosoftのブログ（WSUSメンテナンスガイド）に記載のある項目です。本番環境への適用値は実際の環境に合わせてチューニングしてください。
:::

①リサイクルの「プライベートメモリ制限」の設定値を"8000000"に変更する
②リサイクルの「仮想メモリ制限」の設定値を"0"に変更する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/21c4da5f-7e35-cdbe-8004-9c6dc2743029.png)


③全般の「キューの長さ」の設定値を”2000”に変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/a0bf4246-7711-f835-71dd-37199dca5e65.png)

④CPUの「制限」の設定値を”0”に変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/a93e4b8e-83c1-f061-fd6a-53bf43eac4b3.png)


⑤ラピッドフェール保護の「エラー間隔」の設定値を”30”に設定
⑥ラピッドフェール保護の「最大エラー数」の設定値を”60”に設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/465fa394-1ab3-7f54-00cb-b0ddb41beeaf.png)

### タスクスケジューラの登録
タスクスケジューラで定期実行させるジョブは「WSUSのお掃除」と「DBの再インデックス処理」の2つです。それぞれをタスクスケジューラ登録していきます。

#### 「WSUSのお掃除」ジョブの登録
以下の内容のPowerShellファイルを作成し、C:\WSUSフォルダに格納します。ファイル名は「WSUS_Cleanup.ps1」とします。


```
Powershell -Command "Invoke-WsusServerCleanup -CompressUpdates -CleanupObsoleteUpdates -CleanupObsoleteComputers -CleanupUnneededContentFiles -DeclineExpiredUpdates -DeclineSupersededUpdates" > C:\WSUS\WSUS_Cleanup.log
```
:::note info
メモ帳を開き、記載後に拡張子を”.ps1”に変更すればPoweshellファイルになります
:::

あとはこのPoweshellファイルを実行するようにタスクスケジューラを設定すればOKです。一般的なジョブ登録と同じですが「操作」の部分に以下の内容を記載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/c549c2b7-046f-df3d-43ce-df223e17ef67.png)

プログラム/スクリプト
%Systemroot%\System32\WindowsPowerShell\v1.0\powershell.exe

引数の追加(オプション)
-ExecutionPolicy Bypass .\WSUS_Cleanup.ps1

開始(オプション)
C:\WSUS

「セキュリティオプション」の”ユーザーがログオンしているのかどうかにかかわらず実行する”の選択も忘れずに

#### 「DBの再インデックス処理」ジョブの登録
下記サイトのスクリプトをメモ帳にコピーし、拡張子".sql"のファイル名sqlwid_reindex.sqlとして
C:¥WSUSに保存してください。

https://github.com/jpmem/script/raw/main/WSUS/Maintenance/WsusDBMaintenance.sql

あとは先ほどと同じようにタスクスケジューラを登録していきます。本ジョブも「操作」の部分に以下の内容を記載します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/602e66ca-0e68-6676-3e65-9892ed945550.png)


プログラム/スクリプト
"C:\Program Files (x86)\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\SQLCMD.EXE"

上記のパスはsqlcmd utilityでインストールしたSQLCMD.EXEのパスです。
セミコロン("")を付けないとエラーになることがあったので上記は入れています

引数の追加(オプション)
-S \\.\pipe\Microsoft##WID\tsql\query -i C:\WSUS\sqlwid_reindex.sql -I -o C:\WSUS\reindexout.txt




### 動作確認
「WSUSのお掃除」ジョブですが実行するとログを同じフォルダに「WSUS_Cleanup.log」という名前で出力されます。こんな感じでログが出ていればOKです。プログラム数の部分は実際には”０”にならない項目もあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/88eff281-7d71-c9c7-9a57-f1546bff4e7e.png)

「DBの再インデックス処理」ジョブも同じくログが「reindexout.txt」というファイル名で出力されます。こんな感じでログが出ていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/0cc216b5-e282-4f8c-40c4-849fa21f38be.png)

「DBの再インデックス処理」ジョブが上手くいかない場合はSSMSから手動実行することも可能です。というより実はSSMSで実行する処理を無理やりタスクスケジューラで実行しているだけです。

SSMSで実行するにはSSMSを起動し、データベースに接続後”SUSDB”を選択し、右クリックから「新しいクエリ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/e3a8e610-aa9c-ccb5-00e6-dffe23adb5c7.png)

あとは「https://github.com/jpmem/script/raw/main/WSUS/Maintenance/WsusDBMaintenance.sql」 の内容をコピーして、「実行」するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/a0acbcda-adfe-d735-154c-e6de2b5d4453.png)



# 参考サイト

https://jpmem.github.io/blog/wsus/2019-04-16_01/

https://jpmem.github.io/blog/wsus/2022-05-09_01/

https://jpmem.github.io/blog/wsus/2019-03-28_01/

https://www.livefree.jp/powershell_wsus_cleanup/

https://syszo.com/items/FHdTBcMAqc


# おわりに
無理やり自動メンテナンスできるようにしてみました。WSUSはそこそこの規模の企業であれば結構導入されているとことは多いと思いますが皆さん運用はどうされてるんですかね？自動メンテナンス化は需要ありそうな気がしますが...
マイクロソフトさんもブログなどで情報発信しておられますが微妙に手動実行しろ的な書き方で、痒い所に手が届いていない気が...