通过注册表检测已安装的程序

时间:2009-01-09 21:06:14

标签: windows registry

我需要开发一个过程来检测用户计算机是否安装了某些程序,如果安装了,那么是什么版本。我相信我需要一个包含注册表位置和密钥的列表来查找并将其提供给程序,这不是问题。有没有更好的方法来实现这一目标?

我的第一个想法是在卸载条目中检查注册表,但似乎我想要检测的其中一个应用程序没有。使用应用程序进行输入的所有注册表的标准位置是什么?

9 个答案:

答案 0 :(得分:36)

在64位系统上,x64密钥为:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

大多数程序都列在那里。看看钥匙: DisplayName DisplayVersion

请注意,最后一个并不总是设置!

在64位系统上,x86密钥(通常包含更多条目)是:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall

答案 1 :(得分:35)

应将特定于用户的设置写入HKCU \ Software,将机器特定设置写入HKLM \ Software。在这些键下,结构[software vendor name]\[application name](例如HKLM\Software\Microsoft\Internet Explorer)可能是最常见的,但这只是一种惯例,而不是自然法则。

许多(大多数?)应用程序还将其卸载条目添加到HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\[app name],但同样,并非所有应用程序都会执行此操作。

这些是最重要的键;但是,注册表的内容不必完全代表已安装的软件 - 也许应用程序已安装一次,但随后被手动删除,或者卸载程序可能没有删除它的所有痕迹。如果您想确定,请检查文件系统以查看应用程序是否仍然存在于其注册表项所在的位置。

编辑:

如果您是群组管理员的成员,则可以查看HKEY_USERS配置单元 - 每个用户的HKCU实际驻留在那里(您需要知道用户SID,或完成所有这些操作)。

注意:正如@Brian Ensink所说,“已安装”是一个含糊不清的概念 - 我们是否试图找到用户可以运行的内容?有些软件甚至根本没有写入注册表:搜索“便携式应用程序”以查看经过特别修改的应用程序,直接从媒体(CD / USB)和运行以留下任何痕迹在计算机上的。我们可能还必须扫描磁盘,网络磁盘,用户下载的任何内容,以及互联网上可通过世界访问的Windows共享(是的,这些事情合法存在 - \\live.sysinternals.com\tools会浮现在脑海中。除非系统策略阻止,否则在这个方向上,用户可以运行的内容没有实际限制。

答案 2 :(得分:9)

您可以使用MSI API枚举Windows Installer安装的所有内容,但不会列出计算机上可用的所有软件。如果不了解您的需求,我认为“已安装”的概念有点模糊。有许多方法可以将软件部署到系统,从大型复杂的安装程序到ZIP文件以及介于两者之间的所有内容。

答案 3 :(得分:6)

应用程序不需要任何注册表项。实际上,根本不需要安装许多应用程序。 U3 USB记忆棒就是一个很好的例子;它们上的程序只是从文件系统运行。

如上所述,虽然可以通过卸载注册表项找到大多数好的应用程序。这实际上是一对钥匙,每用户和每台机器(HKCU / HKLM - Piskvor只提到了HKLM)。但它并没有(总是)给你安装目录。

如果它在HKCU,那么你必须意识到HKEY_CURRENT_USER真的意味着“当前用户”。其他用户拥有自己的HKCU条目和他们自己安装的软件。你找不到。阅读每个 HKEY_USERS配置单元都是具有漫游配置文件的企业网络上的灾难。您真的不想从远程[美国|中国|欧洲]办事处获取1000个帐户。

即使安装了应用程序,并且您知道在哪里,它也可能没有相同的“版本”概念。最好的来源是可执行文件中的“版本”资源。这确实是一个复数,所以你必须找到所有这些,从所有人那里提取版本资源,并在发生冲突的情况下决定合理的事情。

所以 - 祝你好运。有几种失败的方法。

答案 4 :(得分:2)

您可以使用PowerShell脚本查看寄存器并获取已安装的程序详细信息。下面的脚本将生成一个包含已安装程序的完整列表的文件。用“.ps”扩展名保存,然后双击该文件。

Error: quota exceeded (CPU allocation in function invocations : per day); 
check and increase your quota at https://console.cloud.google.com/iam-
admin/quotas?project=pass-
e098f&service=cloudfunctions.googleapis.com&usage=ALL. Function killed.

答案 5 :(得分:1)

除了上面提到的所有注册表项之外,您可能还需要查看仅为当前用户安装的程序的HKEY_CURRENT_USER \ Software \ Microsoft \ Installer \ Products。

答案 6 :(得分:0)

看起来像寻找已安装程序的特定内容会更好,但HKCU \ Software和HKLM \ Software是值得关注的地方。

答案 7 :(得分:0)

Win32_Product从不显示所有内容,只显示通过MSI安装程序安装的软件(据我所知)。

有很多软件包可以通过其他安装程序安装,但不会显示在那里。另一种方式是需要的。

答案 8 :(得分:0)

HKEY_CURRENT_USER \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AppCompatFlags \ Compatibility Assistant \ Persisted