C# 查找已在C中运行可执行文件的服务#

C# 查找已在C中运行可执行文件的服务#,c#,asp.net-mvc,windows-services,C#,Asp.net Mvc,Windows Services,我想知道是否有可能找出哪个windows服务运行了可执行文件 我有两个不同的服务从同一个exe运行,做不同的事情。程序的主要方法检测命令行参数,并将启动控制台应用程序(如果在Environment.UserInteractive中运行),或启动两个可能的服务之一。我找不到一个好方法来辨别哪个服务正在运行,以便在代码中选择正确的服务启动。在windows服务的映像路径中传入.exe参数似乎不起作用。这些服务是在服务器上运行并自动启动的,因此手动操作实际上不是一个选项 我真的不想让两个不同的项目具有

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

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


我真的不想让两个不同的项目具有不同的可执行文件,因此我可以通过任何方式通知程序运行哪个服务都是很好的。

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

您可以在服务启动时使用其运行版本的唯一名称在服务中创建。如果获得了互斥,那么您知道它没有运行。如果无法获取,则该服务已在运行

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

因此,您启动ServiceRunner.exe-foo。获得一个名为“foo”的互斥体,因此释放互斥体,ServiceRunner.exe启动Service.exe-foo

如果未获得互斥体,则尝试获取名为“bar”的互斥体,并遵循相同的过程


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

您可以在
ImagePath
中传递参数。我知道我在某个时候使用了.net windows服务,但我记得,我必须使用标准.net安装程序以外的其他工具来安装该服务

Net安装程序在您传递的任何内容周围添加引号,这使ImagePath从
C:\test\test.exe-arguments
变为
“C:\test\test.exe-arguments”
,而此时它应该是
“C:\test\test.exe”-arguments

签出,或获取正确的注册表值


要进行测试,请照常安装服务,并在regedit中浏览到
HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\services\yourServiceName
,然后编辑ImagePath。要查看它的外观示例,请查看
HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\services\seclogon

,您的意思是您有一个service.exe,如果以-foo开头,它会以一种方式运行,如果通过-bar,它会以另一种方式运行,问题是有时其中一个可能正在运行,但你不知道是哪个?
ServiceController yourService = new ServiceController( "YourServiceName" , "YourMachine" );
if( yourService.Status == ServiceControllerStatus.Stopped )
{
    yourService.Start();
}