11

我已经看到了许多在 python 中检索 WinXP+ 上已安装程序的方法。这样做的正确最可靠的方法是什么?

目前我正在HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall从那里访问和读取每个键以获取列表。(有人告诉我这不是正确的做事方式)我也看到了使用 WMI/Win32com 来执行此操作的示例,但也看到了一些评论以及 WMI 可能在某些机器上关闭的那些实现,并且这不是一个非常可靠的解决方案。

是否有一种既正确又可靠的方法来获取已安装程序的列表?我见过的 WMI 示例都没有在这台机器上运行(因此我不愿意使用它,我只运行 WinFLP;这是 XP 的剥离版本。)

我似乎还找到了我的搜索出现的 TechNet 文章,该文章提供了关于我的问题的类似答案:http: //gallery.technet.microsoft.com/ScriptCenter/en-us/154dcae0-57a1-4c6e- 8f9f-b215904485b7 请注意,平台下列出的 Vista/7 非常清楚地显示“不”...不会工作。因此,WMI 交易似乎是不可能的……

能够检索安装的路径也将是一个好处,因为现在我当前的代码不考虑安装在另一个驱动器上或非默认目录中的人。

4

2 回答 2

8

您提到的 technet 脚本在 Win 7(使用 Python 2.5 32 位)下完美运行,我真的不明白为什么它不应该。

实际上,WMI 方法的真正弱点在于它只列出通过 Windows Installer 安装的产品。所以它不会给你完整的列表。许多程序使用不同的安装程序。只需比较(从 Win32_Product 中选择 *)和控制面板中显示的结果。因此,除非您确定列表中与您有兴趣的程序安装了 MSI,否则 WMI 绝对不是答案。

所以它可能不是很pythonic,但据我所知,最好的方法是像你一样使用注册表。这实际上是控制面板的工作方式,因此至少 Windows 认为它​​是最可靠的方式。

于 2010-01-17T15:56:19.333 回答
3

WMI 是查找已安装程序的正确方法,因为它可以跨不同版本的操作系统工作,并且将在未来得到支持。寻找特定的 regkeys 可能适用于特定版本的 Windows,但不保证将来可以正常工作。这是一些简单的 python 代码,用于检查我刚刚在 Windows 7 上尝试过的 Box Sync。请注意,并非所有字段都适用于每个产品,因此请注意这些字段为“无”。

import wmi
w = wmi.WMI()
for p in w.Win32_Product():
    if 'Box, Inc.' == p.Vendor and p.Caption and 'Box Sync' in p.Caption:
        print 'Installed {}'.format(p.Version)

我看到的 WMI 的缺点是启动速度很慢。

于 2015-02-17T19:28:58.840 回答