AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 891188
Accepted
Max Muster
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 2 个回答
  • 10102 Views

2 个回答

  • Voted
  1. 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

    • 3
  2. 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 已通过上次更新完全修补。

    • 1

相关问题

  • 知道任何适用于 Windows 的快速可编写脚本的 ftp 客户端吗?[关闭]

  • 如果 Windows 服务崩溃,如何自动重新启动它?

  • 无法安排任务(访问被拒绝)

  • 物理机重启时自动重启虚拟机(VMWare)

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve