Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检测某人已停止Windows服务?_C#_Windows_Service_Servicecontroller - Fatal编程技术网

C# 如何检测某人已停止Windows服务?

C# 如何检测某人已停止Windows服务?,c#,windows,service,servicecontroller,C#,Windows,Service,Servicecontroller,我有一个有点奇怪的案子要处理 我有Windows服务“A” 在“B”中监视“A”中的事件。“B”是一个应用程序,如果“A”停止运行,它将重新启动“A” 如果用户在Windows中手动关闭服务应用程序中的“A”,或在命令提示符下使用net stop关闭“A”,则不应重新启动“A”。基本上,每当一个非应用程序(即人类)停止它时,我不希望它重新启动“a” 下面是“B”的一个简单示例: 由于用户会像其他应用程序一样使服务的状态调用stop,有没有办法检测谁实际停止了该特定的Windows服务?有没有

我有一个有点奇怪的案子要处理

  • 我有Windows服务“A
  • 在“B”中监视“A”中的事件。“B”是一个应用程序,如果“A”停止运行,它将重新启动“A”
  • 如果用户在Windows中手动关闭服务应用程序中的“A”,或在命令提示符下使用net stop关闭“A”,则不应重新启动“A”。基本上,每当一个非应用程序(即人类)停止它时,我不希望它重新启动“a”
下面是“B”的一个简单示例:


由于用户会像其他应用程序一样使服务的状态调用stop,有没有办法检测谁实际停止了该特定的Windows服务?有没有办法检测是否有人停止了该服务?

也许这会有帮助。。。您具体要处理哪些场景?你说你想让手动关机工作,并且已经内置了一些功能,可以在服务失败时重新启动服务,那么这里的实际使用情况是什么?@Savanna我不确定查询最后一个停止服务的服务帐户是否可以工作,因为管理员命令提示符可以使服务停止。但是,使用该命令提示符的人仍然是人,并且不可能与另一个管理员应用程序停止服务帐户(我将调用服务重启)区分开来。另外,从测试中,我发现事件日志(Windows8.1)不包含我的任何用户数据。系统日志中没有任何内容,应用程序日志中有“服务已成功启动”。由于用户为N/A。@Damien_是测试中的不信者,我尝试在我的服务上设置0秒启动延迟,并在所有故障时重新启动它,并在这里玩逻辑,在任务管理器中关闭主机进程时重新启动它。我不完全确定它是如何在操作系统中实现的,但逻辑是错误的。我可以启动一个服务,在任务管理器中终止主机可执行文件,并在它启动时继续终止它,即使它设置为重新启动,但它实际上在某个点停止工作(可能是一个竞争条件,当它处于开始->启动转换时,在重新启动时终止)。B除了确保a正在运行之外,还做其他事情吗?如果服务需要停止而不是重新启动,您可以让用户杀死A和B。在不知道应用程序将如何使用的情况下,很难说出您的选项。
ServiceController controller = new ServiceController(someServiceName);
while (true)
{
    controller.WaitForStatus(ServiceControllerStatus.Running);
    controller.WaitForStatus(ServiceControllerStatus.Stopped);
    controller.Start();
}