Wix 在卸载期间杀死我的应用程序

Wix 在卸载期间杀死我的应用程序,wix,Wix,我在尝试实现以下目标时遇到了具有挑战性的问题: 我的应用程序安装一个服务(watchdog.exe)和一个exe文件(app.exe) 安装完成后,服务启动并创建进程“app.exe” 在卸载期间,我想终止进程“app.exe”(该进程在本地系统帐户下运行,因此我必须以管理员身份运行) 问题1: 安装说明它需要重新启动,因为它看到文件“app.exe”在CostFinalize阶段被保留(运行)(如果我对检查是否需要重新启动的阶段有错误,请纠正我)。最好在卸载开始时终止进程。我已验证,如果卸载过

我在尝试实现以下目标时遇到了具有挑战性的问题: 我的应用程序安装一个服务(watchdog.exe)和一个exe文件(app.exe)

安装完成后,服务启动并创建进程“app.exe”

在卸载期间,我想终止进程“app.exe”(该进程在本地系统帐户下运行,因此我必须以管理员身份运行)

问题1: 安装说明它需要重新启动,因为它看到文件“app.exe”在CostFinalize阶段被保留(运行)(如果我对检查是否需要重新启动的阶段有错误,请纠正我)。最好在卸载开始时终止进程。我已验证,如果卸载过程中进程未运行,则安装不会抱怨需要重新启动

问题2: 使用自定义操作终止进程是有问题的。操作必须提升运行,但另一方面,它必须在costFinalize之前运行(否则-返回到问题1)

如有任何建议,我将不胜感激。此外,还有其他解决方案(是否有其他方法可以在安装过程中关闭进程,而不需要重新启动?)

我现在拥有的自定义操作代码(不太好,因为它不必要地要求重新启动,并且由于缺乏权限而无法终止进程):


以下是故障日志:

CAQuietExec:错误0x80070001:命令行返回错误。 CAQuietExec:错误0x80070001:CAQuietExec失败 CustomAction MyProcess.TaskKill返回了实际错误代码1603(注意,如果转换发生在沙箱中,则这可能不是100%准确) 操作于18:15:54结束:MyProcess.TaskKill。返回值1603


我有几个想法,即:

  • 使用EventWaitHandles,它允许进程之间相互通信,并将您的愿望委托给app.exe。然后,您的app.exe可以根据需要终止。这是一种清洁的溶液,应优先选用
如果出于任何原因,您决定终止应用程序,就像您根本不关心世界上的任何事情一样,那么您可以:

  • 我今天看到一个项目,可以运行微星完全提升,在所有阶段。这是视觉Stdio模板,但我现在找不到它,但我知道它存在于那里。 你也可以用这个,也许它可以:
基本上,你可以使用很多黑客技巧来杀死应用程序。比如使用wixburn并要求管理权限,然后做自己的事情。我会选择解决方案1(创建自己的机制)


顺便说一下,如果您在WiX中使用ServiceControl元素,它将在重新安装/卸载之前停止服务。您可以在服务中钩住OnStop()方法并在那里终止App.exe。若您已将服务设置为App.exe父进程,那个么应该有一个标志,表明任何子进程都会随父进程一起死亡

出于安全原因,我宁愿“像我不关心任何其他事情一样”杀掉这个应用程序。从一开始就以管理员身份运行安装程序可以解决我的问题,但到目前为止,第二个解决方案对我不起作用-wix正常启动,仅在安装过程中请求提升(在未能终止进程并让我知道需要重新启动后)。我将尝试更多地使用解决方案#2,看看能否让它工作。好吧,让其他应用程序杀死你的应用程序已经不安全了。想象一下,你的软件做了什么事情,却无缘无故地被杀死了。这是自找麻烦。
<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" />