Don't know if there is a better way to do this, so that is the reason for the question. I can check if a service exists on a particular machine with the following code:
bool DoesServiceExist(string serviceName, string machineName) { ServiceController controller = null; try { controller = new ServiceController(serviceName, machineName); controller.Status; return true; } catch(InvalidOperationException) { return false; } finally { if (controller != null) { controller.Dispose(); } } } but this seems like an ineffecient solution to me (due to the exception handling). Is there a better way to check if a service exists. Note - I have recently switched to .Net 4.0 so if someone knows of a better solution in 4.0 that would be acceptable.
EDIT: Here is a sample c# console app to test the performance of my example as well as the GetServices code sample. In my testing I found that the GetServices is much more performative in the case where the service does not exist, but is twice as slow when the service does exist:
static void Main(string[] args) { string serviceName = string.Empty; string machineName = string.Empty; var sw = new Stopwatch(); sw.Reset(); sw.Start(); for (int i = 0; i < 1000; i++) { ServiceExistsException(serviceName, machineName); } sw.Stop(); Console.WriteLine("Elapsed time: " + sw.ElapsedMilliseconds.ToString()); sw.Reset(); sw.Start(); for (int i = 0; i < 1000; i++) { ServiceExistsGetList(serviceName, machineName); } sw.Stop(); Console.WriteLine("Elapsed time: " + sw.ElapsedMilliseconds.ToString()); Console.WriteLine("Done"); Console.ReadLine(); } static bool ServiceExistsException(string serviceName, string machineName) { ServiceController controller = null; try { controller = new ServiceController(serviceName, machineName); string name = controller.DisplayName; return true; } catch (InvalidOperationException) { return false; } finally { if (controller != null) { controller.Dispose(); } } } static bool ServiceExistsGetList(string serviceName, string machineName) { ServiceController[] services = null; try { services = ServiceController.GetServices(machineName); var service = services.FirstOrDefault(s => s.ServiceName == serviceName); return service != null; } finally { if (services != null) { foreach (ServiceController controller in services) { controller.Dispose(); } } } } }