0

我的安装项目需要检测已安装的程序作为先决条件或选择退出某些组件。msi 函数MsiGetProductInfo()MsiEnumRelatedProducts()函数公开了所需的功能。

但不幸的是,我无法在任何地方找到所需的 Microsoft 软件产品和升级代码来检查。有谁知道在哪里查找它们?由于大多数软件包和/或序列号不可用,Testwise 安装这些产品以确定代码不是一种选择。

我可能会尝试下载每个包并使用 Orca 进行检查,但由于我们的互联网连接很小,这需要几天甚至几周的时间,所以我更喜欢更简单的方法。

目前,最重要的所需数据是 Microsoft Office 2010 家族及其版本的代码。但在未来,这些肯定是我需要检查的其他产品。

提前感谢您的帮助,汉内斯

4

2 回答 2

2

Office 产品有多种 SKU,它们具有不同的 ProductCode 和 UpgradeCode 属性。出于这个原因,我不使用它们。相反,查看物理注册表项和 DLL 以指示已安装所需的功能(实际依赖项)。

于 2013-07-08T14:26:32.627 回答
1

理解你的问题并不容易。如果您希望能够构建一个检测必要的INSTALLPROPERTY_INSTALLEDPRODUCTNAMEs 的设置,您必须至少有一台安装了所有先决条件的机器 - 不是吗?

要获取所有已安装 ProductCodes 的列表,您可以使用 MsiEnumProducts() 或 MsiEnumProductsEx()。

您刚刚给出了一些正确的 API 函数。“准确找到所需产品/升级代码的问题在哪里?您期望的产品不在列表中,或者您没有尝试生成已安装程序的列表?MsiGetProductInfo() 的一个返回属性将为您提供 INSTALLPROPERTY_INSTALLEDPRODUCTNAME 信息例如,这对你来说还不够吗?

而不是自己编程:有一个工具 msiinv.exe 可用于获取此类已安装程序及其代码的列表,例如从这里: https ://skydrive.live.com/?cid=27e6a35d1a492af7&id=27E6A35D1A492AF7%21910&authkey= !ANs8Pr0aVhaT_qQ 使用示例:c:\msiinv\msiinv.exe -p > c:\msiinv\msiinv_output.txt 在此处关注 Aaron Stebners 博客了解更多信息(例如,当下载链接已过期时):http: //blogs.msdn.com /b/astebner/archive/2005/07/01/434814.aspx

你也可以用一些脚本来做到这一点。

首先,使用 ProductCodes 来识别外来包不是一个好主意,因为对该包的简单更新会更改该代码。UpgradeCode 更好,但是..

但是如果你想识别更大的产品,比如 Office 或 SQL Server,它可以是一个 PITA 来真正识别所有正确的包,而不是可选的包,来处理特定语言的包,处理 32 位或 64 位包。即使您是专家,我也不建议在复杂情况下依赖 MSI 代码。很容易失败。尝试在 HKLM\Software\Microsoft 下找到一个注册表项,该注册表项在版本之间是持久的,甚至更好地告诉版本,例如 HKLM\Software\Microsoft\Microsoft SQL Server 下的一个键用于搜索此产品,类似于 Office 等。

随便问一下,有没有剩下的。

于 2013-07-08T18:40:11.150 回答