Windows Server 2012 R2でKB4571703がGet-HotFixに出ない理由とDISMでの確認方法

Windows Server 2012 R2にKB4571703(2020年8月のセキュリティ月例ロールアップ)を入れたはずなのに、Get-HotFixや「インストールされた更新プログラム」で見つからない――このズレは月例ロールアップの“累積・置換”という性質と、Get-HotFixの参照先の仕様が重なると起きます。仕組みを整理し、DISMで確実に確認する手順までまとめます。

目次

起きている現象を整理する

今回の相談で出ている状況を、いったん“事実”として並べると次のとおりです。

  • Windows Server 2012 R2 に KB4571703(2020年8月のセキュリティ月例ロールアップ)を適用した
  • Get-HotFix -Id KB4571703(または Get-HotFix KB4571703)で 「見つからない」
  • 「プログラムと機能」→「インストールされた更新プログラム」にも 表示されない
  • 一方で、Windows Update の「更新履歴」には インストール成功として残っている
  • その後の KB4577066(2020年9月の月例ロールアップ)は入っている
  • 8月分(KB4571703)を単体で当て直すと 「適用対象外」になる

「入れた記録はあるのに、入っていない扱いに見える」のがモヤモヤの正体です。ここで重要なのは、“表示されない=未適用”とは限らない点です。

結論:KB4571703が“入っていない扱い”に見える主な理由

先に結論から言うと、原因は大きく2つです。

  1. 月例ロールアップは累積更新(cumulative)で、翌月のロールアップに置換(上書き・包含)される
  2. Get-HotFixは“すべての更新を列挙するコマンドではない”(参照している台帳が限られる)

つまり、KB4571703は「当時は入れた」可能性が高い一方で、9月のKB4577066が適用された時点で8月のロールアップが“独立した更新”として見えにくくなることがあります。Windows Updateの「更新履歴」はログとして残りますが、現在の状態を保証するものではありません。

月例ロールアップとは:翌月で置換される“累積”の更新

Windows Server 2012 R2(Windows 8.1系)には、毎月提供される更新として大きく次の2系統があります(運用形態によって見え方は変わります)。

更新の種類特徴よくある管理方法今回の現象との関係
月例ロールアップ(Monthly Rollup)基本的に累積。新しい月のロールアップは、過去分の修正をまとめて包含する「最新ロールアップが入っているか」で管理しやすい後続(9月)を入れると、前月(8月)が単体で見えなくなることがある
セキュリティのみ(Security Only)月ごとのセキュリティ修正が中心。累積ではない運用が多い「毎月のSecurity Onlyを漏れなく入れる」運用毎月のKBが残りやすいが、環境によってはロールアップ導入で方針が変わる

今回のKB4571703は月例ロールアップです。月例ロールアップは、“その月の更新”というよりその時点の到達点(最新のまとまり)と捉えると理解しやすくなります。

「置換(Supersedence)」が起きると何が変わるのか

ロールアップのような累積更新では、後続の更新を入れたタイミングで、前の更新が置換(superseded)状態になります。置換されると次のようなことが起きます。

  • Windows Updateの適用判定(Applicability)が「もう不要」「もう適用対象外」と評価する
  • GUIの「インストールされた更新プログラム」やGet-HotFix前月KBが出なくなる/出にくくなることがある
  • ディスククリーンアップやコンポーネントストアのクリーンアップが走ると、置換済みの部品が整理され、さらに“痕跡が薄くなる”ことがある

ただし、これは「8月の修正が消えた」という意味ではなく、“8月の修正を含んだ、より新しい9月のまとまりに統合された”と考えるのが実態に近いです。

Get-HotFixが見ている範囲を理解する

PowerShellのGet-HotFixは便利ですが、更新の世界では“万能の台帳”ではありません。内部的には主にWMIの Win32_QuickFixEngineering(QFE)を参照しており、更新の種類や実装方式によっては取得できません。

確認手段見ているもの(ざっくり)長所弱点・注意点
Windows Update「更新履歴」Windows Updateが記録したインストールのログ「いつ入れようとしたか」「成功/失敗」が分かる現在その更新が独立して残っているかは保証しない
「インストールされた更新プログラム」表示対象として登録されている更新の一覧GUIで確認でき、運用担当にも説明しやすい置換やクリーンアップで表示が変わることがある
Get-HotFixWin32_QuickFixEngineering(QFE)スクリプトで扱いやすいQFEに載らない更新は拾えない。累積更新で“前月KB”を追う用途には不向き
DISM(パッケージ)コンポーネントベースサービス(CBS)のパッケージ台帳OSが実際に保持しているパッケージ状態を確認できる出力が多いので、絞り込みや見方のコツが必要

今回のように「更新履歴にはあるが、Get-HotFixでは出ない」というズレは、Get-HotFixの守備範囲の問題と、ロールアップの置換が重なった典型例です。

確実に確認するならDISM:パッケージ状態を“事実ベース”で見る

結論として、現時点で“そのマシンがどの更新状態にいるか”を確認するなら、DISMでパッケージ一覧を見るのが確実です。GUIやGet-HotFixは“見せ方”が変わることがある一方、DISMはOSのサービス(CBS)が管理している状態を参照します。

基本:インストール済みパッケージを一覧表示する

管理者権限のコマンドプロンプトで、まずは一覧を出します。

dism /online /get-packages /format:table

出力が大量になる場合は、次のようにファイルへ保存してから検索すると楽です。

dism /online /get-packages /format:table > C:\temp\packages.txt
notepad C:\temp\packages.txt

ここでポイントは、パッケージ名にKB番号がそのまま出るとは限らないことです。環境や更新種別によっては、パッケージ名がPackage_for_RollupFixのようにKBを含まない形になります。

KB番号で絞り込めるケース/絞り込めないケース

もし出力内にKBが含まれる場合は、次のように絞り込めます。

dism /online /get-packages /format:table | findstr /i 4577066
dism /online /get-packages /format:table | findstr /i 4571703

一方、KB番号がパッケージ名に出ない場合は、インストール日時の近いものRollupFix系のパッケージから辿る方法が確実です。

インストール日時から辿る(PowerShell併用)

PowerShellでDISMモジュール(DISMコマンドレット)が使える環境なら、次のように「最近入ったパッケージ」を上から見ていくのが実務的です。

Get-WindowsPackage -Online |
  Sort-Object -Property InstallTime -Descending |
  Select-Object -First 30 PackageName, ReleaseType, InstallTime, State

ここで、8月・9月に該当する時期のRollupFixや累積系パッケージがInstalledになっていれば、少なくとも「ロールアップが積み上がっている」ことが分かります。さらに深掘りしたい場合は、対象パッケージの詳細を確認します。

パッケージ詳細を確認してKBとの紐付けを見る

一覧から怪しいパッケージ名(例:Package_for_RollupFix~...)が見つかったら、次のように詳細を出します。

dism /online /get-packageinfo /packagename:Package_for_RollupFix~31bf3856ad364e35~amd64~~6.3.9600.xxxxx

出力の中にKB記事番号(KB Article)や説明、インストール日時が含まれることがあり、「このパッケージ=どのKB相当か」を追えます。ここで9月のロールアップ(KB4577066)相当が確認できれば、8月のKB4571703がGet-HotFixに出ないのは“未適用”ではなく、後続ロールアップに包含され、表示上も置換されている可能性が高いです。

DISMのState(状態)の読み方

DISMやGet-WindowsPackageでよく目にする代表的な状態を、運用目線で整理しておきます。

State意味判断のヒント
Installedそのパッケージが現在有効な形でインストールされている「現時点の到達点」を示すことが多い
Superseded後続パッケージに置換され、原則として前に出なくなるロールアップ運用では自然に発生する
Staged適用準備はあるが、有効化はされていない(環境により意味合いが変わる)更新適用の途中や、機能追加系で見かけることがある

「更新履歴」と「インストール済み一覧」がズレる理由をもう少し具体化する

混乱の根っこは、Windowsが“更新”を複数のレイヤーで扱っている点にあります。運用でよく出る誤解を、あえて短く言い切るとこうです。

  • 更新履歴:Windows Updateが「入れようとして、こういう結果だった」と記録した履歴(ログ)
  • インストール済み一覧(GUI / Get-HotFix):「今、独立した更新として見せる対象」に登録されている表示用の一覧
  • DISM(CBSパッケージ):OSが実際に保持しているパッケージの実体

月例ロールアップは“部品の集合体”です。翌月のロールアップを入れると、OS内部ではより新しい部品に更新されます。その結果、古いKB番号のまとまりが独立したエントリとして残る必然性が薄れ、一覧から消える(または見えにくくなる)ことがあります。

KB4571703を当て直すと「適用対象外」になる理由

「適用対象外」は失敗ではなく、Windowsの評価ロジックがそう判断した結果です。今回の組み合わせで起きやすいパターンは次のとおりです。

  • 9月ロールアップ(KB4577066)がすでにインストール済みで、8月ロールアップ(KB4571703)の内容が包含されているため、8月単体を入れても“新しくなる要素がない”
  • 適用前提となるSSUや前提更新が満たされており、かつ後続ロールアップで上位互換になっているため、評価が「不要」となる

この挙動は、むしろ「最新に追いついている」兆候として扱えることが多いです。もちろん、環境破損など例外もありますが、まずは後続ロールアップが本当に入っているかをDISMで確認するのが先決です。

実務で使える確認コマンド集(目的別)

GUI確認だけだと説明が難しい場面が多いので、目的別に“使い分け”できるようにまとめます。

目的コマンド例補足
特定KBがQFEとして出るか確認Get-HotFix -Id KB4577066出ない=未適用とは限らない。QFEに載るかどうかの確認
QFE一覧からKBを探すGet-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 30“最近のホットフィックス”の傾向を見る用途
パッケージ実体を一覧するdism /online /get-packages /format:table最終的な事実確認に向く
最近のパッケージを上から確認Get-WindowsPackage -Online | Sort InstallTime -Descending | Select -First 30 PackageName,InstallTime,StateKB番号で検索できないときに効く
Windows Updateのイベントログ確認eventvwr.msc「いつ成功したか」「どの更新が失敗したか」を追える。場所はWindowsUpdateClientのOperationalログが目安
更新のインストールが行われた形跡をログで追うnotepad C:\Windows\WindowsUpdate.log notepad C:\Windows\Logs\CBS\CBS.logトラブル時の深掘り用。量が多いので検索しながら読む

“表示されない”が問題になるケースと、切り分けの考え方

ここまでの説明どおり、KB4571703が見えないだけなら多くの場合は仕様の範囲です。ただし、次の条件が重なると「本当に適用されていない」「途中で壊れている」可能性が出てくるので、切り分けをおすすめします。

状況疑うポイントまずやること
9月ロールアップ(KB4577066)も見つからないそもそもロールアップが入っていない/WSUSや適用ポリシーで止まっているDISMで最近のInstalledを確認し、更新適用の時刻が存在するかを見る
更新履歴は成功だが、脆弱性スキャンでは未適用扱いスキャナが参照する判定条件(ファイルバージョンやレジストリ)が満たされていないスキャンが要求するKB/ファイルの条件を確認し、パッケージ詳細と照合する
更新適用に時間がかかり、再起動後にロールバックするコンポーネントストアの破損、前提更新不足、空き容量不足、ドライバ不整合sfc /scannow、DISMの健全性チェック、空き容量の確保、前提更新(SSUなど)の確認
「適用対象外」なのに最新ロールアップも入っていない前提更新不足や、更新パッケージの種類違い(Security OnlyとRollup混在)更新方針(Rollup運用かSecurity Only運用か)を揃え、SSU→最新ロールアップの順で整理

特に、Windows Server 2012 R2は長期運用されがちで、途中で更新ポリシーが変わっている環境も珍しくありません。「いつからロールアップ運用に切り替えたか」を運用記録で確認できると、説明が一気に楽になります。

SSU(Servicing Stack Update)とロールアップの順序の考え方

「更新がうまく当たらない/失敗する」系の相談では、よくSSU(サービススタック更新)が論点になります。SSUは、更新を適用する基盤(いわゆる“更新エンジン側”)を更新するもので、古いSSUのまま新しいロールアップを適用しようとすると失敗する場合があります。

  • 基本方針:SSU → 月例ロールアップの順で適用を検討する
  • ただし今回のケースは「9月ロールアップが入っている」前提なので、主眼は“表示されないのは仕組みの問題”にある

「なぜGet-HotFixで見えないのか」を説明する目的であれば、SSUの話は脇役です。逆に「更新が失敗する」「再起動で戻る」などの症状がある場合は、SSUや前提更新の確認が主役になります。

監査・報告で困らないための“説明テンプレ”

セキュリティ監査や社内報告では「8月のKB4571703が入っているか?」のように、特定KB番号での提示を求められることがあります。ロールアップ運用では、ここがズレやすいポイントです。説明の組み立ては次の順が通りやすいです。

  1. 前提として、対象サーバは月例ロールアップ運用である(累積更新)
  2. 現在は後続の月例ロールアップ(例:KB4577066)がインストール済みである
  3. 月例ロールアップは累積のため、後続ロールアップは前月分の修正を包含する
  4. よって、KB4571703が「現在インストール済み一覧」やGet-HotFixに表示されない場合がある(置換・包含による)
  5. 事実確認として、DISMのパッケージ情報(Installedのロールアップ)と、Windows Updateの更新履歴(成功ログ)を提示する

「更新履歴」と「現状態」の双方をセットで示すと、相手が非技術者でも納得しやすくなります。

よくある質問

Get-HotFixに出ないと、脆弱性は直っていないのですか?

いいえ、直っていないとは限りません。月例ロールアップのような累積更新では、後続ロールアップを入れていれば前月分の修正が含まれているのが通常です。判断は「特定KBが見えるか」ではなく、最新ロールアップがInstalledになっているか、もしくはスキャナが要求するファイルバージョンやレジストリ条件を満たしているかで行うのが安全です。

「インストールされた更新プログラム」にも出ないのは異常ですか?

異常とは限りません。置換された更新が表示対象から外れる、またはクリーンアップで整理されると、GUI上の見え方が変わることがあります。心配であれば、DISMでパッケージのInstalled/Supersededを確認してください。

8月のKBだけを“残したい”のですが可能ですか?

ロールアップ運用では基本的に「最新を積む」前提のため、特定月だけを独立して残す運用は現実的ではありません。どうしても検証で必要な場合は、テスト環境(スナップショット/バックアップ)で8月時点の状態を再現して検証し、運用環境は最新ロールアップで維持するのが安全です。

KB番号でパッケージが見つからないときの最短ルートは?

最短は、InstallTimeで最近のパッケージを並べて、該当時期のロールアップ相当をdism /get-packageinfoで深掘りする方法です。KB番号検索にこだわると遠回りになりやすいので、「いつ入れたか」から辿るのが実務向きです。

運用のコツ:ロールアップは“月別”ではなく“最新到達点”で管理する

最後に、同じ混乱を繰り返さないための運用ポイントをまとめます。

  • 月例ロールアップ運用では、「最新ロールアップのKB」を基準にパッチ適用状況を管理する
  • 監査用には、Windows Updateの履歴(ログ)と、DISMのパッケージ状態をセットで残す
  • “Get-HotFixで見えない”こと自体を異常と判断せず、何を見ているコマンドかを踏まえて使い分ける
  • 更新失敗が絡む場合は、SSU→最新ロールアップの順序や前提更新の確認を優先する

まとめ

KB4571703がGet-HotFixや「インストールされた更新プログラム」に出てこないのは、多くの場合、月例ロールアップが後続ロールアップに置換・包含されることと、Get-HotFixが参照する台帳の範囲が限定的であることが原因です。今の状態を確実に確認したいなら、DISM(CBSパッケージ)でInstalled/Supersededを確認し、必要に応じて/get-packageinfoで詳細を追うのが最も確実なアプローチです。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次