Installation 升级时多实例MSI包失败

Installation 升级时多实例MSI包失败,installation,windows-installer,Installation,Windows Installer,这需要一些解释,但现在开始 我需要编写一个安装动态实例的多实例MSI,即用户安装包时定义的实例,而不是MSI文件中的硬编码实例。现在,我已经经历了创建引导程序和使用MSIAPI动态创建转换(MST)并将其应用于原始MSI的痛苦;经过多次修补,安装和卸载工作正常(我将根据需要发布详细信息) 基本上,MST包含ProductCode、ProductName、PackageCode(在摘要信息中)的转换,更改所有组件的GUID(否则卸载会以愚蠢的方式失败),并且安装位置受到引导程序的保护,不会发生冲突

这需要一些解释,但现在开始

我需要编写一个安装动态实例的多实例MSI,即用户安装包时定义的实例,而不是MSI文件中的硬编码实例。现在,我已经经历了创建引导程序和使用MSIAPI动态创建转换(MST)并将其应用于原始MSI的痛苦;经过多次修补,安装和卸载工作正常(我将根据需要发布详细信息)

基本上,MST包含ProductCode、ProductName、PackageCode(在摘要信息中)的转换,更改所有组件的GUID(否则卸载会以愚蠢的方式失败),并且安装位置受到引导程序的保护,不会发生冲突。此外,引导程序使用命令行参数MSINEWINSTANCE=1启动安装,如详细说明所示

但是,我还想升级一个已安装的实例(通过主要升级),这就是为什么升级代码是唯一的(或者我认为是唯一的)。但是,在我增加MSI版本并尝试启动它(再次通过引导程序并通过MSInstanceGuid属性传入所需实例的ProductCode)后,它失败了;日志上写着:

=== Verbose logging started: 12/13/2011  17:43:56  Build type: SHIP UNICODE 5.00.7601.00  Calling process: C:\Windows\SysWOW64\msiexec.exe ===
MSI (c) (5C:D0) [17:43:56:120]: Font created.  Charset: Req=0, Ret=0, Font: Req=MS Shell Dlg, Ret=MS Shell Dlg

MSI (c) (5C:D0) [17:43:56:120]: Font created.  Charset: Req=0, Ret=0, Font: Req=MS Shell Dlg, Ret=MS Shell Dlg

MSI (c) (5C:34) [17:43:56:120]: Resetting cached policy values
MSI (c) (5C:34) [17:43:56:120]: Machine policy value 'Debug' is 2
MSI (c) (5C:34) [17:43:56:120]: ******* RunEngine:
           ******* Product: D:\TestArea\AMLDC.msi
           ******* Action: 
           ******* CommandLine: **********
MSI (c) (5C:34) [17:43:56:120]: Machine policy value 'DisableUserInstalls' is 0
MSI (c) (5C:34) [17:43:56:135]: MainEngineThread is returning 1625
=== Verbose logging stopped: 12/13/2011  17:43:56 ===
此时会弹出一条UI消息,说明“系统管理员已设置策略以阻止此安装”。显然,这不是真的(策略将出现在日志中,并将提供更明确的消息)

1625错误代码似乎对应于“错误安装程序包被拒绝”

你知道我下一步可以尝试什么吗?我在想,在这种情况下,MSI引擎应该做的是检查升级代码,应用原始转换(应该通过我通过MSInstanceGuid参数提供的产品代码进行缓存和访问)。但是很明显,引擎从未达到该阶段(应该记录在日志文件中,对吗?)

唉,这比应该的痛苦多了

编辑:过一会儿

关于更改组件guid的简要说明:只有非文件组件才真正需要它(我有一些用于跟踪实例的注册表项)。如果我不更改它们的GUID,它们在卸载时将无法正确清理,详细信息如下。对于文件,如果键路径不同,它可以正常工作,我已经通过在代码中只更改注册表组件来验证了这一点

因此,在此期间我了解到,除非我更改每个实例的升级代码(因为我认为FindRelatedProducts只查看升级代码),否则大型升级可能不会对我起作用。在去那里之前,我尝试了其他方法:小型升级

使用/fvamus和msinstanceguid={existing instance product code}启动新版本的安装程序似乎是可行的,直到我尝试将一个新文件添加到包中(我预计将来会这样做)。。。当然,当它不工作时(当然,重新安装时没有安装新文件的组件)

因此,我可能需要通过转换更改升级代码,看看这意味着什么,或者通过一些自定义操作来处理FindRelatedProducts的输出属性,看看是否可以说服主要升级以这种方式工作。然而,最初的问题(1625错误)正是由于主要的升级,所以我不确定是否可以在不知道原因的情况下采取措施。要完全清楚:我上面粘贴的是MSI详细日志的全部内容,在返回错误1625之前,它似乎没有做任何事情。我还尝试删除MSI升级表中的所有行,但行为没有改变

我也不能在这个愚蠢的问题上花费更多的时间,所以如果没有其他办法,我将被迫进行静默卸载,然后使用相同的设置进行常规安装。一想到这里我就畏缩,但如果没有办法


编辑:平心而论,如果我不完全从MSI路径开始,用gzip流和简单的xcopy从头开始编写自己的安装程序,它可能会更快。即使使用msbuild任务,也会压缩来自visual studio或其他东西的文件。

您不能将实例作为功能吗?然后,它们将在安装和升级过程中进行选择。甚至还有专门的操作“MigrateFeatureState”用于加载已安装部件的状态


对于拒绝清除的组件,您可能需要显式地为它们指定persistent=“no”?然后在卸载过程中必须将其删除。

这已经在这里放置了很长一段时间,所以我想我应该关闭它。我最后的做法是卸载前一个实例,然后进行正常安装。从各方面考虑,似乎进展得相当顺利;完成任务。

我刚试过这个

msiexec /i <package>.msi /n {<InstanceProductCode>} REINSTALL=ALL REINSTALLMODE=vomus /qb
msiexec/i.msi/n{}重新安装=全部重新安装模式=vomus/qb
如下所述:


即使我将新文件添加到MSI的下一个版本中,这也适用于我。

在查找最新产品/RemoveExistingProducts或安装作为主要升级的一部分将删除以前版本的较新版本时,您是否遇到困难?当您的计算机上有3个v1.0实例并尝试安装v2.0(主要升级)时,您希望发生什么情况?对我来说,更改所有组件代码听起来很不寻常,但我基本上同意这听起来不像是当前症状的根源;我希望只升级该实例,因为我正在向它传递MSInstanceGuid。然而,我后来了解到FindRelatedProducts只查看升级代码,到目前为止,我对所有实例都保持不变。我尝试了一些小的升级(通过使用/fvamus重新安装,这对我来说非常合适),它在一定程度上起到了作用。事实上你知道