Я написал службу Windows, которая предоставляет службу WCF графическому интерфейсу пользователя, установленному на том же компьютере. Когда я запускаю графический интерфейс, если я не могу подключиться к службе, мне нужно знать, связано ли это с тем, что приложение службы еще не установлено, или потому, что служба не запущена. Если первое, я хочу установить его (как описано здесь ); если второе, я хочу его запустить.
Вопрос: как определить, установлена ли служба, а затем, обнаружив, что она установлена, как ее запустить?
c#
wcf
windows-services
Шауль Бер
источник
источник
.GetServices()
возвращает 100ServiceController
объектов, и вы избавились от одного из ста, игнорируя остальные, действительно ли это заметно лучше? Сам я бы так не сказал.Вы также можете использовать следующее ..
using System.ServiceProcess; ... var serviceExists = ServiceController.GetServices().Any(s => s.ServiceName == serviceName);
источник
GetServices(string)
Собственно цикл такой:
foreach (ServiceController SC in ServiceController.GetServices())
может вызвать исключение «Доступ запрещен», если учетная запись, под которой работает ваше приложение, не имеет прав на просмотр свойств службы. С другой стороны, вы можете безопасно это сделать, даже если службы с таким именем не существует:
ServiceController SC = new ServiceController("AnyServiceName");
Но доступ к его свойствам, если служба не существует, приведет к InvalidOperationException. Итак, вот безопасный способ проверить, установлена ли служба:
ServiceController SC = new ServiceController("MyServiceName"); bool ServiceIsInstalled = false; try { // actually we need to try access ANY of service properties // at least once to trigger an exception // not neccessarily its name string ServiceName = SC.DisplayName; ServiceIsInstalled = true; } catch (InvalidOperationException) { } finally { SC.Close(); }
источник
Для не-linq вы можете просто выполнить итерацию по массиву следующим образом:
using System.ServiceProcess; bool serviceExists = false foreach (ServiceController sc in ServiceController.GetServices()) { if (sc.ServiceName == "myServiceName") { //service is found serviceExists = true; break; } }
источник
Думаю, это лучший ответ на этот вопрос. Нет необходимости добавлять дополнительную обработку, чтобы проверить, существует ли служба, так как в противном случае она вызовет исключение. Вам просто нужно его поймать. Вам также не нужно закрывать () соединение, если вы оборачиваете весь метод в using ().
using (ServiceController sc = new ServiceController(ServiceName)) { try { if (sc.Status != ServiceControllerStatus.Running) { sc.Start(); sc.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 10)); //service is now Started } else //Service was already started } catch (System.ServiceProcess.TimeoutException) { //Service was stopped but could not restart (10 second timeout) } catch (InvalidOperationException) { //This Service does not exist } }
источник
private bool ServiceExists(string serviceName) { ServiceController[] services = ServiceController.GetServices(); var service = services.FirstOrDefault(s => string.Equals(s.ServiceName, serviceName, StringComparison.OrdinalIgnoreCase)); return service != null; }
источник