【WSUS運用自動化】アーキテクチャ(x86/x64/arm64)指定して、更新プログラムを一括拒否できるスクリプトを作成してみた

## 1. やったこと
アーキテクチャ(**x86/x64/arm64**) を指定して、更新プログラムを一括拒否できるスクリプトを作成しました。

[![speaktech-account/Decline-UpdatesByArch - GitHub](https://gh-card.dev/repos/speaktech-account/Decline-UpdatesByArch.svg)](https://github.com/speaktech-account/Decline-UpdatesByArch)

## 2. 使い方
- x86アーキテクチャを指定したテスト実行をする場合（拒否対象の一覧を取得可能）

```powershell
powershell -ExecutionPolicy Unrestricted -Command "C:\Tools\WSUS\Decline-UpdatesByArch.ps1 -UpdateServer localhost -Port 8530 -Arch x86 -SkipDecline" >> C:\Tools\WSUS\Decline-UpdatesByArch.log
```

- SSL接続を使用して、x86アーキテクチャを指定したテスト実行をする場合（拒否対象の一覧を取得可能）

```powershell
powershell -ExecutionPolicy Unrestricted -Command "C:\Tools\WSUS\Decline-UpdatesByArch.ps1 -UpdateServer localhost -UseSSL -Port 8531 -Arch x86 -SkipDecline" >> C:\Tools\WSUS\Decline-UpdatesByArch.log
```

- x86アーキテクチャを指定した本番実行をする場合

```powershell
powershell -ExecutionPolicy Unrestricted -Command "C:\Tools\WSUS\Decline-UpdatesByArch.ps1 -UpdateServer localhost -Port 8530 -Arch x86" >> C:\Tools\WSUS\Decline-UpdatesByArch.log
```

実行すると、WSUS上の拒否対象となる更新プログラムのリスト (SpecificArchUpdates.csv) をスクリプトと同じパスに作成します。
実際に「拒否」が実行された場合は、リストをコピーして、バックアップ (SpecificArchUpdatesBackup.csv)を作成します。

標準出力に表示される更新プログラムのサマリ情報もファイル (Decline-UpdatesByArch.log)に保存します。

```powershell:Decline-UpdatesByArch.log
Decline-UpdatesByArch.ps1 has Started at 2019/11/17 13:32:23
Connecting to WSUS server localhost on Port 8530... Connected.
Getting a list of all updates... Done
Parsing the list of updates... Done.
List of SpecificArch(x64) updates: C:\Tools\WSUS\SpecificArchUpdates.csv

Summary:
========
All Updates = 87
Any except Declined = 30
All SpecificArch(x64) Updates = 30

Summarizing the updates has been done at 2019/11/17 13:32:25
SkipDecline flag is set to False. Continuing with declining updates
  Declined 30 updates.
  Backed up list of SpecificArch updates to C:\Tools\WSUS\SpecificArchUpdatesBackup.csv

Decline-UpdatesByArch.ps1 has finished at 2019/11/17 13:32:25
```

## 3. やってみた動機（WSUS運用の問題点）
更新プログラムは、アーキテクチャ毎に配信がされており、アーキテクチャは x86/x64/arm64 に分類されています。
しかし、Microsoft Update から同期する際に選択できるのは、「製品と分類」という単位であり、アーキテクチャ単位で選択できません。
これにより、現場で運用していない x86 や arm64 アーキテクチャ向けの更新プログラムが同期されてしまいます。

同期だけであればWSUSに実態ファイルはダウンロードされず、DBにメタデータのみダウンロードされるため、ディスク空き容量に与える影響は軽微です。
しかし、「自動承認」の規則でもやはりアーキテクチャ単位で選択ができないため、結局のところ不要なアーキテクチャ向け更新プログラムも自動承認され、実態ファイルがダウンロードがされてしまいます。これにより、WSUSのディスク容量不足が発生するケースがあります。

この問題を解決するため、アーキテクチャ単位で更新プログラムを一括拒否できるスクリプトの作成を検討しました。

## 4. 問題点への対策
[WSUSで高度な自動承認/拒否を組む](https://qiita.com/mappityper/items/dc0fa771e11526c2ede5) という記事を参考にさせて頂き、アーキテクチャを指定して、更新プログラムを拒否できるスクリプトを作成し、タスクスケジューラで定期実行する対策を考えました。
拒否された更新プログラムはWSUSクリーンナップによる削除対象となるため、クリーンナップの定期実行と組み合わせることで、不要な実態ファイルをごっそり削除することができます。

WSUSクリーンナップの定期実行については、 [WSUS メンテナンス ガイド](https://blogs.technet.microsoft.com/jpwsus/2018/03/08/maintenance-guide/) で紹介されている [2.WSUS のクリーンアップ ウィザードについて](https://blogs.technet.microsoft.com/jpwsus/2017/12/05/43/) を参考に実施してください。

## 5. 参考文献
- [WSUSで高度な自動承認/拒否を組む](https://qiita.com/mappityper/items/dc0fa771e11526c2ede5)（@mappityper さん、非常に参考になりました。投稿ありがとうございました）
- [WSUS メンテナンス ガイド](https://blogs.technet.microsoft.com/jpwsus/2018/03/08/maintenance-guide/)