2011-04-13 5 views
0

다음 코드를 사용하여 asp.net 응용 프로그램에서 Windows 시간 서비스를 다시 시작하려고하지만 항상 TimeoutException을 반환합니다. 이 오류를 제거하고 서비스를 다시 시작하는 여러 가지 방법을 시도했지만 불행히도 실패합니다. 나는이 목적을 위해 사용하고 코드는 다음과 같습니다 :ASP.NET 응용 프로그램에서 Windows 서비스를 다시 시작할 수 없습니다.

private ServiceController service = new ServiceController("W32Time", Environment.MachineName); 
private TimeSpan timeout = TimeSpan.FromMilliseconds(35000);//15000 was the old value 

// Restart W32Time Service 
private void RestartService() 
{ 
    try 
    { 
     // Stop service if it is running 
     if(service.Status == ServiceControllerStatus.Running) 
     { 
      service.Stop(); 
      service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 
     } 

     // Start service if it is stopped 
     if(service.Status == ServiceControllerStatus.Stopped) 
     { 
      if (!(service.Status.Equals(ServiceControllerStatus.Stopped) || service.Status.Equals(ServiceControllerStatus.StopPending))) 
      { 
       service.Stop(); 
      } 

      service.Start(); 
      service.WaitForStatus(ServiceControllerStatus.Running, timeout); 
     } 
    } 
    catch(Exception ex) 
    { 
     log.Error("Error in restarting windows service.", ex); 
    } 
} 

나는 누군가가 나에게이 문제에 대한 솔루션을 제안 할 수 윈도우 7을 사용하고 있습니다? 어떤 도움을 주시면 감사하겠습니다.

+4

응용 프로그램이 실행되는 계정에 서비스에 대한 액세스 권한이 있습니까? – Davidann

답변

1

Davids 주석은 관련성이 있으며 W32time 서비스에 대한 종속성을 확인해야합니다. 어떤 것도 존재하지 않을 수 있습니까? 하지만 그렇게하면 문제가 발생할 수 있습니다. 64 비트 컴퓨터의 경우 'W32 ..'의 관련성을 확인합니다.

[편집] 적어도 다른 Windows 7 컴퓨터에서 작동하는 코드 샘플을 첨부합니다. 위에서 제공 한 코드는 나에게도 효과적이다.

class Program 
{ 
    static void Main() 
    { 
     WindowsServiceManager service = new WindowsServiceManager(); 
     service.Run("W32Time", 2000); 
     service.End("W32Time", 2000); 
    } 
} 

public class WindowsServiceManager 
{ 
    internal void Run(string serviceId, int timeOut) 
    { 
     using (ServiceController serviceController = new ServiceController(serviceId)) 
     { 
      TimeSpan t = TimeSpan.FromMilliseconds(timeOut); 
      serviceController.Start(); 
      serviceController.WaitForStatus(ServiceControllerStatus.Running, t); 
     } 
    } 

    internal void End(string serviceId, int timeOut) 
    { 
     using (ServiceController serviceController = new ServiceController(serviceId)) 
     { 
      TimeSpan t = TimeSpan.FromMilliseconds(timeOut); 
      serviceController.Stop(); 
      serviceController.WaitForStatus(ServiceControllerStatus.Stopped, t); 
     } 
    } 
} 
+0

이름은 여전히 ​​64 비트에서 W32Time입니다. 부수적으로 * default * W32Time은 종속 관계가 없습니다. –

+1

@ 마크 당신은 거기에 포인트를 가지고, 나는 안드로이드에서 확인 모드가 아니었다. 그것들은 경우에 따라 문제에 대한 설명의 완전한 법적 환경입니다. 성공을 위해 W32Time을 직접 사용해 보았습니다. 서비스가 ** 수동으로 ** 시작 및 중지 (서비스 대화 상자를 통해) 할 수 있습니까? .NET으로 다른 이벤트를 제어 할 수 있습니까? 또한 W32Time이 로컬 서비스로 실행되는 것으로 나타나서 두 번째 인수 인 '환경. 컴퓨터 이름'을 생략하면 클래스 인스턴스가 해당 계정 (http://tinyurl.com/6xlktbr, msdn)을 찾을 수 있습니다. – Independent

+0

답변을 주니어에게 감사드립니다. Windows Time Service를 수동으로 다시 시작하는 경우에도 문제가 발생합니다. 네트워크 관리자에게 문의 한 후에 내가 게시 한 코드가 Google 도메인 외부의 컴퓨터에서 제대로 작동하고 있으므로 해결책을 찾았습니다. 문제는 내 계정의 승인입니다. 당신의 도움을 주셔서 감사합니다. –

관련 문제