【问题标题】:Wix FindRelatedProducts has found a product which is not installedWix FindRelatedProducts 找到了一个未安装的产品
【发布时间】:2019-09-11 20:24:13
【问题描述】:

在机器上测试了我的产品的许多安装/卸载后,我最终遇到了我没有安装我的产品的情况,至少我在控制面板中看不到它,但是当我尝试安装时再次,Wix 正在尝试更新未安装的产品。

我已经使用日志执行了 msi,然后我发现 FindRelatedProducts 是一个 GUID 并填充了 WIX 属性 WIX_UPGRADE_DETECTED

部分日志:

FindRelatedProducts: Found application: {MY-GUID}
MSI (c) (24:8C) [07:21:36:885]: PROPERTY CHANGE: Adding WIX_UPGRADE_DETECTED property. Its value is '{MY-GUID}'.

当我使用WIX_UPGRADE_DETECTED 选择对话框(安装或升级)来显示时,它显示了一个升级对话框,但没有安装任何产品。

如果我在另一台机器上测试,做同样的场景,FindRelatedProducts 没有找到任何产品,这是正确的情况。

我怀疑 Windows Registry(regedit) 中的某些条目未清理。 你知道 Wix 是如何检测到FindRelatedProducts 的吗?或者为什么 Wix 在没有安装产品的情况下填充 WIX_UPGRADE_DETECTED

谢谢!

【问题讨论】:

    标签: wix windows-installer wix3.7


    【解决方案1】:

    我能够确定导致我提到的错误的机器上留下的注册表项。

    它们位于以下位置:

     - HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\UpgradeCodes\{OTHER-GUID}
     - HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products\{OTHER-GUID}
    

    请注意,{OTHER-GUID} 不是我的产品代码,而是生成的,我的产品代码是这些注册表项中存在的值之一。

    只需删除它们,我的安装程序就会再次工作。

    感谢@stein-Åsmul 这个命令:get-wmiobject Win32_Product 非常有用。

    【讨论】:

      【解决方案2】:

      简答:下面的答案可能太详细了,只需卸载升级设置找到的内容,然后尝试 重新安装。

      从命令提示符(Windows 键 + 点击 R + 输入:cmd.exe + Enter)运行以下命令:

      msiexec.exe /x {GUID-FROM-LOG-FILE}
      

      GUID(很可能)是您的日志文件中的那个:WIX_UPGRADE_DETECTED。然后尝试 重新安装。

      卸载失败:如果卸载失败,请尝试运行此Microsoft FixIt tool。有时它可以整理出无法正确卸载的设置。 Alternative, under the hood fix(不推荐)。


      UpgradeTable:我要做的第一件事是验证编译后的 MSI 文件中的 UpgradeTable问题。那里的升级代码是否与您的设置的升级代码匹配? (UpgradeCode entryProperty Table)。

      UpgradeTable 的内容决定了检测到哪些现有安装(如果有)与您的新安装相关。如果您在这里配置奇怪的东西,您甚至可能最终卸载被错误检测为与您的产品相关的竞争产品 - 我不会尝试 :-)。文书工作太多。


      卸载:现在,如何摆脱安装问题?您需要获取 ProductCode GUID。有许多方法可以获取这些信息。 它应该是您在 MSI 日志中看到的 WIX_UPGRADE_DETECTED 的产品 G​​UID,因此请先尝试:

      msiexec.exe /x {GUID}
      

      以下是一般意义上的卸载 MSI 设置的答案(各种不同的选项 - 快速阅读?):Uninstalling an MSI file from the command line without using msiexec


      ProductCode (GUID):Rob 已经提到了正确的 MSI API 来列出已安装的产品,我只是补充一下,我在这里有这个答案可以提供帮助:@ 987654324@ 它列出了几个选项来查看您的盒子上安装了什么。

      VBScript / COM 自动化:我将仅从上面的第一个链接中内联 VBScript 选项(链接的答案中列出了几个选项):

      ' 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")
      
      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")
         output.writeline (productcode & ", " & name & ", " & version)
      Next
      
      output.Close
      

      PowerShell:也加入了 PowerShell 选项。在某些情况下,这可能会触发意外的自我修复。

      get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize
      

      【讨论】:

        【解决方案3】:

        Windows 安装程序有关于注册表的注册传播。它提供了一个 API 来自省该注册。在这种情况下,您需要::MsiEnumRelatedProducts()。它将通过UpgradeCode 为您提供所有相关的产品。

        然后您可以通过以下方式卸载这些产品:

        msiexec /x {PRODUCT-CODE-GUID}
        

        您应该会发现 {PRODUCT-CODE-GUID} 与您编辑为 {MY-GUID} 的内容相同。

        注意:这与 WiX 工具集无关。是 100% 的 Windows Installer 行为(又名:MSI)。

        【讨论】:

        • 你的意思是/x
        【解决方案4】:

        FindRelatedProducts 由 Windows Installer 而非 WiX 执行。您关于行为不正确的断言肯定是不正确的。您有一台脏机器,并且 MSI 有表明它已安装的工件。你的另一台机器是干净的,但不是。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-11
          • 1970-01-01
          • 1970-01-01
          • 2014-07-03
          • 1970-01-01
          • 2015-05-11
          相关资源
          最近更新 更多