web-dev-qa-db-ja.com

レジストリを使用してWindows Updateのステータスを検出し、システムが「完全に更新」されているかどうかを確認することはできますか?

レジストリを照会して、コンピューターの更新ステータスを確認できるようにしたいと思います。特に、コンピュータの更新ステータスが「完全に更新されている」かどうかを確認してほしい。

レジストリの多くのエントリを調べましたが、コンピュータの更新ステータスを持つエントリを見つけることができませんでした。

Windowsの更新ステータスを確認するにはどのようなオプションが必要ですか?

1
Max Muster

私が見つけることができるレジストリに最も近いのはWindows Update logファイルです。他の唯一の方法は、COM AP​​Iを介してそれにアクセスすることです。

私はWindows Update(Dave Roth)の責任者であるMicrosoftのマネージャーと話しました。彼は、レジストリを介してWindows Updateのステータスを取得することは絶対に避けてください。彼は、検索メソッドを実行し、返された結果を使用してコンピューターの更新ステータスを取得することにより、COM AP​​Iを使用してステータスを取得する必要があると述べました。

彼はまた、このヒントをくれました:

単純な参考までに、インストールされているアップデートを確認するために、IUpdateSearcher::SearchIsInstalled=1で呼び出すと、インストールされているすべてのアップデートを含むupdatecollectionオブジェクトが生成されます。ウォークスルーして、すでにインストールされているものを確認できます。

彼の先端を拡張すると、IsInstalled=0を使用してそのメソッドを呼び出し、インストールされていない更新を確認できます。 (以下のPowerShellの例を参照してください)。


Windows Updateログファイル

Windows Updateログファイルは、Windows Updateの現在のステータスを確認するのに適した方法です。この方法は、ファイルシステムにのみアクセスでき、APIや他のフレームワーク/プラットフォームなどにアクセスできない場合に適しています。

あなたはこのパスでそれを見つけることができます:
%windir%\Windowsupdate.log

Windows Updateログファイルは次の形式です。
DateTimePIDTIDComponentText

テンプレートデータを含む行の例は次のようになります。
[date][time] [PID][TID][Component][Text]

ここに完全な例があります:
2005-06-0118:30:03 992810Agent * WU client version 5.8.0.2468

以下は、Windows Updateエージェントが利用可能な更新を検索して結果を出力する例です。

2005-06-0212:09:36 9924e8Agent*************
2005-06-0212:09:36 9924e8Agent** START **  Agent: Finding updates [CallerId = WindowsUpdate]
2005-06-0212:09:36 9924e8Agent*********
2005-06-0212:09:36 9924e8Agent  * Added update {AC94DB3B-E1A8-4E92-9FD0-E86F355E6A44}.100 to search result
2005-06-0212:09:37 9924e8Agent  * Found 6 updates and 10 categories in search

最新のシステムでは、PowerShellコマンドレットGet-WindowsUpdateLogを実行する必要があります。ログはログに保存されなくなったため、ログはetlファイルに保存されます。このコマンドは、すべてのetlファイルからWindowsUpdate.logファイルをコンパイルし、現在のユーザーのデスクトップフォルダーで(デフォルトで)使用できるようにします。

コマンドの説明は次のとおりです。

Get-WindowsUpdateLogコマンドレットは、Windows Update .etlファイルをマージして、単一の読み取り可能なWindowsUpdate.logファイルに変換します。 Windows Updateエージェントは、Windowsのイベントトレース(ETW)を使用して診断ログを生成します。 Windows Updateは、WindowsUpdate.logファイルを直接生成しなくなりました。代わりに、書き込まれたとおりにすぐに読み取ることができない.etlファイルを生成します。

このコマンドレットには、Microsoftシンボルサーバーへのアクセスが必要です。


COM API

COM AP​​Iは、ログを解析せずにWindows Updateに直接アクセスするための優れた方法です。このAPIのアプリケーションの範囲は、コンピューターで使用可能な更新の検索から、更新のインストールおよびアンインストールまでです。

Microsoft.Update.Sessionクラスを使用して更新検索を実行し、利用可能な更新の数をカウントして、コンピューターに更新があるかどうかを確認できます。

PowerShellの例:

$updateObject = New-Object -ComObject Microsoft.Update.Session
$updateObject.ClientApplicationID = "Serverfault Example Script"
$updateSearcher = $updateObject.CreateUpdateSearcher()
$searchResults = $updateSearcher.Search("IsInstalled=0")
Write-Host $searchResults.Updates.Count

返された結果が0より大きい場合は、インストールまたはダウンロード、あるいはその両方が必要なコンピューターの更新があります。アプリケーションに合わせて、PowerShellスクリプトを簡単に更新できます。

ヘッドアップしただけですが、検索機能は非同期ではないため、検索中にアプリケーションがフリーズします。その場合は、非同期にする必要があります。


Tl; Dr

COM AP​​IにアクセスできるPowerShellを除いて)非スクリプト(コンパイル済み)タイプのアプリケーションを構築している場合は、COM AP​​Iを使用することをお勧めします。それ以外の場合は、ログの解析が最良のオプションです。


リンク集

ログファイルの読み取り方法:
https://support.Microsoft.com/en-us/help/902093/how-to-read-the-windowsupdalog-file

PowerShellログコンパイルコマンドレット:
https://docs.Microsoft.com/en-us/powershell/module/windowsupdate/get-windowsupdatelog?view=win10-ps

Com32 APIリファレンス:
https://msdn.Microsoft.com/en-us/library/windows/desktop/aa387099(v = vs.85).aspx

3
Elliot Labs LLC

マイクロソフトは現在、パッチレベルを識別するために値UBR(Unified Build Revision)を使用しています。この値はWindows 10で最初に追加されました

enter image description here

、しかし今はWindows 7にバックポートされています

enter image description here

およびWindows 8.1も

enter image description here

したがって、_HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion_からUBR値をクエリし、左側の値KB123456 (OS Build 16299.XYZ)の更新履歴ページ(例として Windows 10 v1709 の場合)を確認します。

enter image description here

ここで、私の1709が最後の更新で完全にパッチされていることがわかります。

1
magicandre1981