如何验证Windows服务是否正在运行


182

我有一个C#应用程序(在嵌入式XP上运行2.0),该应用程序与作为Windows服务实现的“看门狗”进行通信。设备启动时,此服务通常需要一些时间才能启动。我想根据我的代码检查服务是否正在运行。我该怎么做?


1
请查看.NET中的ServiceController对象。
拉里

噢...比通过WMI滚动自己的脚本还要好。我将删除答案。
EBGreen

@EBGreen-我不知道,WMI路线将来可能对其他人有用,有多种方法可以给猫皮等等,所有这些……
卡尔,

是的,但我确实确实认为ServiceController在所有方面都更好,所以我想将其删除。如果我没有醒来,我什至不会建议WMI。:)
EBGreen

Answers:


366

我想这样的事情会起作用:

添加System.ServiceProcess到项目引用中(位于.NET选项卡上)。

using System.ServiceProcess;

ServiceController sc = new ServiceController(SERVICENAME);

switch (sc.Status)
{
    case ServiceControllerStatus.Running:
        return "Running";
    case ServiceControllerStatus.Stopped:
        return "Stopped";
    case ServiceControllerStatus.Paused:
        return "Paused";
    case ServiceControllerStatus.StopPending:
        return "Stopping";
    case ServiceControllerStatus.StartPending:
        return "Starting";
    default:
        return "Status Changing";
}

编辑:还有一种方法sc.WaitforStatus()具有所需的状态和超时,从未使用过,但是它可能满足您的需求。

编辑:一旦获得状态,要再次获得状态,您将需要先致电sc.Refresh()

参考:.NET中的ServiceController对象。


11
ServiceController.GetServices()检索包含所有已安装服务的数组作为ServiceController对象。这可能会有所帮助。
拉里

9
添加对System.ServiceProcess的引用并添加以下语句:using System.ServiceProcess;
NealWalters

6
如果我传递了错误的服务名称,它似乎会锁定而不是抛出错误。我添加了以下代码:catch(System.Exception ex){返回“未找到”;}
NealWalters

6
NealWalters:您怎么知道仅由于找不到服务而引发了异常?是否有更合适的异常类型可以捕获?
Patrik Svensson

3
私有静态布尔ServiceExists(string serviceName){return ServiceController.GetServices()。FirstOrDefault(s => s.ServiceName == serviceName)!= null; }
Dmitry Pavlov 2013年

16

在这里,您可以获得所有可用服务及其在本地计算机中的状态。

ServiceController[] services = ServiceController.GetServices();
foreach(ServiceController service in services)
{
    Console.WriteLine(service.ServiceName+"=="+ service.Status);
}

您可以在循环内将服务与service.name属性进行比较,然后获取服务状态。有关详细信息,请访问 http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx 以及 http://msdn.microsoft.com/en-us/library/microsoft.windows.design .servicemanager(v = vs.90).aspx

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.