【问题标题】:Uninstall msi with full ui mode condition (wix toolset)使用完整的 ui 模式条件卸载 msi(wix 工具集)
【发布时间】:2018-11-25 15:58:11
【问题描述】:

我已将以下内容添加到我的 WIX 模板中,以防止在我制作的自定义对话框中不输入值的情况下进行安装。

    <Condition Message='This installation can only run in full UI mode.'>
        <![CDATA[UILevel = 5]]>
    </Condition>

当我尝试卸载应用程序时,我收到此消息,并且无法继续。

  1. 如何解决此问题,使其不适用于卸载?

  2. 如何强制卸载此应用程序?

【问题讨论】:

    标签: wix windows-installer


    【解决方案1】:

    问题 1:启动条件

    LaunchConditions 必须始终评估为真,设置才能安装/运行。这里有一些进一步的细节:Failing condition wix(推荐用于更多上下文)。当您通过Add / Remove Programs 调用卸载时,它将以静默模式运行安装程序(我相信UILevel = 2UILevel = 3),这会使您的LaunchCondition 失败,因为UILevel 不等于5

    OR 已安装:防止LaunchConditions 在全新安装以外的其他安装模式下触发问题的常用技术是将OR Installed 添加到LaunchCondition有问题。这将强制 LaunchCondition 在已安装产品的所有情况和模式下为真(modifyuninstallrepairetc...)。

    所以像这样的东西可能会作为一个更新的条件起作用:

    Installed OR UILevel = 5
    

    方法错误?:话虽如此,我宁愿实施检查以确定您需要指定的值是否已通过 PUBLIC 属性在命令行上设置为静默安装,而不是那种相当奇怪的 LaunchCondition 检查安装程序的 GUI 级别。您仍然可以将其实现为 LaunchCondition - 或使用自定义操作以获得更大的灵活性。 LaunchCondition 将检查所有关键设置参数的值,并且您将使用 OR Installed 机制阻止它们在卸载和其他模式下运行。以下是关于silent installationtransformspublic properties 主题的答案:How to make better use of MSI files(静默部署对于企业部署和软件验收至关重要)。


    问题2:强制卸载

    更新:为了完整起见,底部列出了几个附加选项。

    2.1 - ARP 修改:在进入太多疯狂的细节之前,我想运行你最简单的选项。 Modify 选项是否可用于您在 Add / Remove Programs 中的设置?如果是这样,请单击它,然后查看是否可以从设置的Modify dialogs 中选择删除。这应该可以工作(因为在选择Modify 时,您通常不会在静默模式下运行安装程序)。

    2.2 - 交互式 msiexec.exe 卸载命令:我忘了补充一点,您应该能够通过命令行启动交互式卸载,如下所示:msiexec.exe /x {PRODUCT-GUID} /qf .您可以通过以下方式找到产品 GUID:How can I find the product GUID of an installed MSI setup?总结:您可以按照链接中的说明找到产品 GUID,然后打开 cmd.exe 窗口并启动卸载命令如上所示。

    2.3 - Microsoft FixIt:如果上面的第一个选项不可用,还有其他几个选项可以工作,但在尝试之前,我建议您提供@987654324 @有机会看看这是否对您有用。运行它,选择你的安装,看看是否有一些自动魔法可以让你卸载它。

    2.4 - 高级(尽可能避免) - 破解系统缓存的 MSI:如果上述方法失败,此答案将是下一步:I screwed up, how can I uninstall my program? 请如果上述方法不起作用,请告诉我们,我们将在此处检查选项。我只会压缩​​缓存的 MSI 并禁用启动条件,但如果你能避免的话,这太麻烦了。

    更新:添加了以下内容,但不是解决问题所必需的。不推荐,这是最后的手段。把内容留在里面。

    查找缓存的 MSI:您可以 find the system cached MSI using Powershell as explained here。我将在这里内联Powershell命令:

    gwmi -Query "SELECT Name,LocalPackage FROM Win32_Product WHERE
    IdentifyingNumber='{PRODUCT-GUID}'" | Format-Table Name,
    LocalPackage
    

    然后您使用Orca or an equivalent tool 打开缓存文件(先对其进行备份或压缩),然后进行所需的任何更改以使卸载正常运行。这通常不被认为是一种理智的方法——它是最后的手段。您在 MSI 中所做的更改会有所不同,具体取决于它的问题所在。这需要专业的 MSI 知识。很容易搞砸所以卸载变得更加困难。


    我刚刚看到你在写这篇文章时卸载了产品。噗!很高兴您不需要后一种方法。我想我会提交它并将其设置为删除,以便它可见但不推荐(如果只是为了我自己在需要时重复使用)。


    更新,一些额外的替代方案(并不总是适用,包括供参考和可能重复使用)1) 如果您有权访问用于安装您的软件的原始 MSI(它必须是用于安装的 MSI 的确切副本),然后您可以尝试双击它,这应该会带您直接进行修改。 2)如果您不再拥有原始安装MSI,您也可以双击系统缓存文件夹中的文件。 3) 可能你也可以修复注册表中的卸载字符串来强制非静默卸载:

    • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
    • HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
    • HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall

    可能还有其他方法。例如4) 破解在卸载期间应用的转换,5) 修补已安装的 MSI(如果它在野外并且到处都有大量安装)等等...

    【讨论】:

    • 这个“缓存的 MSI”在哪里?我在程序和功能中只有“卸载”和“修复”,并且都触发了条件。我不再有原来的 msi,它是由 VS 构建的,但如果我运行安装程序,如果它导致 UILevel = 5,我可以成功卸载它。除了原来的 wix 工具集在教程中,我还按照helgeklein.com/blog/2014/09/… 的一些说明将产品 ID 设置为自动生成而不是固定的 GUID。我认为这可能是不正确的。
    • 在我们使用缓存文件夹方法之前,让我们尝试一种更简单的方法 - 由于您独特的卸载问题,它应该可以工作(这似乎只是一个 GUI 级别的问题 - 对于大多数其他卸载问题,这种方法可能行不通)。看到上面的答案,我已经添加了关于如何通过msiexec.exe启动卸载的描述。
    • 尝试 msiexec 方法时出现相同的错误消息
    • 据我所知,这应该将UILevel 设置为5 - 您将关键的/qf 开关设置在命令行末尾?不幸的是,我目前正在测试 Linux 机器,因此无法运行交互式测试。让我尽快回复你。同时请仔细检查该命令行。我将添加一些有关如何查找缓存的 MSI 的详细信息。 访问它很少有意义,而且它从不被认为是安全的。只有当你必须 - 只是为了说明显而易见的事情。
    • 我没有注意到最后的 /qf 标志。我现在试了一下,这个过程的声音对我来说似乎很奇怪。它说要继续/恢复软件的安装——我不想这样做(我想卸载它),但我还是试了一下——它被卸载了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多