【问题标题】:Wix upgrade goes into maintenance mode and never does upgradeWix 升级进入维护模式,从不升级
【发布时间】:2018-10-20 03:49:46
【问题描述】:

我正在运行 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 来执行卸载。

在我们的构建中,我们使用搜索词“0.0.0.0”来搜索包和 msi 中的版本,然后我们用正确的版本进行替换,并在构建结束时恢复 Bundle.wxs 和产品。 wxs。

当安装程序正在处理时,开发人员必须在构建文件中注释掉恢复,以便处理文件。开发人员完成后,他们需要将版本设置回“0.0.0.0”。在其中一个安装程序签入中,有人不得不忘记改回“0.0.0.0”。

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

【问题讨论】:

  • 您需要显示整个日志。您只发布了 RemoveExistingProducts 操作的开始,是的,将处于维护模式并卸载旧产品,并设置 UPGRADINGPRODUCTCODE 操作(如预期的升级卸载),正如您从 ProductCode 中看到的那样,它是正在卸载 1.0。
  • 我刚刚添加了完整日志文件的链接
  • 再次查看日志,似乎很明显这是一个 WiX Bundle 安装。我对捆绑包的帮助太少了——我知道他们有自己的升级代码,但还没有测试过这会如何影响事情。您是否在未重建包含的 MSI 文件的情况下重建了捆绑包,然后重新安装?一个包通常通过设置我相信的 ARPSYSTEMCOMPONENT 来隐藏其组成的 MSI 文件,然后它添加一个包 ARP 条目 - 可选地允许 MSI 文件也显示在 ARP 中。你说的维护模式,就是捆绑维护模式吗?

标签: wix windows-installer


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    短版

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

    包代码混淆?:您也可能安装了具有相同包代码的同一 MSI 的两个或多个版本( 相对于产品代码)。这总是会导致神秘的问题 - 例如您在维护模式下看到的问题(相同的包 GUID 意味着根据定义,两个不同的 MSI 文件将被视为同一个文件 - 因为 GUID 是相同的 - X-Files 随之而来 msiexec.exe背着你,从旧的缓存 MSI 运行,而不是你的新 MSI)。

    Bundle?:正如 Phil 所写,这也可能是 WiX 捆绑问题。也许先尝试底部的脚本以获得已安装内容的完整列表 - 是否隐藏。


    详细版

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

    Virtuals:正如格言一直所说的那样:当你发现奇怪的问题时测试 virtuals - 以确定你是否有一个不干净的测试环境。虚拟测试对我来说至关重要,但我经常做得太晚。

    MSDN:ARPSYSTEMCOMPONENT.


    更新

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

    由于您似乎确实会自动生成产品代码,因此您永远不会遇到当前的问题:维护模式。 这让我怀疑是包代码重复问题。或者是一个捆绑问题,正如 Phil 所建议的那样。我对捆绑包的经验太少。 可能是捆绑错误吗?甚至是 WiX 错误?


    手动卸载:也许可以尝试使用您可以在此处找到的 VBScript 来导出系统上当前安装的 MSI 产品代码列表(无论它们是否隐藏): How can I find the product GUID of an installed MSI setup?(靠近底部,在“Alternate Tools, section 3下。

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

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

    msiexec.exe /x [ProductCode]

    继续卸载,直到你有一个“干净的盒子”。

    具有完整版本传播的重大升级:或者,您可以为您的升级表设置一个广泛的版本范围(最小/最大版本),看看您是否可以卸载所有具有定期重大升级的现有版本。坦率地说,我从来没有花时间测试使用重大升级卸载多个先前版本,但据我所知,它应该可以工作。 注意!:如果您有重复的包代码,我认为这将不起作用

    卸载相关产品:另一个答案显示如何卸载共享相同升级代码的所有产品。请注意在静默模式下运行时可能会自动触发重启的免责声明: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 检索升级代码的链接):

    ' 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
    

    用法

    • 复制脚本并粘贴到桌面上的 *.vbs 文件中,然后尝试通过双击运行它。您的桌面必须是可写的,或者您可以使用任何其他可写位置。
    • 输出文件是在您从中运行脚本的文件夹中创建的(该文件夹必须是可写的)。输出文件名为msiinfo.csv
    • 双击文件以在电子表格应用程序中打开,在导入时选择逗号作为分隔符 - 或者 - 只需在记事本或任何文本查看器中打开文件。
    • 电子表格中的内容应按列格式化,否则,请手动打开文件并导入文件,选择逗号作为 CSV 文件的分隔符(逗号分隔值)。这样做会产生完整的电子表格功能,例如按列排序(例如 Publisher),因此您可以看到所有设置彼此相邻。

    【讨论】:

    • 我运行了你的脚本并检查了输出我只看到了应用程序的升级版本。但是,在添加/删除程序中,我看到了以前的版本和升级。我还使用 c# 和 Microsoft.Deployment.WindowsInstaller 运行了一个版本,只看到了升级。
    • 这是一个 WiX 捆绑包?我想你可以check what is in the registry(请参阅顶部的项目符号点 3 了解注册表位置)。
    • 这真的很奇怪。您是否重新启动了盒子以查看 ARP 是否已更新?我要验证的第一件事。有一个工具可以扫描损坏的安装 (Microsoft FixIt),但我认为这对您的情况没有任何用处。对于从未完成的失败安装来说更是如此。
    猜你喜欢
    • 2023-03-22
    • 2018-03-14
    • 2010-10-04
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    相关资源
    最近更新 更多