Wix升级进入维护模式,永远不会升级

时间:2018-05-09 23:14:49

标签: wix windows-installer

我正在运行Wix 3.11.1,当尝试升级时,升级进入维护模式,并在“添加/删除程序”列表中留下两个条目。

Product.wxs的简短版本具有以下内容:

 <Product Id="*"  Name="Boo" Language="1033" Version="1.1.0.0" Manufacturer="Foo"
          UpgradeCode="PUT-GUID-HERE">

    <Package InstallerVersion="200"  Compressed="yes" InstallScope="perMachine"/>

<MajorUpgrade AllowDowngrades="no" AllowSameVersionUpgrades="yes" 
              DowngradeErrorMessage="!(loc.NewerVersionInstalled)" />

升级代码: 3F55CE54-8409-4918-9906-D8AD18794BFC

产品和包裹代码是:

1.0

产品编号FC49F622-02E6-40D9-ACD9-92BDD4AF5979

包装代码6C49FAA1-5B11-4173-80A7-A7B3FA4313AE

1.1

产品号4871555F-F369-4159-9EF0-4BBDF07B6842

封装代码3594D7C2-D5AC-4A41-A8C6-6E3D63C6ACA0

当我使用日志记录运行安装程序时,我会得到如下所示的日志信息。 当升级代码相同且产品和包裹代码不同,并且版本以前三位数递增时,我认为应该进行升级但是不是。这两个版本都是每台机器,所以不应该停止删除以前的版本。日志显示维护模式,从不执行以前版本的删除。我在msi中有一个升级表,它显示最大值1.1和WIX_UPGRADE_DETECTED作为操作。有谁知道什么会导致它进入维护模式而不是进行重大升级?

Log File

    MSI (s) (68:9C) [15:04:38:423]: Doing action: RemoveExistingProducts
Action 15:04:38: RemoveExistingProducts. Removing applications
Action start 15:04:38: RemoveExistingProducts.
RemoveExistingProducts: Application: {FC49F622-02E6-40D9-ACD9-92BDD4AF5979}, Command line: UPGRADINGPRODUCTCODE={4871555F-F369-4159-9EF0-4BBDF07B6842} CLIENTPROCESSID=8344 CLIENTUILEVEL=0 MSICLIENTUSESEXTERNALUI=1 REMOVE=ALL
MSI (s) (68:BC) [15:04:38:423]: Resetting cached policy values
MSI (s) (68:BC) [15:04:38:423]: Machine policy value 'Debug' is 0
MSI (s) (68:BC) [15:04:38:423]: ******* RunEngine:
           ******* Product: {FC49F622-02E6-40D9-ACD9-92BDD4AF5979}
           ******* Action: 
           ******* CommandLine: **********
MSI (s) (68:BC) [15:04:38:423]: Note: 1: 2203 2: C:\WINDOWS\Installer\inprogressinstallinfo.ipi 3: -2147287038 
MSI (s) (68:BC) [15:04:38:423]: Machine policy value 'LimitSystemRestoreCheckpointing' is 0
MSI (s) (68:BC) [15:04:38:423]: Note: 1: 1717 2: Boo 
MSI (s) (68:BC) [15:04:38:423]: Calling SRSetRestorePoint API. dwRestorePtType: 1, dwEventType: 102, llSequenceNumber: 0, szDescription: "Removed Boo".
MSI (s) (68:BC) [15:04:38:439]: The call to SRSetRestorePoint API succeeded. Returned status: 0, llSequenceNumber: 45.
MSI (s) (68:BC) [15:04:38:439]: End dialog not enabled
MSI (s) (68:BC) [15:04:38:439]: Original package ==> C:\WINDOWS\Installer\1179bb4.msi
MSI (s) (68:BC) [15:04:38:439]: Package we're running from ==> C:\WINDOWS\Installer\1179bb4.msi
MSI (s) (68:BC) [15:04:38:439]: APPCOMPAT: Uninstall Flags override found.
MSI (s) (68:BC) [15:04:38:439]: APPCOMPAT: Uninstall VersionNT override found.
MSI (s) (68:BC) [15:04:38:439]: APPCOMPAT: Uninstall ServicePackLevel override found.
MSI (s) (68:BC) [15:04:38:439]: APPCOMPAT: looking for appcompat database entry with ProductCode '{FC49F622-02E6-40D9-ACD9-92BDD4AF5979}'.
MSI (s) (68:BC) [15:04:38:439]: APPCOMPAT: no matching ProductCode found in database.
MSI (s) (68:BC) [15:04:38:439]: Machine policy value 'DisablePatch' is 0
MSI (s) (68:BC) [15:04:38:439]: Machine policy value 'AllowLockdownPatch' is 0
MSI (s) (68:BC) [15:04:38:439]: Machine policy value 'DisableLUAPatching' is 0
MSI (s) (68:BC) [15:04:38:439]: Machine policy value 'DisableFlyWeightPatching' is 0
MSI (s) (68:BC) [15:04:38:439]: APPCOMPAT: looking for appcompat database entry with ProductCode '{FC49F622-02E6-40D9-ACD9-92BDD4AF5979}'.
MSI (s) (68:BC) [15:04:38:439]: APPCOMPAT: no matching ProductCode found in database.
MSI (s) (68:BC) [15:04:38:439]: Transforms are not secure.
MSI (s) (68:BC) [15:04:38:439]: Command Line: UPGRADINGPRODUCTCODE={4871555F-F369-4159-9EF0-4BBDF07B6842} CLIENTPROCESSID=8344 CLIENTUILEVEL=0 MSICLIENTUSESEXTERNALUI=1 REMOVE=ALL 
MSI (s) (68:BC) [15:04:38:439]: PROPERTY CHANGE: Adding PackageCode property. Its value is '{6C49FAA1-5B11-4173-80A7-A7B3FA4313AE}'.
MSI (s) (68:BC) [15:04:38:439]: Product Code passed to Engine.Initialize:           '{FC49F622-02E6-40D9-ACD9-92BDD4AF5979}'
MSI (s) (68:BC) [15:04:38:439]: Product Code from property table before transforms: '{FC49F622-02E6-40D9-ACD9-92BDD4AF5979}'
MSI (s) (68:BC) [15:04:38:439]: Product Code from property table after transforms:  '{FC49F622-02E6-40D9-ACD9-92BDD4AF5979}'
MSI (s) (68:BC) [15:04:38:439]: Product registered: entering maintenance mode

更新

这确实是一个捆绑安装。我看着msi是罪魁祸首,因为我认为Wix捆绑包会使用msiexec来执行卸载。

在我们的构建中,我们使用搜索词&#34; 0.0.0.0&#34;对于bundle和msi中的版本,我们用正确的版本替换,在构建结束时我们还原Bundle.wxs和Product.wxs。

当安装程序正在处理时,开发人员必须在构建文件中注释掉还原,以便处理文件。开发人员完成后,他们需要将版本设置回&#34; 0.0.0.0&#34;。在其中一个安装程序检查中,有人不得不忘记改回&#34; 0.0.0.0&#34;。

我自己尝试了两个版本的msi,升级确实删除了原始安装的条目。但是,即使版本正确,捆绑包升级仍会留下第二个条目。

2 个答案:

答案 0 :(得分:1)

短版

许多实例 :我认为您的软件包有很多版本已安装在许多实例中并且相互叠加了#34; - 由于在(某些)软件包中指定了Add / Remove Programs设置,其中一些隐藏了ARPSYSTEMCOMPONENT=1。其中一个已安装的实例与您尝试安装的软件包具有相同的产品代码 - 这会触发维护模式 - 因为产品代码已经注册为已安装。

包裹代码混淆? :您也可能已安装两个或多个版本相同的MSI,且包含相同的包裹代码而非产品代码)。这总是会导致神秘的问题 - 例如您在维护模式下遇到的问题(相同的包GUID意味着两个不同的MSI文件将按照定义被视为同一个文件 - 因为GUID是相同的 - X-Files随后显示为{{1在你的背后,从旧的,缓存的MSI而不是你的新MSI运行。

捆绑? :正如Phil所写,它也可能是一个WiX捆绑问题。也许首先尝试使用底部的脚本来获取已安装内容的完整列表 - 隐藏在视图之外。

详细版本

可能的原因 :您似乎正在设置msiexec.exe,这将隐藏添加/删除程序中的设置( ARP ) 。据我所知,日志中有许多包和产品代码与您在问题中指定的代码不匹配。 您可能在系统上安装了几个较旧的测试版本,这些版本也可以从ARP中隐藏,但仍然安装在框中。不知道为什么你说现在的版本出现在ARP中?使用ARPSYSTEMCOMPONENT设置时,不应该这样做。

虚拟 :始终如一:当您看到奇怪的问题时,对虚拟进行测试 - 以确定您是否有不洁的测试环境。虚拟测试对我来说至关重要,但我经常这样做太晚了。

MSDN:ARPSYSTEMCOMPONENT

<强>更新

罪魁祸首机制 :当您将产品代码设置为自动生成时,即使没有创建升级表,每个版本都可以在不显示维护模式的情况下安装一点都不当您将其与隐藏“添加/删除程序”结合使用时,您突然无法确定安装了哪些先前版本。在您测试安装时,重复安装在彼此之上可能会堆积起来。

由于您似乎确实自动生成了产品代码,因此您应该永远不会遇到当前的问题:维护模式。 这导致我怀疑包裹代码重复问题。或者菲尔建议的捆绑问题。我对捆绑的经验太少了。 可能是捆绑错误吗?甚至是WiX错误?

手动卸载 :也许尝试使用此处可以找到的VBScript导出当前安装在系统上的MSI产品代码列表(无论它们是否隐藏) ): How can I find the product GUID of an installed MSI setup? (在底部,&#34; 替代工具,第3部分 &#34; < / DEL>

更新请参阅下面的内联和修改后的脚本版本

获得列表后,尝试使用以下方法卸载不需要的测试包:

ARPSYSTEMCOMPONENT = 1

继续卸载,直到你有一个&#34;干净的框&#34;。

使用完整版本进行重大升级 :或者,您可以为升级表设置较宽的版本范围(最小/最大版本),以查看是否可以全部卸载具有常规主要升级的现有版本。坦率地说,我从来没有花时间测试使用主要升级卸载多个先前版本,但据我所知它应该工作。 N.B !:如果您有包裹代码重复,我认为这不会起作用。

卸载相关产品 :另一个答案显示如何卸载共享相同升级代码的所有产品。请注意,在无声模式下运行时,可以自动触发重新启动的免责声明:Powershell: Uninstall application by UpgradeCode

按产品名称卸载 :不太明智,但我会添加一个安全链接。以下是按产品名称卸载MSI包的方法:Is there an alternative to GUID when using msiexec to uninstall an application?

列出所有已安装的MSI产品

更新:想想看,让我在上面添加一些新增的内联链接脚本 - 这会将标题,发布商和包代码添加到导出中。 此脚本应显示所有已安装的软件包,包括那些隐藏在“添加/删除程序”中的软件包(如果您还需要升级代码,那么由于技术原因,这有点复杂,here is a description of how it can be done in a clunky way - 该链接反过来还有如何使用Powershell检索升级代码的链接:

msiexec.exe /x [ProductCode]

<强> 用法

  • 复制脚本并粘贴到桌面上的* .vbs文件中,然后尝试双击运行它。您的桌面必须是可写的,或者您可以使用任何其他可写位置。
  • 输出文件在您运行脚本的文件夹中创建(文件夹必须可写)。输出文件名为' Retrieve all ProductCodes (with ProductName and ProductVersion) Set fso = CreateObject("Scripting.FileSystemObject") Set output = fso.CreateTextFile("msiinfo.csv", True, True) Set installer = CreateObject("WindowsInstaller.Installer") output.writeline ("Product Code,Product Name,Product Version,Package Code, Publisher") On Error Resume Next ' we ignore all errors For Each product In installer.ProductsEx("", "", 7) productcode = product.ProductCode name = product.InstallProperty("ProductName") version=product.InstallProperty("VersionString") packagecode=product.InstallProperty("PackageCode") publisher=product.InstallProperty("Publisher") output.writeline (productcode & ", " & name & ", " & version & ", " & packagecode & ", " & publisher) Next output.Close
  • 双击要在电子表格应用程序中打开的文件,在导入时选择逗号作为分隔符 - 或者 - 只需在记事本或任何文本查看器中打开该文件。
  • 电子表格中的内容应按列格式化,如果不打开手动文件,则导入文件,选择逗号作为CSV文件的分隔符(逗号分隔值)。这样做会产生完整的电子表格功能,例如按列排序 - 例如Publisher - 这样您就可以看到所有设置彼此相邻。

答案 1 :(得分:1)

日志显示升级成功,安装新产品并删除旧产品。程序和功能中两个条目的最可能的解释是,实际的MSI产品有一个,WiX引导程序有另一个。您可能需要使用ARPSYSTEMCOMPONENT = 1或使用WiX引导程序支持来抑制MSI,以抑制MSI的条目。

相关问题