[c#] Windows 서비스가 C #에 설치되어 있는지 확인하는 방법

동일한 컴퓨터에 설치된 GUI에 WCF 서비스를 노출하는 Windows 서비스를 작성했습니다. GUI를 실행할 때 서비스에 연결할 수없는 경우 서비스 앱이 아직 설치되지 않았기 때문인지 아니면 서비스가 실행되고 있지 않기 때문인지 알아야합니다. 전자 인 경우 여기에 설명 된대로 설치하고 싶습니다 . 후자의 경우 시작하고 싶습니다.

질문은 서비스가 설치되어 있는지 여부를 어떻게 감지하고 설치되었는지 감지하면 어떻게 시작합니까?



답변

사용하다:

// add a reference to System.ServiceProcess.dll
using System.ServiceProcess;

// ...
ServiceController ctl = ServiceController.GetServices()
    .FirstOrDefault(s => s.ServiceName == "myservice");
if(ctl==null)
    Console.WriteLine("Not installed");
else
    Console.WriteLine(ctl.Status);


답변

다음도 사용할 수 있습니다 ..

using System.ServiceProcess;
...
var serviceExists = ServiceController.GetServices().Any(s => s.ServiceName == serviceName);


답변

실제로 다음과 같이 반복됩니다.

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 ()으로 래핑하면 연결을 close () 할 필요도 없습니다.

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;
    }


답변