繁体   English   中英

wix - 静默卸载应用程序的自定义操作对话框

[英]wix - custom action dialogbox on silent uninstall of application

我正在尝试以静默方式卸载带有以下标志的 Windows 应用程序:/quiet 和 /uninstall,但安装程序当前不会抑制 CustomAction 对话框。 当对话框出现时,用户需要确认(通过按是按钮)以删除所有程序生成的数据。

有没有办法告诉卸载程序在安静模式下单击“是”?

以下是当前的 wix 代码。

<!-- Remove app data custom action -->
<CustomAction Id="SetPathToRemove" Property="ShowRemoveFilesDialog" Value="[ApplicationAppDataDir]" />
<CustomAction Id="ShowRemoveFilesDialog" BinaryKey='CustomActionsBinary' DllEntry='ShowDialogRemoveFiles'
              Execute='deferred' Return='ignore' Impersonate='no'/>

交叉链接类似的答案简短版本 和老人: 我搞砸了,我怎么能卸载我的程序?


抑制对话框:如果该对话框在没有适当条件的情况下显示,那么不,您不能完全抑制它,但有很多解决方法。 请参阅下面的“修复”列表。

卡住卸载:首先对卡住卸载(挂起/卡住或回滚)进行一些评论。 有几种方法可以让你卡住,这里只是一些:

  • 错误条件:错误条件可能会错误地显示对话框或在卸载期间运行不应运行的自定义操作。 这通常意味着卸载卡住(对话框)或卸载失败并回滚(CA)。 一个对话框在静默运行时会让您卡住,它还会停止交互式主要升级(您必须手动关闭对话框,否则主要升级将坐在那里等待)。 更糟糕的是,对话框可能会显示在其他桌面窗口下方。
  • 其他 Catch 22 :可能有其他一些导致卸载失败的原因。
    • 您自己的自定义操作所需的共享运行时的事先卸载就是其中之一。 这可能是 .NET 框架的一个版本、VC 运行时或您所依赖的任何东西,在您调用自己的卸载时已经消失了。 CA 倒下,设置回滚。
    • 如果他们检查是否存在缺少的先决条件,我还看到启动条件会起作用并阻止设置启动! 关键抓22! 例如:缺少 .NET framework 2.0 - 您的应用需要,但卸载不需要 - 这会导致安装程序无法卸载,因为启动条件不满足。 谁决定在卸载时也让启动条件像这样工作? WiX 家伙使用(OR Installed)技巧进行救援(这会导致启动条件在已安装设置时始终为真)。

“修复” :对于失败或卡住的卸载,有一些“疯狂”程度不同的“修复”(通常是针对自定义操作导致卸载回滚并无法完成的失败的那些 - 一个 catch 22 情况,您可以不要前进或后退)。

  • 1) MS FixIt :有一个Microsoft FixIt 工具,有时可以让您摆脱卡住的安装(不确定它是否适用于自定义操作的对话框)。 如果您有一个或只有几个实例,请先尝试此操作。
  • 2)小升级/补丁Patch the existing installation with a minor upgrade - Chris Painter 的回答 这也可以“大规模”用于修复损坏的 MSI 卸载序列,然后可以在所有机器上调用该序列。 如果您愿意,真正的解决方案(一旦问题大规模出现,许多机器受到影响)。 物流方面存在一些挑战 拥有分发系统的公司通常可以很容易地将补丁作为升级安装的一部分。 不过,他们可能对此不太高兴:-)。

  • 3)变换Hack apply a transform ,然后在卸载期间应用(不推荐 - 太复杂了,容易出错)。

  • 4) Dr.No No :如果很少有实例,您可以hack the locally cached MSI database (基本上与通过补丁发生的相同,仅手动完成)。

    • 如果您有几台机器(比如要清理 1-5 台机器),则可以使用。 您可以使用 MSI SDK 中的 Orca 工具。
    • 支持工作 - 并非没有风险! 不建议。
    • And don't delete custom actions! Just add a condition "AND 0" to the offending custom action sequencing - that will stop the custom action from running And don't delete custom actions! Just add a condition "AND 0" to the offending custom action sequencing - that will stop the custom action from running
  • 5) MSI API :我依靠小升级补丁来修复问题。 但是,应该可以通过 MSI API 自动化修改已安装的 MSI,以更改本地缓存 MSI 中的一些内容以允许卸载。 本质上是以前“破解本地 MSI 方法”的自动化版本。 尝试有点疯狂,但在纸面上并非不可能(当心看起来像恶意软件并破坏您通过SmartScreen获得的信任! -许多供应商都在为他们的产品被检测为 误报恶意软件而苦苦挣扎-处理起来很可怕,并且可能会破坏您产品的声誉) . 更改可以通过setup.exe中包含的可执行文件完成,并在安装新 MSI 之前启动(新 MSI 在没有setup.exe的情况下自行运行仍会失败)。 请记住,所有修复都会添加新的错误来源! (我对失败的修复的修复失败了,等等......)。

  • 6) Lunacy :有些人使用来自“陌生海岸”的工具——例如 AutoIt,它模拟击键以消除卡住的对话框。 根本不够大规模,但可能适用于较小的场景。 不建议。 试试这些工具来对付安全软件! 不好了! (任何事情都可能发生,它会破裂——只是时间问题)。

条件:您不应该显示来自InstallExecuteSequence中排序的自定义操作的对话框,尽管您可以使用UILevel 属性控制其显示。 您可以使用上述方法 1-3 将此类条件添加到 MSI。 NOT UILevel = 2可以尝试。Level 2 是完全静默运行)


抑制失败的自定义操作:当通过失败的自定义操作(与胭脂对话框相反)阻止卸载时,您可以求助于“接种方法”。 您可以更新您的包,以便能够通过将特定属性设置为标志的命令行开关来抑制自定义操作:

msiexec.exe /x {PRODUCT-GUID} SUPPRESSERROR="1"

请参阅此 WiX 示例或下面的模型(略有不同,但概念相同):

添加条件

快速模拟如何将条件自定义操作添加到InstallExecuteSequence

<Property Id="FLAG" Value="1"/>

<..>

<CustomAction Id='Something' Property='INSTALLFOLDER'
              Value='[CMDLINE_INSTALLFOLDER]' Execute='firstSequence' />

<..>

<InstallExecuteSequence>
   <Custom Action='Something' Before='AppSearch'>NOT Installed AND FLAG</Custom>
</InstallExecuteSequence>

使用这种方法,可以通过调用这种自定义的 msiexec.exe 命令来禁止运行所有自定义操作。 因此,可以抑制卸载或升级期间有问题的自定义操作。 这只是卸载某些东西的“紧急方法”。

我想我应该设置条件NOT Installed AND FLAG="1" 没有测试,留下那里的东西。

这是一个类似的先前答案: Suppress custom actions on uninstall


一些类似或相关的答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM