2016-11-12 1 views
0

다른 응용 프로그램과 함께 작동하는 Windows 서비스를 만들고 있습니다. 이러한 응용 프로그램은 VIA Remoting 서비스와 통신을 시작합니다. 연결이 완료되면 서비스가 중지되면 즉시 통신을 중지하도록 응용 프로그램에 요청합니다. 의미는 더 이상 유효하지 않은 IpcConnection을 사용하려고했기 때문에 Timer가 경과하거나 예외가 발생하기를 기다리는 것을 원하지 않습니다.외부 프로세스 (서비스)를위한 WaitForExit() 방법

서비스가 아닌 서비스가 대화 형으로 실행되는 경우 모두 작동합니다. 서비스로 실행되면 예외가 발생합니다. 서비스가 대화 형으로 실행되는지 또는 대화 형으로 실행되는지에 관계없이 서비스는 관리자로 실행됩니다. 관리자로 다른 응용 프로그램을 실행하면 예상대로 작동합니다. 안타깝게도이 애플리케이션을 관리자로 실행하는 것은 프로덕션에서는 옵션이 아닙니다.

나는 예외의 원인을 좁히기로했습니다.

var serverProc = Process.GetProcessById(_remote.ProcessId); 
serverProc.WaitForExit(); 

serverProc은 성공하지만, WaitForExit이 실패합니다.

System.ComponentModel.Win32Exception (0x80004005): Access is denied 
    at System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited) 
    at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited) 
    at System.Diagnostics.Process.WaitForExit(Int32 milliseconds) 

나는 Timer이 코드를 대체 할 수 있습니다,하지만 난이 현재의 기술은 일하는 것이 기대했다.

나는 뭔가 일을하고 있으며 예외를 피하기 위해 비슷한 코드를 사용할 수 있습니까?

+0

이 완전히 정상입니다 :

는 작품, 응용 프로그램을 만들기 위해이 질문을 사용할 수 있다고 가정하면 항상 권한을 필요로합니다. 실용적이어야하고, Process 클래스의 작동 방식을 변경할 수 없습니다. 그리고 그것은 확실히 작별 인사를 시작하는 서비스로 시작해야하므로 힘든 방법을 찾아야 할 필요가 없습니다. 하드 크래시로 죽을 때도 작동하지 않습니다. 예외적으로 예외가 발생해야합니다. –

답변

0

서비스가 다른 사용자 (아마도 LocalSystem)로 실행되고있을 가능성이 큽니다. 또한 응용 프로그램이 관리자가 아닌 현재 사용자로 실행되고있을 가능성이 큽니다.

관리자가 아닌 프로세스는 다른 사용자가 프로세스의 일부 측면을 쿼리 할 수 ​​없습니다. 관리자 권한으로 응용 프로그램을 실행하여 문제를 확인할 수 있습니다. 실행 파일을 마우스 오른쪽 단추로 클릭하고 "관리자 권한으로 실행"을 선택하면 사용자 액세스 제어 대화 상자가 나타나고 문제없이 실행해야합니다. How do I force my .NET application to run as administrator?

관련 문제