我在尝试完成以下操作时遇到了具有挑战性的问题:我的应用程序安装了一个服务(watchdog.exe)和一个 exe 文件(app.exe)。
安装完成后,服务启动并创建进程“app.exe”。
在卸载期间,我想杀死进程“app.exe”(它在本地系统帐户下运行,所以我必须以管理员身份运行)。
问题 1:安装说它需要重新启动,因为它看到文件“app.exe”在 CostFinalize 阶段被保留(运行)(如果我对检查是否重新启动的阶段有误,请纠正我将是必需的)。在卸载开始时终止该进程会更好。我已经验证,如果在卸载过程中进程没有运行,那么安装不会抱怨需要重新启动。
问题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。