I have an application in C# (2.0 running on XP embedded) that is communicating with a 'watchdog' that is implemented as a Windows Service. When the device boots, this service typically takes some time to start. I'd like to check, from my code, if the service is running. How can I accomplish this?
-
1Please have a look on the [ServiceController](http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller(VS.80).aspx) object in .NET. – Larry Oct 07 '08 at 12:08
-
Oooh...even better than rolling your own via WMI. I'll remove my answer. – EBGreen Oct 07 '08 at 12:12
-
@EBGreen - I don't know, the WMI route may be useful for someone else in future, there's more than one way to skin a cat, and all that.... – Carl Oct 07 '08 at 12:16
-
Ya, but I really do think ServiceController is better over all, so I think I will leave it deleted. I never would have even suggested WMI if I hadn't just woken up. :) – EBGreen Oct 07 '08 at 12:17
2 Answers
I guess something like this would work:
Add System.ServiceProcess
to your project references (It's on the .NET tab).
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";
}
Edit: There is also a method sc.WaitforStatus()
that takes a desired status and a timeout, never used it but it may suit your needs.
Edit: Once you get the status, to get the status again you will need to call sc.Refresh()
first.
Reference: ServiceController object in .NET.

- 5,881
- 4
- 25
- 24
-
11ServiceController.GetServices() retrieves a array that contains all the installed service as ServiceController object. This may help a lot. – Larry Oct 07 '08 at 12:13
-
Good call, I don't know if I've ever used that. Even if you never use it, I guess that it would be useful for debugging if nothing else – Carl Oct 07 '08 at 12:18
-
9Add reference to System.ServiceProcess and add the statement: using System.ServiceProcess; – NealWalters Dec 17 '09 at 14:50
-
6If I passed a bad service name, it seemed to lock up instead of throwing an error. I added this code: catch (System.Exception ex) { return "Not found"; } – NealWalters Dec 17 '09 at 16:19
-
6NealWalters: How do you know the exception was thrown just because the service was not found? Isn't there a more suitable exception type to catch? – Patrik Svensson Feb 05 '10 at 14:27
-
3private static bool ServiceExists(string serviceName) { return ServiceController.GetServices().FirstOrDefault(s => s.ServiceName == serviceName) != null; } – Dmitry Pavlov Aug 15 '13 at 19:03
-
By the way `SERVICENAME` would be equal to the `ServiceName` property on the installer used for the service. If it matches your project name, an easy shortcut is to just use `this.ServiceName` – atconway Feb 19 '14 at 22:51
-
What's has more performance: new ServiceController(svcName) or ServiceController.GetServices().FirstOrDefault ? – Kiquenet Jun 09 '14 at 10:52
-
-
I found that I had to add more generic exception catches for when services did not exist. – SharpC Mar 19 '18 at 09:18
-
I've rolled back the changes that were made to this answer, because it should have been a new answer, rather than a full replacement for an existing answer with 300 votes. – Carl Jun 28 '18 at 13:07
-
So .NET 5 has made this more difficult with a System.PlatformNotSupportedException: 'ServiceController enables manipulating and accessing Windows services and it is not applicable for other operating systems.' Any suggestions? – Jroonk Oct 28 '22 at 03:19
Here you get all available services and their status in your local machine.
ServiceController[] services = ServiceController.GetServices();
foreach(ServiceController service in services)
{
Console.WriteLine(service.ServiceName+"=="+ service.Status);
}
You can Compare your service with service.name property inside loop and you get status of your service. For details go with the http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.aspx also http://msdn.microsoft.com/en-us/library/microsoft.windows.design.servicemanager(v=vs.90).aspx

- 19,717
- 37
- 107
- 164

- 343
- 3
- 14
-
3This has a weak performance because you would have to loop over each and every service that's currently installed on the system in search for a single service. I recommend using this https://stackoverflow.com/a/178162/5262734 – Minasie Shibeshi Aug 25 '20 at 07:22