查找哪个服务在C#中运行可执行文件

时间:2013-01-11 16:16:54

标签: c# asp.net-mvc windows-services

我想知道是否有可能找出哪些Windows服务运行了可执行文件?

我有两个不同的服务从同一个exe运行,做不同的事情。该程序的主要方法检测命令行参数,并将启动控制台应用程序(如果在Environment.UserInteractive中运行),或启动两个可能的服务之一。我找不到一个很好的方法来辨别哪个服务正在运行,所以我可以选择正确的服务来启动代码。在Windows服务的图像路径中传入.exe参数似乎不起作用。这些服务在服务器上运行并自动启动,因此手动执行此操作并不是一种选择。

我真的想避免让两个不同的项目使用不同的可执行文件,所以我可以通知程序运行哪个服务会很棒。

3 个答案:

答案 0 :(得分:0)

让您的服务共享其启动状态(临时文件,注册表项或其他方法,甚至可以将其作为html写入Web服务器......)

ServiceController yourService = new ServiceController( "YourServiceName" , "YourMachine" );
if( yourService.Status == ServiceControllerStatus.Stopped )
{
    yourService.Start();
}

答案 1 :(得分:0)

您可以在服务启动时使用其运行版本的唯一名称在服务中创建Mutex。如果获得互斥锁,则表示它未运行。如果无法获取,则该服务已在运行。

然后,您可以通过首先尝试获取第一个服务的互斥锁的新流程启动您的服务,如果它无法获取它,则启动第二个服务。

因此,您启动ServiceRunner.exe -foo。获取名为“foo”的互斥锁,因此您释放Mutex并且ServiceRunner.exe启动Service.exe -foo。

如果未获得互斥锁,则尝试获取名为“bar”的互斥锁,并按照相同的过程进行操作。

这是一个讨厌的解决方案,需要您创建一个只需尝试启动服务的新exe。

答案 2 :(得分:0)

您可以在ImagePath中传递参数。我知道我已经使用.net Windows服务在某些时候完成了它,但我记得,我必须使用标准.Net安装程序之外的其他东西来安装服务。

.Net安装程序会为您传递的内容添加引号,这使得ImagePath从C:\test\test.exe -arguments转到"C:\test\test.exe -arguments"时应该是"C:\test\test.exe" -arguments

结帐WiXsc.exeCreateService以获取正确的注册表值。

要测试,请照常安装您的服务,然后使用regedit浏览到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\yourServiceName并编辑ImagePath。有关它应该如何显示的示例,请查看HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\seclogon