使用完整的ui模式条件卸载msi(wix工具集)

时间:2018-06-15 19:42:21

标签: wix windows-installer msiexec

我已将以下内容添加到我的WIX模板中,以防止安装而无需在自定义对话框中输入值。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

问题1:LaunchCondition

对于能够安装/运行 的设置,LaunchConditions必须始终评估为true。此处还有一些详细信息: Failing condition wix (建议用于更多上下文)。当您通过Add / Remove Programs调用卸载时,它将以静默模式运行安装程序(我相信UILevel = 2UILevel = 3),但由于LaunchConditionUILevel等于5

或已安装 :防止LaunchConditions在全新安装以外的其他安装模式中触发问题的常用技巧是将OR Installed添加到问题LaunchCondition。这将强制LaunchCondition适用于已安装产品的所有情况和模式(modifyuninstallrepairetc...)。< / p>

所以这样的事情可能会作为一个更新的条件:

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卸载命令 :我忘了添加您应该能够通过命令行启动交互式卸载,如下所示:{{1 }}。以下是您可以找到产品的方法GUID:How can I find the product GUID of an installed MSI setup? 所以在summmary :您可以找到链接中说明的产品GUID,然后打开msiexec.exe /x {PRODUCT-GUID} /qf窗口并开火关闭上面指出的卸载命令。

2.3 - Microsoft FixIt :如果上面的第一个选项不可用,还有其他几个选项可以使用,但在尝试之前我会建议给予{{ 3}有机会看看这是否适合你。运行它,选择你的安装,看看是否有一些自动魔术可以让你卸载它。

2.4 - 高级(如果可以,请避免) - 破解系统缓存的MSI :如果上述操作失败,则此答案将成为下一步:{{3}如果以上内容不起作用,请告知我们,我们将在此处查看选项。我只是压缩缓存的MSI并禁用启动条件,但如果你能避免它,那就太舒服了。

更新:添加了以下内容,但不需要解决问题。不推荐,这是最后的选择。留下内容。

查找缓存的MSI :您可以the Microsoft FixIt tool for installation / uninstallation problems。我将在此处内联Powershell命令:

cmd.exe

然后使用I screwed up, how can I uninstall my program?打开缓存的文件(首先对其进行备份,或将其压缩),然后进行必要的更改以使卸载正常运行。这通常不被认为是一种理智的方法 - 它是最后的手段。你在MSI中所做的改变取决于它的错误。这需要专业的MSI知识。这很容易搞砸,所以卸载变得更加困难。

我刚刚看到你在写这篇文章的同时卸下了产品。 PUH!很高兴你不需要后一种方法。我想我会提交它并将其设置为三角形,因此它是可见的但不推荐(如果只是为了我自己可以重复使用)。

更新,一些其他替代方案(并非总是适用,包括供参考和潜在重复使用)gwmi -Query "SELECT Name,LocalPackage FROM Win32_Product WHERE IdentifyingNumber='{PRODUCT-GUID}'" | Format-Table Name, LocalPackage 如果您可以访问用于安装软件的原始MSI(它必须是用于安装的MSI的确切副本),然后您可以尝试双击它,这应该直接进行修改。 1)如果您不再拥有原始安装MSI,也可以双击系统缓存文件夹中的文件。 2)您可以修改注册表中的卸载字符串以强制进行非静默卸载:

  • 3)
  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  • HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall

可能还有其他方法。例如,HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall攻击要在卸载期间应用的转换,4)修补已安装的MSI(如果它在野外,到处都有大量安装),等等......