在标题中,当我有一些MSI包时,是否可以看到哪些包依赖于它?如果有,怎么样?
如果那是不可能的,至少可以告诉Msiexec根据需要卸载所有依赖包吗?
答案 0 :(得分:2)
两者都不。 Windows Installer跟踪包对组件的依赖关系,但不追踪包之间的依赖关系。在某些情况下,您可能能够推断包级别的依赖关系,例如通过读取系统搜索,但Windows Installer在这里没有任何原生的。
这是您认为建议将Visual C ++运行时安装为单独的.msi(或.exe)的人与建议通过合并其合并模块安装它的人之间存在紧张关系的部分原因。前者更容易推理,但只有后者会对依赖它的包进行适当的引用计数。
答案 1 :(得分:2)
简而言之:是和否。我想。可以按顺序安装几个MSI文件,而没有任何可靠的方法来判断它们是否实际上与产品相关,但它们也可以通过各种机制捆绑在一起,以便它们可以作为单个单元安装。 (套房或引导者,见下文),但它们可能仍然没有被标记为"安装后属于一起。
Installshield 等商业工具有" 设置套件"我认为他们被称为。我相信他们甚至可以在“添加/删除程序”中输入一个条目,但我不确定(我们始终无法访问所有最新版本的商业工具)。
WiX - 用于提供MSI文件的开源框架 - 有一个名为 Burn 的功能(甚至可能是我无法提速的其他机制)。它允许您使用启动器GUI按顺序运行多个MSI文件。
我还称其他解决方案或 bootstrappers (here is one,我未经测试),按顺序安装MSI文件,或者安装先决条件运行时组件。
人们也可以使用自己的启动器或安装程序GUI来运行MSI安装程序或其他安装类型"引擎盖下#34;以任何所需的顺序。 The installer for Visual Studio 附带了一个GUI,您可以在其中选择要安装的不同软件包。
重点是,通过运行这些启动器并检查它们安装的内容,您可以了解"属于一起的设置"。检查供应商下载站点,看看是什么包含在捆绑包中。
当MSI文件彼此相关时,还有一些其他线索。" 升级表" MSI内部将指定相关产品(以及因此用于安装它们的相关MSI文件),这些产品要么仅作为新MSI文件安装的一部分进行检测或检测和卸载。这是Windows Installer升级机制的一部分,称为主要升级。此表中有很大的灵活性,因此您可以检测产品而不是卸载它们但继续,或者您可以检测产品并拒绝安装(例如,如果发现安装了更高版本的MSI)。 请注意,升级表通常不会检测其他相关产品(尽管可以),而是检测同一产品的不同版本,这些版本将作为主要升级操作的一部分进行升级。作为技术tidbit我在下面添加了一节,介绍如何查找指定升级代码的所有相关产品代码。
最后,这可能是最简单的线索" - 您可以在ProgramFilesFolder层次结构下查看MSI的主要安装位置 。此位置通常会在这些行中显示公司名称和产品名称:ProgramFilesFolder\Company Name\Product Name
- 您可以添加到该主要版本名称。安装到同一Company Name
文件夹的MSI文件可能是相关的。
并在此答案的底部检查是否有可能使用" 安装日期" MSI包确定同时安装的包(表示相关)。同样地," 制造商/发布商"对于MSI文件可以指示"共同下降"。可能是" 安装源"同样(安装最初运行或启动的磁盘上的位置)。
我希望这能回答你的问题。正如Urman指出的那样,很难分辨出安装的MSI需要哪些必备软件包,但您可以使用依赖扫描程序来确定主应用程序二进制文件有哪些运行时间来获取线索。 这完全取决于您的问题究竟是什么以及您想要弄清楚什么。
通过运行以下VBScript,您可以找到共享相同升级代码的所有已安装的MSI文件。您必须输入有效的升级代码(可在MSI的属性表中找到您要查找的相关产品)。
实际的MSI API调用是Set upgrades = installer.RelatedProducts(upgradecode)
- 其余代码是支持结构。您可以尝试的示例升级代码可能是{AA783A14-A7A3-3D33-95F0-9A351D530011}
- Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.4148
(如果已安装)。它是3个相关的MSI软件包之一,因此您可以获得3个产品代码 - 只要首先安装软件包:
Dim relatedproductcodes, upgradecode : relatedproductcodes = "No related product codes found"
Dim installer : Set installer = CreateObject("WindowsInstaller.Installer")
upgradecode = InputBox("Please paste or type in the upgrade code you want to find all related product codes for." + _
vbNewLine + vbNewLine + "Upgrade codes are found in an MSI's Property table, if it has been defined.", + _
"Find Related Product Codes:")
If upgradecode = vbCancel Or Trim(upgradecode) = "" Then
WScript.Quit(0)
End If
On Error Resume Next
Set upgrades = installer.RelatedProducts(upgradecode)
If (Err.number <> 0) Then
MsgBox "Invalid upgrade code - aborting.", vbCritical, "Fatal error."
WScript.Quit(2) ' Following exit code "standard" from MSI SDK automation samples
End If
If upgrades.Count > 0 Then relatedproductcodes = ""
For Each u In upgrades
relatedproductcodes = relatedproductcodes & u & vbNewLine
Next
MsgBox "The related product codes for the specified Upgrade Code: " + vbNewLine + vbNewLine + relatedproductcodes
我怀疑这会对你有多大帮助,我只是想我会告诉你如何它是有用的。如果是,那么我有一个更全面的脚本供我自己使用,它将生成一个完整的MSI相关信息列表作为html导出 - 包括相关的产品代码。
升级:事实上,看看这样的html导出,我可以看到&#34; 安装日期&#34;列表显示了包装盒上每个MSI包的安装顺序 - 这是安装在一起的包的另一个指示,因此可以是相关的。应该注意的是,此日期不一定是安装的原始日期,而是其最新的&#34;修改操作&#34;。所以不能依赖它。
示例输出: