我希望能够通过查询注册表来检查计算机的更新状态。我特别希望有人能检查计算机的更新状态是否为“已完全更新”。
我查看了注册表中的很多条目,但没有找到具有计算机更新状态的条目。
我有哪些选项可以检查 Windows 更新状态?
答案1
我能找到的最接近注册表的是文件Windows Update log
。唯一的其他方法是通过 API 访问它COM
。
我与微软的主管Windows Update
(Dave Roth) 进行了交谈,他说你绝对不应该尝试通过注册表获取 Windows Update 的状态。他说你应该使用 APICOM
通过执行搜索方法获取状态,并使用返回的结果来获取计算机的更新状态。
他还给了我这个建议:
简单来说,为了检查安装了哪些更新,调用
IUpdateSearcher::Search
将IsInstalled=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-WindowsUpdateLog
cmdlet 将 Windows Update .etl 文件合并并转换为单个可读的 WindowsUpdate.log 文件。Windows Update 代理使用 Windows 事件跟踪 (ETW) 生成诊断日志。Windows Update 不再直接生成 WindowsUpdate.log 文件。相反,它会生成写入后无法立即读取的 .etl 文件。此 cmdlet 需要访问 Microsoft 符号服务器。
串行接口
该COM
API 是一种无需解析日志即可直接访问 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 已完全修复了最新更新。