在WIX中强制杀死Windows服务



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

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

有什么方法可以让我知道Wix是否花费太多时间卸载,如果我收到该通知,我可以杀死该过程?

另外,有什么方法可以杀死基于产品版本的进程吗?

谢谢

经过一段时间的挖掘,我找到了解决方案.

我正在创建新的 C# 自定义操作项目,并在安装初始化之前对操作进行排序。

在我的 C# 自定义操作方法中,我正在使用 FileVersionInfo.GetVersionInfo(filePath);

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

foreach (Process proc in Process.GetProcessesByName("ProcessName"))
{
proc.Kill();
session.Log("Service Killed");
}

为了实现这一目标, Wix 工具集 v3.11.1 必须事先安装

也许试试这个:更新的答案。


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

CloseApplication Element
  1. :也许我会先尝试WiX的CloseApplication Element。我怀疑它是否适用于服务,但这是我能想到的最方便的方法。
  2. SysinternalsPsKill:Mark Russinovich的PsKill值得一试。我认为他的工具是可再发行的,因此您可以将它们包含在您的设置中,而且它们总是很好。您必须从提升的延迟模式自定义操作中调用它 - 这始终比使用内置 WiX 构造更复杂。
  3. Taskkill
  4. :还有内置的Taskkill——我从未使用过。建议与 sc 工具一起使用。

我想强调的是,我还没有真正测试过这些用于杀戮服务的工具,我现在也没有时间这样做。排序可能存在问题,可以在 WiX 的CloseApplication自定义操作计划运行之前安排StopServices。编译后请使用逆戟鲸(朝底部)检查InstallExecuteSequence,看看是否是这种情况。

最新更新