2013-02-09 6 views
2

.NET 3.5에서 작업 중이며 ServiceController를 사용하여 일부 서비스를 중지하는 데 문제가 있습니다. 내 서비스가 중지 될 때까지 나는 기다리고 있어요.NET 3.5에서 ServiceController를 사용하여 서비스를 중지 할 수 없습니다.

using (ServiceController service = new ServiceController("Service")) 
{ 
    try 
    { 
     TimeSpan timeout = TimeSpan.FromSeconds(timeoutSeconds); 

     service.Stop(); 
     service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.ToString()); 
    } 
} 

: 나는 것을 어떻게 여기)

, 나는 전체 인터넷을 검색하고 내 문제에 대한 해결책을 찾을 수 없습니다. 그런 다음 라이브러리를 교체 (업데이트)하고 싶습니다. 그리고 예외가 발생합니다 :

UnauthorizedAccessException 예외 정보 : System.UnauthorizedAccessException : 경로 'blablabla'거부에 대한 액세스.

관리자로 내 응용 프로그램을 실행하기 때문에이 경로에 액세스 할 수 있습니다.

이 코드가 실행될 때 흥미로운 점은이 서비스가 작업 관리자의 현재 서비스 목록에서 사라집니다. 그래서 실제로 멈추지 만 일부 쓰레드는 여전히 그것을 사용해야하므로 어떤 서비스의 파일도 이동할 수 없습니다. 심지어 내가 직접 파일을 이동하려고 할 때 (나는 서비스 디렉토리로 가서 마우스를 사용하여 파일을 이동하려고한다) 나는 그것을 할 수 없다. 하지만 서비스를 수동으로 중지하면 (작업 관리자 및 '작업 끝내기') 파일로 원하는 모든 작업을 수행 할 수 있습니다. C# 코드 (ServiceController 사용)에서 중지하고 작업 관리자를 사용하여 중지하는 것의 차이점은 무엇입니까?

중요한지는 잘 모르겠지만 가상 서버의 Windows Server 2008에서이 응용 프로그램 (및이 서비스)을 실행합니다. (나는 다른 컴퓨터에서 내 컴퓨터를 실행해야했다.).

어떤 아이디어로도이 문제를 해결할 수 있습니까? ;)

어떤 도움을 주셔서 감사합니다.

최고의 소원, 피트.

+0

'작업 관리자'로 코드를 중지 할 수있는 이유는 이미 관리자 토큰이 있기 때문입니다. 애플리케이션이 '서비스'를 조작하려면 애플리케이션을 가장하거나 적절한 관리자 레벨에 있는지 확인해야합니다. 이 작업은'Windows Principal Assembly'로 할 수 있습니다. 다른 옵션은 '서비스 중지'를 위해 관리자 명령 프롬프트 명령을 실행하는'프로세스'를 시작하는 것입니다. 그런 다음 다시 시작하는 작업이 완료되면 '프로세스'를 다시 호출하십시오. – Greg

+1

작업 관리자를 사용하여 서비스를 중지하지 않았으므로 * 삭제했습니다. 큰 차이. –

+0

@Greg 나는 그것에 대해 생각했지만 ServiceController와 같은 서비스를 제어 할 수 있다면 서비스를 제어 할 수 있다고 생각했지만이 상황에서 'net stop'을 작성하여 사용하면됩니다. 모든 해답을 가져 주셔서 감사합니다! –

답변

4

좋아, 문제를 해결했습니다.

은 우선은 Service을 중지 Net StopAdministrator Command-Prompt Command을 사용하고 을 열심히하지만 난 이유를 궁금해하기 시작했다. 대답은 많은 시간이 걸렸습니다! ServiceController은 실제로 중지했지만 일부 프로세스는 여전히 그것을 사용하고있었습니다. 이 imidaitely (그것은 단지 하나의 변화 목록 Windows Services에서의) 서비스의 상태를 변경하지만, 특정 서비스를 사용하여 정중하게 모든 스레드를 닫으면 그래서 모든 당신을 시간 :

이 걸리기 때문에

service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 

또한, 미세 workerd 해야 할 일은 잠깐 기다린 다음 다시 실행 중인지 다시 확인하십시오. 그렇다면 Process 클래스로 종료하십시오.