WMI“安装”查询不同于添加/删除程序列表?

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

wmic /output:c:\ProgramList.txt product get name,version 

我列出了很多已安装的程序,但是在清除了“添加/删除程序”显示的列表之后,我看到在“添加/删除程序”的GUI中列出的程序比在WMI查询中列出的要多得多。 是否有另一个WMI查询我需要用来获取其余的程序安装? 还是有其他地方我需要找其余的rest吗?

此外,有两个已安装的程序在WMI查询中列出不在添加/删除程序中。 任何想法为什么?

我相信你的语法是使用WMI中的Win32_Product类。 其中一个原因是该类仅显示使用Windows Installer安装的产品( 请参见此处 )。 卸载registry键是你最好的select。 这里有一些代码来监视registry项。

更新评论:

卸载registry项是列出已安装的内容和未安装的内容的标准位置。 这是“添加/删除程序”列表将用于填充应用程序列表的位置。 我确定有些应用程序不会在这个位置列出来。 在这种情况下,你不得不求助于另一种粗鲁的方法,比如searchProgram Files目录或者查看开始菜单程序列表。 这两种方式绝对不是理想的。

在我看来,查看registry项是最好的方法。

所有这些添加/删除程序实际上是读这个registry项:

 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall 

除了最常用的安装程序registry键:

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

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

HKEY_CLASSES_ROOT \安装\产品

列表中显示的软件名称是从该项内的数据条目的值中读取的:ProductName

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

因为使用这种方法,您将失去使用“添加/删除”列表中的“删除”button清除系统中软件的机会; build议在删除它们之前将registry项导出到文件。 将来,如果您决定将该项目带回列表中,则只需运行您存储的registry文件即可。

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

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

我还没有想出如何让这个列表被WMI报告(虽然程序被列为安装在程序和function中)。 如果我知道了,我会尽量记得在这里报告。

更新:

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

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中的程序和function,不确定Vista)中列出所有程序。 我目前的代码已经放弃了WMI而倾向于使用registry。 询问registry的代码本身比使用WMI更容易。 示例代码位于上面的链接中。

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

使用HijackThis 。

运行劫持这个,点击“打开杂项工具部分”button

HijackThis主菜单

点击“打开卸载pipe理器”

HijackThis配置

点击保存列表(* .txt),是的提示,记事本将打开您的添加/删除程序列表。

HijackThis添加/删除程序管理器


资源

已安装的产品由已安装的软件元素和function组成,因此值得检查PRODUCT的wmic别名以及检查SOFTWAREELEMENT和SOFTWAREFEATURE:

 wmic product get name,version wmic softwareelement get name,version wmic softwarefeature get name,version 

为了构build出现在控制面板的“程序和特性”中的或多或less可靠的应用程序列表,您必须考虑并非所有的应用程序都是使用MSI安装的。 WMI只提供与MSI一起安装的。

这里是我发现的一个简短的总结:

MSI应用程序始终在HKLM\...\Uninstall和/或HKLM\...\Installer\UserData\S-1-5-18\Products下有一个产品代码(GUID)子项。 另外,他们可能有一个看起来像HKLM\...\Uninstall\NotAGuid

非MSI应用程序没有产品代码,因此具有诸如HKLM\...\Uninstall\NotAGuidHKCU\...\Uninstall\NotAGuid

添加/删除程序还必须查看此registry项来查找当前用户的安装:

 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall 

Google Chrome,Dropbox或通过JavaWS(web start)JNLP安装的快捷方式等应用程序只能在这里find。

我为我的需要调整了MS-Technet VBScript。 它将Wow6432Node以及标准条目转储到“programms.txt”中使用,风险自负,不作保证!

另存为dump.vbs

从命令行input: wscript dump.vbs

 Const HKLM = &H80000002 Set objReg = GetObject("winmgmts://" & "." & "/root/default:StdRegProv") Set objFSO = CreateObject("Scripting.FileSystemObject") outFile="programms.txt" Set objFile = objFSO.CreateTextFile(outFile,True) writeList "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\", objReg, objFile writeList "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\", objReg, objFile objFile.Close Function writeList(strBaseKey, objReg, objFile) objReg.EnumKey HKLM, strBaseKey, arrSubKeys For Each strSubKey In arrSubKeys intRet = objReg.GetStringValue(HKLM, strBaseKey & strSubKey, "DisplayName", strValue) If intRet <> 0 Then intRet = objReg.GetStringValue(HKLM, strBaseKey & strSubKey, "QuietDisplayName", strValue) End If objReg.GetStringValue HKLM, strBaseKey & strSubKey, "DisplayVersion", version objReg.GetStringValue HKLM, strBaseKey & strSubKey, "InstallDate", insDate If (strValue <> "") and (intRet = 0) Then objFile.Write strValue & "," & version & "," & insDate & vbCrLf End If Next End Function