升级时多实例MSI包失败

时间:2011-12-13 16:55:39

标签: installer windows-installer install msiexec

这需要一些解释,但现在就可以了。

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

基本上,MST包含ProductCode,ProductName,PackageCode(在摘要信息中)的转换,更改所有组件的GUID(否则以愚蠢的方式卸载失败),并且保护安装位置免受引导程序的冲突。此外,引导程序使用命令行参数MSINEWINSTANCE = 1开始安装,详细内容为here

但是,我还想升级已安装的实例(通过主要升级),这是UpgradeCode独特的主要原因(或者我认为)。但是,在我增加MSI版本并尝试启动它之后(再次通过引导程序并通过MSIINSTANCEGUID属性传入所需实例的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错误代码似乎对应于“ERROR_INSTALL_PACKAGE_REJECTED”。

我接下来可以尝试的任何想法?我想在这种情况下MSI引擎应该尝试做的是检查UpgradeCode,应用原始转换(应该通过我通过MSIINSTANCEGUID参数提供的产品代码来缓存和访问)。但是很明显引擎永远不会到达那个阶段(它应该记录在日志文件中,对吗?)

叹息,这比以前要痛苦得多。

编辑:过了一段时间......

关于更改组件GUID的快速说明:它只对非文件组件非常必要(我有一些用于跟踪实例的注册表项)。如果我没有更改他们的GUID,则在卸载时不会正确清理它们,详见here。对于文件,如果密钥路径不同,它可以正常工作,我通过仅更改代码中的注册表组件来验证它。

所以我在此期间已经了解到,除非我为每个实例更改UpgradeCode,因此主要升级可能对我不起作用(因为我认为FindRelatedProducts仅查看UpgradeCode),并且在去那里之前我尝试了其他的东西:小升级。

使用/ fvamus和MSIINSTANCEGUID = {existing-instance-product-code}启动新版本的安装程序似乎可以正常工作,直到我尝试将新文件添加到包中(我希望发生这种情况)在将来)...当然它不起作用(当然,重新安装时不会安装新文件的组件)。

所以我可能要么必须使用转换更改UpgradeCode并查看其含义,或者通过一些自定义操作搞乱FindRelatedProducts的输出属性,看看我是否可以说服主要升级以这种方式工作。然而,最初的问题(1625错误)恰好是主要的升级,因此不确定我是否可以在不知道原因的情况下做些什么。要完全清楚:我上面粘贴的是MSI详细日志的完整,它在返回错误1625之前似乎没有任何。我也尝试删除MSI升级表中的所有行,行为没有变化。

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

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

3 个答案:

答案 0 :(得分:1)

我刚试过这个

msiexec /i <package>.msi /n {<InstanceProductCode>} REINSTALL=ALL REINSTALLMODE=vomus /qb

如下所述:http://msdn.microsoft.com/en-us/library/aa369528(v=vs.85).aspx

即使我将新文件添加到下一版本的MSI,这对我也有用。

答案 1 :(得分:0)

你不能把你的实例作为功能吗?然后在安装过程中可以选择它们,升级可以很好地与它们配合使用。甚至还有特殊操作“MigrateFeatureStates”用于加载已安装的状态。

对于拒绝清除的组件 - 可能你需要明确指定persistent =“no”吗?然后在卸载过程中必须将其删除。

答案 2 :(得分:0)

这已经坐了很长一段时间,所以我想我会关闭它。我最终的方式是卸载前一个实例并在之后进行正常安装。看起来很顺利,所有事情都考虑在内;完成工作。