Max Muster Asked: 2018-01-09 03:57:03 +0800 CST2018-01-09 03:57:03 +0800 CST 2018-01-09 03:57:03 +0800 CST 是否可以通过注册表检测 Windows 更新状态,以查看系统是否“完全更新”? 772 我希望能够通过查询注册表来检查计算机的更新状态。我特别希望有人检查计算机的更新状态是否为“完全更新”。 我查看了注册表中的许多条目,但找不到具有计算机更新状态的条目。 我有哪些选项可以检查 Windows 更新状态? windows 2 个回答 Voted Best Answer Elliot Labs LLC 2018-01-09T11:53:55+08:002018-01-09T11:53:55+08:00 我能找到的最接近注册表的是Windows Update log文件。唯一的另一种方法是通过COMAPI 访问它。 我与负责 (Dave Roth) 的 Microsoft 经理进行了交谈,Windows Update他说您绝对不应该尝试通过注册表获取 Windows Update 的状态。他说你应该使用COMAPI通过执行搜索方法来获取状态,并使用返回的结果来更新你的计算机的状态。 他还给了我这个提示: 作为一个简单的 FYI,为了检查安装了哪些更新,调用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 更新代理搜索可用更新并输出结果的示例: 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 commandlet Get-WindowsUpdateLog,因为日志现在不再存储在日志中,日志存储在etl文件中。该命令WindowsUpdate.log将从所有文件编译文件,etl并使其在当前用户的桌面文件夹中可用(默认情况下)。 以下是该命令的说明: 该Get-WindowsUpdateLogcmdlet 将 Windows Update .etl 文件合并并转换为单个可读的 WindowsUpdate.log 文件。Windows 更新代理使用 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 脚本以适应您的应用程序。 请注意,搜索功能似乎不是异步的,因此它会在搜索时冻结您的应用程序。在这种情况下,您将希望使其异步。 铊;博士 如果您正在构建非脚本(编译)类型的应用程序(除了可以访问COMAPI 的 PowerShell),那么我建议您使用COMAPI。否则日志解析将是您的最佳选择。 链接 如何读取日志文件: 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 magicandre1981 2018-01-18T08:34:58+08:002018-01-18T08:34:58+08:00 Microsoft 现在使用值 UBR(统一构建版本)来识别补丁级别。该值最初是在 Windows 10 中添加的 , 但现在向后移植到 Windows 7 以及 Windows 8.1 因此,查询 UBR 值HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion并查看更新历史记录页面(以Windows 10 v1709为例)以获取KB123456 (OS Build 16299.XYZ)左侧的值: 在这里您可以看到我的 1709 已通过上次更新完全修补。
我能找到的最接近注册表的是
Windows Update log
文件。唯一的另一种方法是通过COM
API 访问它。我与负责 (Dave Roth) 的 Microsoft 经理进行了交谈,
Windows Update
他说您绝对不应该尝试通过注册表获取 Windows Update 的状态。他说你应该使用COM
API通过执行搜索方法来获取状态,并使用返回的结果来更新你的计算机的状态。他还给了我这个提示:
扩展他的提示,您可能会调用该方法
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 更新代理搜索可用更新并输出结果的示例:
在现代系统上,您将需要运行 PowerShell commandlet
Get-WindowsUpdateLog
,因为日志现在不再存储在日志中,日志存储在etl
文件中。该命令WindowsUpdate.log
将从所有文件编译文件,etl
并使其在当前用户的桌面文件夹中可用(默认情况下)。以下是该命令的说明:
通讯接口
COM
API 是无需解析日志即可直接访问 Windows 更新的好方法。此 API 的应用范围从在计算机上查找可用更新到安装和卸载更新。您可以使用 Microsoft.Update.Session 类运行更新搜索,然后计算可用更新的数量以查看计算机是否有任何更新。
PowerShell 示例:
如果返回的结果大于 0,则需要安装和/或下载计算机的更新。您可以轻松更新 powershell 脚本以适应您的应用程序。
请注意,搜索功能似乎不是异步的,因此它会在搜索时冻结您的应用程序。在这种情况下,您将希望使其异步。
铊;博士
如果您正在构建非脚本(编译)类型的应用程序(除了可以访问
COM
API 的 PowerShell),那么我建议您使用COM
API。否则日志解析将是您的最佳选择。链接
如何读取日志文件: 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
Microsoft 现在使用值 UBR(统一构建版本)来识别补丁级别。该值最初是在 Windows 10 中添加的
, 但现在向后移植到 Windows 7
以及 Windows 8.1
因此,查询 UBR 值
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
并查看更新历史记录页面(以Windows 10 v1709为例)以获取KB123456 (OS Build 16299.XYZ)
左侧的值:在这里您可以看到我的 1709 已通过上次更新完全修补。