レジストリを照会して、コンピューターの更新ステータスを確認できるようにしたいと思います。特に、コンピュータの更新ステータスが「完全に更新されている」かどうかを確認してほしい。
レジストリの多くのエントリを調べましたが、コンピュータの更新ステータスを持つエントリを見つけることができませんでした。
Windowsの更新ステータスを確認するにはどのようなオプションが必要ですか?
私が見つけることができるレジストリに最も近いのはWindows Update log
ファイルです。他の唯一の方法は、COM
APIを介してそれにアクセスすることです。
私はWindows Update
(Dave Roth)の責任者であるMicrosoftのマネージャーと話しました。彼は、レジストリを介してWindows Updateのステータスを取得することは絶対に避けてください。彼は、検索メソッドを実行し、返された結果を使用してコンピューターの更新ステータスを取得することにより、COM
APIを使用してステータスを取得する必要があると述べました。
彼はまた、このヒントをくれました:
単純な参考までに、インストールされているアップデートを確認するために、
IUpdateSearcher::Search
をIsInstalled=1
で呼び出すと、インストールされているすべてのアップデートを含むupdatecollection
オブジェクトが生成されます。ウォークスルーして、すでにインストールされているものを確認できます。
彼の先端を拡張すると、IsInstalled=0
を使用してそのメソッドを呼び出し、インストールされていない更新を確認できます。 (以下のPowerShellの例を参照してください)。
Windows Updateログファイルは、Windows Updateの現在のステータスを確認するのに適した方法です。この方法は、ファイルシステムにのみアクセスでき、APIや他のフレームワーク/プラットフォームなどにアクセスできない場合に適しています。
あなたはこのパスでそれを見つけることができます:%windir%\Windowsupdate.log
Windows Updateログファイルは次の形式です。Date
Time
PID
TID
Component
Text
テンプレートデータを含む行の例は次のようになります。[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は、ログを解析せずに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スクリプトを簡単に更新できます。
ヘッドアップしただけですが、検索機能は非同期ではないため、検索中にアプリケーションがフリーズします。その場合は、非同期にする必要があります。
(COM
APIにアクセスできるPowerShellを除いて)非スクリプト(コンパイル済み)タイプのアプリケーションを構築している場合は、COM
APIを使用することをお勧めします。それ以外の場合は、ログの解析が最良のオプションです。
ログファイルの読み取り方法:
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
マイクロソフトは現在、パッチレベルを識別するために値UBR(Unified Build Revision)を使用しています。この値はWindows 10で最初に追加されました
、しかし今はWindows 7にバックポートされています
およびWindows 8.1も
したがって、_HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
_からUBR値をクエリし、左側の値KB123456 (OS Build 16299.XYZ)
の更新履歴ページ(例として Windows 10 v1709 の場合)を確認します。
ここで、私の1709が最後の更新で完全にパッチされていることがわかります。