以编程方式获取 Windows 中所有已安装更新的列表
Posted
技术标签:
【中文标题】以编程方式获取 Windows 中所有已安装更新的列表【英文标题】:Programmatically get a list of all installed updates in Windows 【发布时间】:2019-03-12 22:14:19 【问题描述】:我想以编程方式获取所有已安装 KB 的列表。这可能是 python 代码、WinAPI(我将从 python 调用)、运行另一个进程并解析其输出等。我感兴趣的是安全更新,我不在乎是否返回其他更新。但是,我也想要软件更新,而不仅仅是 Windows——控制面板的“已安装更新”窗口中显示的任何内容。 同样重要的是,此代码将在所有版本的 Windows 上运行,而不仅仅是单个版本(我不介意代码中有 if-else,对于不同的 Windows 版本具有不同的行为 - 最终它可以工作很重要) .
我尝试了wmic qfe
、systeminfo
和 PowerShell 的get-hotfix
,所有这些都只返回操作系统更新。
我自己有一个 Windows 10,但我在注册表或文件系统中找不到所有 KB 一起列出的地方。也无法理解 Procmon 的输出(在录制打开“已安装更新”后)——太大且不够集中。似乎在不同的地方列出了不同的更新,但我无法轻松理解如何扩展/概括。
编辑: 我找到了这段代码:https://codereview.stackexchange.com/questions/135648/find-installed-and-available-windows-updates
我尝试在我的计算机上运行它,它发现一些 KB 既没有出现在我运行的命令行命令中,也没有出现在“已安装的更新”中。另一方面,也有没有出现在那里但确实出现在其他位置的 KB。
谢谢!
【问题讨论】:
嗨@Eran。我没有为您提供完整的解决方案,但是,如果您尝试在此处使用我的答案进一步探索:***.com/questions/48382393/…,您可能会接近您正在查看的内容!祝你好运。 【参考方案1】:qfe 的问题在于较新的 Windows 版本包含与 CBS 无关的组件的更新,因此wmic path Win32_QuickFixEngineering
不会显示它们。
诀窍是对更新程序系统使用 COMObject。 我编写了一个小包来完成这项工作,并通过 COM、WMI 和注册表检查更新。
通过 COM 与 windows update 对话提供了最多的信息。 WMI 提供了一些信息,而注册表当然只提供 KB 和安装日期。
安装
pip install windows_tools.updates
搭配使用
from windows_tools.updates import get_windows_updates
for update in get_windows_updates(filter_duplicates=True):
print(update)
由于显示大量的 AV 定义更新,启用了重复过滤器。
【讨论】:
不完美(我当前的代码在我的机器上找到 26 个唯一已安装的 KB,而您的仅找到 13 个),但是 +1 并被接受以适应较新的更新系统(在我的机器)和一个现成的 pip 包很有用。您可能需要考虑将其他收集方法添加到您的库中(我的代码来自 COM、registry 和 wmi)。干杯! @EranZimmermanGonen 感谢您的评论。我已经更新了我的包以包含 COM、WMI 和 REG 获取更新的方法。你介意给它一个测试运行并报告吗? 您上传了新版本吗? pip 告诉我我是最新的,pypi.org 也显示 1.1.0 作为最新版本。 @EranZimmermanGonen 确实,我已将其上传到测试 pypi 存储库。生产 pypi 上的上传现已完成;)以上是关于以编程方式获取 Windows 中所有已安装更新的列表的主要内容,如果未能解决你的问题,请参考以下文章