我遇到了尝试完成以下任务的挑战性问题: 我的应用程序安装了一个服务(watchdog.exe)和一个exe文件(app.exe)。
安装完成后,服务启动并创建进程“app.exe”。
卸载期间我想杀死进程“app.exe”(在本地系统帐户下运行,所以我必须以管理员身份运行)。 问题1: 安装说它需要重新启动,因为它在CostFinalize阶段看到文件“app.exe”被保持(正在运行)(如果我检查是否需要重新启动的阶段,请纠正我)。卸载开始时杀死进程要好得多。我已经验证过,如果在卸载过程中没有运行该进程,那么安装不会抱怨需要重新启动。问题2: 使用自定义操作来终止进程是有问题的。动作必须提升,但另一方面它必须在costFinalize之前运行(否则 - 它回到问题1)。
我将不胜感激任何建议。此外,任何替代解决方案(是否有另一种方法可以在安装期间关闭该过程,不需要重新启动?)
我现在拥有的自定义操作代码(不好,因为它不必要地重新启动并且由于缺少权限而无法终止进程):
<InstallExecuteSequence>
<!--<ScheduleReboot After="InstallFinalize" />-->
<Custom Action="MyProcess.TaskKill" Before="InstallValidate"></Custom>
</InstallExecuteSequence>
<!--<Property Id="Net">Net.exe</Property>-->
<Property Id="QtExecCmdLine" Value='"[%SYSTEMROOT]\System32\taskkill.exe" /F /IM App.exe' />
<CustomAction Id="MyProcess.TaskKill"
BinaryKey="WixCA"
DllEntry="CAQuietExec"
Execute="immediate"
Return="ignore" />
以下是失败的日志:
CAQuietExec:错误0x80070001:命令行返回错误。 CAQuietExec:错误0x80070001:CAQuietExec失败 CustomAction MyProcess.TaskKill返回实际的错误代码1603(请注意,如果在沙箱中发生翻译,这可能不是100%准确) 行动结束18:15:54:MyProcess.TaskKill。返回值1603。
答案 0 :(得分:1)
我的想法很少,即:
如果由于某种原因您决定杀死该应用程序,就像您不关心世界上任何事情一样,那么您可以:
基本上你可以做很多hackery技巧来杀死应用程序。比如使用WiX Burn并要求管理权限,然后做你的事情。我会选择解决方案#1(创建自己的机制)
顺便说一句,如果您在WiX中使用ServiceControl元素,它将在重新安装/未加载之前停止服务。您可以在Service中挂钩OnStop()方法并在那里杀死您的App.exe。如果您将Service设置为App.exe父级,那么应该标记任何子进程与父进程一起死亡。