オフライン環境のWindows未適用パッチ抽出(WSUSSCN2.cab使用)について

# はじめに
アプリケーションサーバーとしてWindows Server 2016を使用していますが、Windows Updateは手動で更新するようにしています。今回、Windowsパッチを適用するにあたり更新プログラムのオフラインスキャンファイル(Wsusscn2.cab)を使用して、未適用パッチを抽出したものを適用する運用となっています。パッチ適用する上で社内開発環境用サーバーとユーザー環境用サーバーでオフラインスキャンファイルを使用して未適用のパッチを抽出したのですが、両サーバー比較すると一致しない部分が出てきました。

社内レビューした際に上長から下記の2点について原因を調査して欲しいとのこと。

* 両サーバーで未適用パッチに違いがあるのはどうしてか
* コントロールパネルの「インストールされた更新プログラム」が適用に含まれないのは何故か

# 両サーバーの未適用パッチの違い
ユーザー環境用サーバーと社内開発環境用サーバーは同じシステム構成です。
社内開発環境用サーバーは、2020年8月にパッチ適用するための準備をしており既に幾つかのパッチが適用済みとなっておりました。ただタイミングが合わず1年延長となり再度パッチ適用の準備をすることになったのです。一方ユーザー環境用サーバーは2020年に導入して以来、パッチは未適用となっています。

未適用パッチの主な違いは、「サービススタック更新プログラム」と「Windows累積更新プログラム」です。

## 原因
調べて分かったのですが、「サービススタック更新プログラム」をインストールしないと新規の累積更新プログラムが検出対象外となるのです。
確かにユーザー環境用サーバーには「サービススタック更新プログラム」を一度も当てていないが、社内開発環境用サーバーは昨年にパッチ適用準備で「サービススタック更新プログラム」を当てていました。それにより「Windows累積更新プログラム」が未適用パッチとして抽出されたのです。

## 対策
ユーザー環境用サーバーと社内開発環境用サーバーの違いの原因が分かりました。ということは社内開発環境用サーバーで未適用パッチとして出てきた「サービススタック更新プログラム」を当てないと、最新の「Windows累積更新プログラム」が検出されないということです。

その為、社内開発環境用サーバーに未適用パッチとして出てきた「サービススタック更新プログラム」を当てた後に、もう一度更新プログラムのオフラインスキャンして未適用パッチを抽出するようにしました。これにより新たな「Windows累積更新プログラム」が検出されるようになりました。

:::note info
念の為ですが、パッチ適用順序として「サービススタック更新プログラム」を最初に当てた方がいいのかも知れません。
:::

# 「インスールされた更新プログラム」が適用に含まれないのは何故か
調査のために後述のWindows未適用のパッチ抽出したPowerShellスクリプトのプログラムを一部変更して、適用済みも検出するようにしてみました。

* [[Windows10]MBSAが終了しているようなので後継スクリプトを試してみた　〜オフラインPCのパッチ適用状況の確認〜](https://mitsushima.work/archives/17968931.html)
* [Windows Updateの状態をコマンドラインから調べる方法を考える](https://ascii.jp/elem/000/004/072/4072221/)

```ps
$SearchResult = $UpdateSearcher.Search("IsInstalled=0") 
                                        ↓
$SearchResult = $UpdateSearcher.Search("IsInstalled=0　or IsInstalled=1") 

$ResultMessage = "インストール済:" + $Update._isInstalled
Write-Output $ResultMessage >> $ResultFile
```

例えばユーザー環境用サーバーのコントロールパネルの「インスールされた更新プログラム」でインストール済みとなるのは、KB4509091のみです。

|KB番号|名前|内容|備考|
|:--|:--|:--|:--|
|KB4522010|セキュリティ更新プログラム|Internet Explorer のセキュリティ更新プログラム| |
|KB4509091|セキュリティ更新プログラム|サービス スタック更新プログラム|インストール済|
|KB4485447|セキュリティ更新プログラム|サービス スタック更新プログラム| |

## 原因
2021年8月のオフラインスキャンファイル(Wsusscn2.cab)のサイズが850MB、2022年8月のサイズが645MBと少なくなっていることから、ずっと蓄積しているわけではなくサポート切れなど古いものは削除するようになっている。
よって、古いKB番号は抽出対象からも除外されてしまう。

パッチの内容によっては累積パッチのようにKB番号に内包されてしまったり、上位互換版のみあればいいわけです。

# Windows未適用パッチ抽出
今回、Windows未適用パッチ抽出には下記サイトのPowerShellスクリプトを採用しました。
以前はMBSAを使用していたのですが、Windows Server2016以降には対応しなくなり開発も終了してしまったからです。

https://mitsushima.work/archives/17968931.html

## 注意点
「Wsusscn2.cab」は毎月リリースされるセキュリティ関連の更新プログラムに関する情報が含まれているファイルです。この情報から足りないセキュリティパッチを洗い出してくれます。

:::note warn
※wsusscn2.cabだけは、常に最新のカタログを下記サイトからダウンロードすること
http://go.microsoft.com/fwlink/?LinkId=76054
:::

## 疑問点
### WindowsUpdateのファイル数が少ない
1年以上パッチを適用してないとたくさんパッチを適用する必要があると思われたのですが、実際にWindows未適用のパッチ抽出すると10個に満たないくらい少なかったりします。

これは適用対象の違いのようで、MBSA よく寄せられる質問(リンク切れ)にも記載されている。

>MBSA と Microsoft Update との相違点は何ですか?
Microsoft Update は「重要な更新」および「追加で選択できる更新プログラム」など、セキュリティ以外の更新プログラムもユーザーに提供します。MBSA は、これらのセキュリティ以外の更新プログラムを提供しません。
[WindowsUpdateのオフライン適用について(WindowServer 2012 R2) - MSDNフォーラム](https://social.technet.microsoft.com/Forums/office/ja-JP/e4608504-b949-444c-a752-375afd51a9fc/windowsupdate1239812458125011252112452125313696929992123951238812356?forum=winserver8)

## 再検出
パッチ適用後に別のパッチが出てくる可能性があるので、KB適用 → (再起動) → Windows未適用のパッチ抽出 → 未適用または不足しているKB適用の繰り返しをして、最終的に適用するパッチを確定することが大切です。

# 最後に
今回の調査で「サービススタック更新プログラム」を当てた後に、もう一度更新プログラムのオフラインスキャンして未適用のパッチを抽出するようにしないと駄目だということと、オフラインスキャンファイル(Wsusscn2.cab)は、古いものは削除されるのでインストール済からも除外されてしまうということが分かりました。