是否可以通过注册表检测 Windows 更新状态,以查看系统是否“完全更新”?

是否可以通过注册表检测 Windows 更新状态,以查看系统是否“完全更新”?

我希望能够通过查询注册表来检查计算机的更新状态。我特别希望有人能检查计算机的更新状态是否为“已完全更新”。

我查看了注册表中的很多条目,但没有找到具有计算机更新状态的条目。

我有哪些选项可以检查 Windows 更新状态?

答案1

我能找到的最接近注册表的是文件Windows Update log。唯一的其他方法是通过 API 访问它COM

我与微软的主管Windows Update(Dave Roth) 进行了交谈,他说你绝对不应该尝试通过注册表获取 Windows Update 的状态。他说你应该使用 APICOM通过执行搜索方法获取状态,并使用返回的结果来获取计算机的更新状态。

他还给了我这个建议:

简单来说,为了检查安装了哪些更新,调用IUpdateSearcher::SearchIsInstalled=1生成一个updatecollection包含所有已安装更新的对象。您可以浏览它以查看已安装的内容。

扩展他的提示,您可以调用该方法来IsInstalled=0查看未安装哪些更新。(参见下面的 powershell 示例)。


Windows 更新日志文件

Windows 更新日志文件是查看 Windows 更新当前状态的好方法。如果您只能访问文件系统而无法访问 API 或其他框架/平台等,这种方法会很好。

您可以在以下路径找到它:
%windir%\Windowsupdate.log

Windows 更新日志文件的格式如下:
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文件中。该命令将从WindowsUpdate.log所有etl文件中编译文件,并使其(默认情况下)在当前用户的桌面文件夹中可用。

以下是该命令的描述:

Get-WindowsUpdateLogcmdlet 将 Windows Update .etl 文件合并并转换为单个可读的 WindowsUpdate.log 文件。Windows Update 代理使用 Windows 事件跟踪 (ETW) 生成诊断日志。Windows Update 不再直接生成 WindowsUpdate.log 文件。相反,它会生成写入后无法立即读取的 .etl 文件。

此 cmdlet 需要访问 Microsoft 符号服务器。


串行接口

COMAPI 是一种无需解析日志即可直接访问 Windows 更新的好方法。此 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 脚本以适合您的应用程序。

需要注意的是,搜索功能似乎不是异步的,因此在搜索时会冻结您的应用程序。在这种情况下,您需要将其设置为异步。


太长了

如果您正在构建非脚本(编译)类型的应用程序(可以访问 API 的 PowerShell 除外COM),那么我建议使用 API COM。否则,日志解析将是您的最佳选择。


链接

如何读取日志文件:
https://support.microsoft.com/en-us/help/902093/how-to-read-the-windowsupdalog-file

PowerShell 日志编译 cmdlet:
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

答案2

微软现在使用 UBR(统一版本修订)值来标识补丁级别。该值首次添加到 Windows 10

在此处输入图片描述

,但现在已移植到 Windows 7

在此处输入图片描述

以及 Windows 8.1

在此处输入图片描述

因此,查询 UBR 值HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion并查看更新历史记录页面(例如Windows 10 v1709KB123456 (OS Build 16299.XYZ)(例如)左侧的值:

在此处输入图片描述

在这里您可以看到我的 1709 已完全修复了最新更新。

相关内容