List all Windows services in C#
I decided to make a tutorial to help the ones that were interested to learn how to go over the Windows services so they can either start/stop/pause them or just display them in a control. The code I’ll be showing is from a program I created with the purpose of listing all the services info in a listview control.
The first steps you will need to take is reference “System.ServiceProcess” which will allow us to use the ServiceController class and also add the following code on the top of our Form/Class:
1 2 | using System.ServiceProcess; using Microsoft.Win32; |
We start by declaring our ServiceController class and populating it with all the services that currently run in the system using .GetServices();
1 | ServiceController[] services = ServiceController.GetServices(); |
Then we need to use a foreach loop in order to go through all the services. For the sake of this tutorial I’ll be using only one try/catch, usually you will want more to display more accurate info based on what info you fail to retrieve, in this case if an error occurs the whole service won’t be added to the list.
1 2 3 4 5 6 7 8 9 10 11 12 | foreach (ServiceController service in services) { try { // Our code will go here } catch (Exception ex) { Console.WriteLine(ex.Message); } } |
It’s time to start populating our ListView columns. The columns we will be using is the services name/status/location/description. To do that we need to first declare a new ListViewItem that we will be using to add the information. The service name and status info are easy to obtained using the ServiceController class as follows:
1 2 3 4 | ListViewItem newListViewItem = new ListViewItem(); newListViewItem.Text = service.ServiceName; newListViewItem.SubItems.Add(service.Status.ToString()); |
Since the ServiceController doesn’t provide us with a way to get the services description or the services location, we will need to use the registry for that. All the services info can be located in “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services”. Inside the services folders there are a lot of key values. In our case, we are after “ImagePath” which shows the location of the service and “Description” which shows the description. In order to add the following information to our listviewitem we write the following lines:
1 2 3 4 | RegistryKey regKey1 = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\services\\" + service.ServiceName); newListViewItem.SubItems.Add(regKey1.GetValue("ImagePath").ToString()); newListViewItem.SubItems.Add(regKey1.GetValue("Description").ToString()); regKey1.Close(); |
Finally we can add the listviewitem to our listview with all the information we added to it.
1 | listView1.Items.Add(newListViewItem); |
Our method should look like this now:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | ServiceController[] services = ServiceController.GetServices(); foreach (ServiceController service in services) { try { ListViewItem newListViewItem = new ListViewItem(); newListViewItem.Text = service.ServiceName; newListViewItem.SubItems.Add(service.Status.ToString()); RegistryKey regKey1 = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\services\\" + service.ServiceName); newListViewItem.SubItems.Add(regKey1.GetValue("ImagePath").ToString()); newListViewItem.SubItems.Add(regKey1.GetValue("Description").ToString()); regKey1.Close(); listView1.Items.Add(newListViewItem); } catch (Exception ex) { Console.WriteLine(ex.Message); } } |
And here’s the final result.
Keep in mind that it’s possible to go over the services by checking for the values in registry. But using this way allows easier management of the service since you can use service.Start() service.Stop() and so on while looping through them.
Hope you find this informative/useful.
Thanks alot sir , You help me much, by this site I got much support.
One problem I have.
I am quite new in window application c#, I took button from tool bar and I want to perform key press event, but here I am not able to perform this operation, when I make button enable false then key press event work properly, How to solve this problem to perform key press event and button click both in a form page,Thanks.