2

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

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

我真的很想避免必须有两个具有不同可执行文件的不同项目,所以我可以通知程序运行哪个服务的任何方式都会很棒。

4

3 回答 3

0

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

ServiceController yourService = new ServiceController( "YourServiceName" , "YourMachine" );
if( yourService.Status == ServiceControllerStatus.Stopped )
{
    yourService.Start();
}
于 2013-01-11T16:23:45.783 回答
0

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

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

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

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

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

于 2013-01-11T16:49:18.223 回答
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.

于 2013-01-11T17:05:36.293 回答