在WIX中强制杀死Windows服务

时间:2018-04-11 11:04:58

标签: c# windows wix windows-services

我有windows服务,它将作为wix安装的一部分安装。问题是,当前服务正在生产中,并且由于服务OnStop方法中的一些写得不好的代码,它没有响应停止。

因此,下次用户尝试安装升级版本时,安装将失败,因为当wix尝试停止服务时,服务永远不会停止。

有没有办法让我知道wix是否需要花费太多时间来卸载,如果我收到通知,我可以终止这个过程?

另外,有什么方法可以根据产品版本杀死进程?

谢谢

2 个答案:

答案 0 :(得分:0)

我不应该回答这个问题,因为我处理过这样的事情已经很久了,但到底是什么,让我们试试。

  1. CloseApplication元素 :也许我会先尝试WiX's CloseApplication Element。我怀疑它是否可以用于服务,但这是我能想到的最方便的方法。
  2. Sysinternals PsKill :Mark Russinovich的PsKill值得一试。我认为他的工具是可再发行的,因此您可以将它们包含在您的设置中,并且它们总是很好。您必须从提升的延迟模式自定义操作调用它 - 这比使用内置WiX构造更为复杂。
  3. Taskkill :还有内置的Taskkill - 我从未使用过。 Suggested use with the sc tool
  4. 我想强调的是,我还没有真正测试过这些杀毒服务的工具,而且我现在还没有时间这么做。在计划运行来自WiX的StopServices自定义操作之前,可能存在排序CloseApplication的排序问题。请在编译后使用Orca(在底部)检查InstallExecuteSequence以查看是否是这种情况。

答案 1 :(得分:0)

我在挖掘一段时间后找到了解决方法。

我正在创建新的C#自定义操作项目,我在InstallInitialize之前对我的操作进行排序。

在我的C#自定义操作方法中,我正在使用读取现有的已安装文件版本      FileVersionInfo.GetVersionInfo(文件路径);

然后我正在检查我想检查的所需版本,如果条件匹配,我正在使用

查杀服务流程
 foreach (Process proc in Process.GetProcessesByName("ProcessName"))
 {
      proc.Kill();
      session.Log("Service Killed");
 }

为了实现这一点,必须预先安装Wix工具集v3.11.1