PowerShellでインストール済みWindowsアップデートを一覧表示する最初のコマンドはGet-HotFixです。ただし、このコマンドはWin32_QuickFixEngineeringを使い、主にComponent Based Servicingで提供されたQFE更新を返します。設定アプリの更新履歴、Windows Update Agentの成功・失敗履歴、ドライバー、Defender定義、Microsoft Storeアプリ、機能更新を完全に一つの一覧へまとめるものではありません。本記事では、特定KBの確認、日付順の一覧、パッケージ状態、更新履歴、OSビルドを読み取り専用で照合し、「表示されない=未適用」という誤判定を避ける方法を解説します。
最初に確認したい更新の種類と目的を決める
必要なのが、特定のセキュリティKB、直近の累積更新、機能更新、ドライバー、Defender定義、更新の成功・失敗履歴、組織の準拠状態のどれかを明確にします。更新の種類によって記録場所、保持期間、置き換え関係、再起動要否が異なります。端末名、Windowsの製品名、エディション、バージョン、OSビルド、取得時刻を同時に記録します。
WSUS、Microsoft Intune、Windows Update for Business、Configuration Managerなどで管理される端末では、ローカル結果と管理基盤の状態が一時的に違うことがあります。配布済みでも端末が未再起動、ローカル適用済みでも管理画面の同期前、対象外の更新が一覧に見えるなどの状況があります。誰のどの判定へ答えるのかを決め、単一コマンドだけで準拠・非準拠を断定しません。
Get-HotFixでQFE更新を一覧表示する
Get-HotFixを引数なしで実行すると、利用可能なHotFixID、Description、InstalledBy、InstalledOnなどが表示されます。日付の新しい順へ並べ、必要な列を明示します。InstalledOnが空または型の扱いが異なる環境もあるため、日付だけで最新を選ぶ自動化は、Nullと解析失敗を確認してから使います。
Get-HotFix |
Sort-Object InstalledOn -Descending |
Select-Object Source, Description, HotFixID, InstalledBy, InstalledOn
MicrosoftのGet-HotFix資料では、このコマンドがWin32_QuickFixEngineeringを使い、CBSで提供された更新を返すこと、Windows InstallerやWindows Updateサイト由来のすべての更新は返さないことが説明されています。したがって、行数が少ない、目的のドライバーや定義更新がない、設定画面と件数が違うことはあり得ます。Get-HotFixの範囲内で得た一覧と明記します。
特定KBの有無はエラーと未検出を分ける
特定KBならGet-HotFix -Id KB番号で確認できます。対象が見つからない場合はエラーになることがあるため、運用スクリプトではtry/catchを使い、NotFound、AccessDenied、RemoteErrorなどを分けます。KB番号はMicrosoftの公式リリースノートや更新カタログから正確に取得し、例示番号を本番判定へ使いません。
$kb = "KB5030000"
try {
Get-HotFix -Id $kb -ErrorAction Stop |
Select-Object HotFixID, Description, InstalledOn
} catch {
[pscustomobject]@{ HotFixID = $kb; Result = "Not found or query failed" }
}
Get-HotFixで見つからないだけでは、修正内容が端末へないと証明できません。累積更新に置き換えられた、対象OSでは別KB、機能更新後のビルドに含まれる、Get-HotFixの対象外、取得失敗などが考えられます。古いKBが一覧にないことを未適用と判定する前に、OSビルド、最新累積更新、置き換え情報、適用対象、管理基盤の検出規則を確認します。
Win32_QuickFixEngineeringをCIMで直接取得する
Get-CimInstance -ClassName Win32_QuickFixEngineeringでも、HotFixID、Description、InstalledBy、InstalledOnなどを取得できます。CIMセッションを使うと許可されたリモート端末を統一した方法で確認できます。Get-HotFixと同じ基礎データなので、両方の件数を合わせても対象範囲が広がるわけではありません。どちらを使うかはスクリプト設計とリモート管理方式で選びます。
Get-CimInstance -ClassName Win32_QuickFixEngineering |
Select-Object CSName, HotFixID, Description, InstalledBy, InstalledOn
InstalledOnは環境により空、日付、文字列として扱われる可能性があります。カルチャ依存の文字列を無理にDateTimeへ変換し、失敗を最古の日付にしません。リモート取得では、端末停止、名前解決、CIM構成、認証、権限、タイムアウトを0件と分けます。InstalledByにはアカウント情報が含まれる場合があるため、外部共有やレポートでは必要性を確認します。
Get-WindowsPackageでCBSパッケージ状態を確認する
DISMモジュールのGet-WindowsPackage -Onlineは、実行中Windowsイメージのパッケージを取得します。PackageName、PackageState、ReleaseType、InstallTimeなどを確認でき、Get-HotFixにないパッケージ名や状態の調査へ役立ちます。結果は多く、パッケージ名も人向けKB一覧とは異なるため、特定KBや更新日時の候補へ絞って読みます。
Get-WindowsPackage -Online |
Where-Object PackageState -eq Installed |
Select-Object PackageName, PackageState, ReleaseType, InstallTime |
Sort-Object InstallTime -Descending
このコマンドは環境によって管理者権限が必要で、実行に時間が掛かる場合があります。PackageStateがInstalledでも、再起動後に有効になる処理や置き換え関係を別に確認します。パッケージ名にKB番号がない場合もあります。一覧から不明なパッケージを見つけても、DISMの削除や復元操作を実行せず、Microsoftのサポート情報と端末のサービススタック状態を確認します。
Windows Update Agentの履歴で成功と失敗を追う
Windows Update Agent APIのIUpdateSearcher.QueryHistoryを使うと、更新操作の履歴を取得できます。PowerShellではMicrosoft.Update.Session COMオブジェクトからUpdateSearcherを作り、総件数とQueryHistoryを呼び出します。Title、Date、ResultCode、HResult、Operationなどを時系列で確認でき、失敗や中止を含む履歴の調査に向きます。
$session = New-Object -ComObject Microsoft.Update.Session
$searcher = $session.CreateUpdateSearcher()
$count = $searcher.GetTotalHistoryCount()
$searcher.QueryHistory(0, $count) |
Select-Object Date, Title, Operation, ResultCode, HResult |
Sort-Object Date -Descending
更新履歴は「現在インストール済みパッケージの完全な一覧」と同じではありません。失敗した試行、後で置き換えられた更新、アンインストール操作などが含まれ、保持期間や履歴リセットの影響もあります。ResultCodeやHResultはタイトル、時刻、操作種別、Windows Update Clientイベント、公式エラー情報と照合します。履歴が空でも更新未実施と断定しません。
設定アプリの更新履歴と区分を照合する
利用者が確認する場合は、「設定」「Windows Update」「更新の履歴」を開き、品質更新、ドライバー更新、定義更新、その他の更新などの区分を確認します。PowerShellのQFE一覧と画面が違うときは、取得元の範囲、適用済みパッケージの置き換え、履歴保持、再起動待ちを確認します。画面上の更新名とKB、適用日、失敗表示を記録します。
設定画面のスクリーンショットには端末名、組織の管理表示、更新ポリシー、エラー情報が含まれる場合があります。共有先を限定します。「更新プログラムをアンインストールする」画面が見えても、確認だけに使い、障害原因と復旧計画なしに削除しません。ドライバー更新はデバイスマネージャーやOEM管理、Defender定義はセキュリティ製品の状態も合わせて確認します。
OSビルドとリリース情報で累積更新を確認する
Windowsの月例品質更新は累積で、最新の累積更新が過去の修正を含む場合があります。そのため古いKBを一つずつ探すより、WindowsのEdition、Version、OS Build、更新リビジョンを取得し、MicrosoftのWindowsリリース情報や対象KBのリリースノートと照合します。Get-ComputerInfoやWin32_OperatingSystemでWindowsVersion、OsBuildNumberなどを確認します。
Get-ComputerInfo |
Select-Object WindowsProductName, WindowsEditionId,
WindowsVersion, OsBuildNumber, OsArchitecture
製品名やWindowsVersionの表示はWindows版やAPIの互換性により期待と違う場合があるため、BuildNumberを重要な識別子として公式表と比較します。同じビルドでもエディション、アーキテクチャ、リリースチャネルが異なる可能性があります。記事に固定された「最新ビルド」を永久に使わず、確認日と公式ページを記録します。サポート期限も現在のMicrosoftライフサイクル情報で確認します。
イベントログで更新処理の時系列を補う
Applications and Services Logs配下のMicrosoft-Windows-WindowsUpdateClient/Operationalなどは、更新の検出、ダウンロード、インストール、失敗の手掛かりになります。Get-WinEventでログ名と障害時刻を絞り、TimeCreated、Id、LevelDisplayName、Messageを確認します。イベントIDの意味はWindows版とプロバイダーの公式資料を照合し、番号だけで原因を断定しません。
Get-WinEvent -FilterHashtable @{
LogName = "Microsoft-Windows-WindowsUpdateClient/Operational"
StartTime = (Get-Date).AddDays(-7)
} -MaxEvents 200 |
Select-Object TimeCreated, Id, LevelDisplayName, Message
ログ保持期間より古い更新は残っていない、管理者権限が必要、ログが無効または別管理基盤に集約される場合があります。ログがないことを更新なしとしません。同じHResultでもネットワーク、空き容量、証明書、サービス、適用条件など原因が異なるため、時刻、更新タイトル、KB、再起動、プロキシ、管理基盤を照合します。調査証拠となるログを消去しません。
一覧をCSVへ保存するときの列と機密性を決める
Get-HotFixの結果をレポートにするなら、端末名、HotFixID、Description、InstalledOn、取得時刻、OSビルドを選びます。InstalledByは目的がある場合だけ含めます。Update Agent履歴ならDate、Title、Operation、ResultCode、HResultを別データとして保存し、「現在適用済み」と「操作履歴」を混ぜません。表示用のFormat-TableをExport-Csvの前へ置かず、オブジェクトをSelect-Objectで整形します。
複数端末の差分では、更新が追加された、累積更新で置き換えられた、機能更新でビルドが変わった、履歴が保持期間外になった、取得失敗した、を区別します。CSVには端末名、アカウント、内部管理情報が含まれるため、公開共有へ置かずアクセス権と保管期限を設定します。管理基盤が正式な準拠ソースなら、ローカルCSVは補助証拠として扱います。
不足や失敗を見つけても更新基盤を壊さない
目的の更新が見つからない場合、まず対象OS・エディション・アーキテクチャ、適用条件、置き換え、サポート状態、管理リング、再起動待ち、空き容量、ネットワーク、プロキシ、日時、証明書を確認します。失敗履歴があるだけで、Windows Updateサービス停止、更新キャッシュの手動消去、更新アンインストールを初手にしません。ログと現在状態を保存します。
更新や再起動を実施するなら、組織のWSUS/Intune/WUfB/Configuration Manager手順、メンテナンス時間、利用者通知、BitLocker回復キー、バックアップ、ロールバック条件、既知の問題を確認します。セキュリティ更新を長期停止したり、証明書検証や保護機能を弱めたりせず、原因に合った公式トラブルシューティングへ進みます。確認用スクリプトから自動アンインストールや強制再起動を呼び出しません。
実務での確認チェックリスト
- QFE、CBSパッケージ、Update Agent履歴、ドライバー、定義更新を区別したか
- Get-HotFixがWin32_QuickFixEngineeringを使う範囲限定の一覧だと理解したか
- 特定KBの未検出とコマンド失敗、置き換え、対象外を分けたか
- Get-WindowsPackageのPackageStateと再起動・有効化状態を混同していないか
- QueryHistoryを現在インストール済み一覧と誤認していないか
- OSビルドとMicrosoftの累積更新リリース情報を照合したか
- ログ削除、更新基盤停止、アンインストールを読み取り確認から分離したか
結果は、取得日時、端末名、Windowsのエディションとビルド、PowerShellの版、実行ユーザー、対象範囲、取得方法とともに保存します。空の結果は「存在しない」と断定せず、権限、OS、実行コンテキスト、管理方式、保持期間、取得失敗を確認します。無効化、削除、アンインストール、再起動、設定変更へ進む場合は読み取り確認と分け、利用者への影響、承認、バックアップ、復旧方法を決めます。

コメント