WMI"已安装"查询与添加/删除程序列表不同?

rom*_*das 39 windows wmi windows-installer

尝试使用WMI获取已安装的Windows XP程序列表.使用wmic,我试过:

wmic /output:c:\ProgramList.txt product get name,version
Run Code Online (Sandbox Code Playgroud)

我得到了许多已安装程序的列表,但在根据显示的"添加/删除程序"清除此列表后,我看到添加/删除程序的GUI中列出的程序多于WMI查询.我需要使用另一个WMI查询来安装其余的程序吗?或者还有其他一些我需要寻找的地方吗?

此外,WMI查询中列出的两个已安装的程序不在"添加/删除程序"中.知道为什么吗?

Rob*_*upt 29

我相信您的语法是使用WMI中的Win32_Product类.一个原因是此类仅显示使用Windows Installer安装的产品(请参阅此处).卸载注册表项是您最好的选择.以下是一些监视注册表项的代码.

评论更新:

卸载注册表项是列出已安装内容和未安装内容的标准位置.它是"添加/删除程序"列表用于填充应用程序列表的位置.我确信有些应用程序没有在此位置列出自己.在这种情况下,您必须采用另一种更粗糙的方法,例如搜索Program Files目录或查看Start Menu Programs List.这两种方式都绝对不理想.

在我看来,查看注册表项是最好的方法.


Bob*_*toe 13

所有添加/删除程序实际上正在读取此注册表项:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall
Run Code Online (Sandbox Code Playgroud)


saa*_*ehr 7

除了已安装程序最常用的注册表项:

HKEY_LOCAL_MACHINE\SOFTWARE \微软\的Windows\CurrentVersion \卸载

wmic命令和添加/删除程序还查询另一个注册表项:

HKEY_CLASSES_ROOT \安装\产品

列表中显示的软件名称从此键中的数据条目的值中读取,名为:ProductName

从上述两个位置删除某个产品的注册表项将使其无法显示在添加/删除程序列表中.这不是卸载程序的方法,它只是从已知的Windows中删除条目作为已安装的软件.

因为,通过使用此方法,您将失去使用添加/删除列表中的"删除"按钮从系统中清除软件的机会; 建议在删除文件之前将注册表项导出到文件中.将来,如果您决定将该项目带回列表,则只需运行您存储的注册表文件即可.


Tyl*_*ier 5

我一直在使用Inno Setup作为安装程序.我只使用64位Windows 7.我发现正在写入注册表项

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node \微软\的Windows\CurrentVersion \卸载

我还没有弄清楚如何让WMI报告这个列表(尽管程序列在程序和功能中已安装).如果我弄明白,我会记得在这里报告.

更新:

安装在64位计算机上的32位程序的条目将进入该注册表位置.这里写的更多:

http://mdb-blog.blogspot.com/2010/09/c-check-if-programapplication-is.html

请参阅我的评论,其中描述了同一帖子中的32位与64位行为:

http://mdb-blog.blogspot.com/2010/09/c-check-if-programapplication-is.html?showComment=1300402090679#c861009270784046894

不幸的是,似乎没有办法让WMI列出添加/删除程序列表中的所有程序(也就是Windows 7中的程序和功能,不确定Vista).我当前的代码已经放弃了WMI,转而使用注册表.查询注册表的代码本身比使用WMI更容易.示例代码在上面的链接中.


qua*_*tme 5

不是最好的,但是否实用的方法:

使用HijackThis。(旧版本:HijackThis

运行劫持,单击“打开其他工具部分”按钮

劫持这个主菜单

单击“打开卸载管理器”

劫持此配置

单击保存列表(*.txt),按照提示选择“是”,记事本将打开您的添加/删除程序列表。

HijackThis 添加/删除程序管理器


来源

  • @romandas,我认为给出这个答案是因为 Quantme 假设发帖人对 WMI 查询没有纯粹的理论兴趣,但实际上是在尝试获取完整且可靠的已安装程序列表。这个答案也是对子问题“或者我需要在其他地方寻找其余的吗?”的答复。 (5认同)

Hac*_*koo 5

您可以使用 powershell 和批处理文件在一行中获取它:

@echo off
Powershell /command "Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-List"
Pause
Run Code Online (Sandbox Code Playgroud)