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

本文关键字:运行 可执行文件 服务 查找 | 更新日期: 2023-09-27 17:52:48

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

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

我真的很想避免有两个不同的项目和不同的可执行文件,所以我可以用任何方式通知程序运行哪个服务将是伟大的。

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

您可以在ImagePath中传递参数。我知道我曾经使用过。net windows服务,但我记得,我必须使用标准的。net安装程序以外的东西来安装服务。

. net安装程序在您传递的任何内容周围添加引号,这使得ImagePath从C:'test'test.exe -arguments变为"C:'test'test.exe -arguments",而它应该是"C:'test'test.exe" -arguments

检查WiX, sc.exe或CreateService以获得正确的注册表值。

要测试,像往常一样安装您的服务,并在regedit中浏览到HKEY_LOCAL_MACHINE'SYSTEM'CurrentControlSet'services'yourServiceName并编辑ImagePath。查看HKEY_LOCAL_MACHINE'SYSTEM'CurrentControlSet'services'seclogon,查看它的外观。

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

然后你可以通过一个新的进程来启动你的服务,这个进程首先尝试获取第一个服务的互斥锁,如果它不能获取它,它会启动第二个服务。

所以,你启动servicerrun .exe -foo。获得名为"foo"的互斥锁,因此释放互斥锁,servicerrun .exe启动Service.exe -foo。

如果没有获得互斥锁,那么尝试获得一个名为"bar"的互斥锁,并遵循相同的过程。

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

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

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