2010-12-23 3 views
7

타이머가 있고 실행 이벤트가 timer.Elapsed 인 Windows 서비스를 만들었습니다 (5 분 간격으로) 프로세스()가 생성됩니다. 그러나이 과정은 사건 발생시 생성되지 않습니다.타이머 이벤트가 발생할 때 Windows 서비스에서 프로세스를 시작할 수 있습니까?

다른 방법이 있습니까?

미리 감사드립니다.

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{  

    Process pr = new Process(); 
    pr.StartInfo.FileName = @"C:\Program Files\Messenger\msmsgs.exe"; 
    pr.StartInfo.WindowStyle = ProcessWindowStyle.Normal; 
    pr.StartInfo.CreateNoWindow = false; 
    pr.Start(); 
} 
+0

또는 생성 된 후 즉시 종료 하시겠습니까? 이 코드를 여기에 붙여 넣을 수 있다면 도움이 될 것입니다. –

+3

** Windows 서비스는 대화 형 응용 프로그램을 실행하도록 설계되지 않았습니다. ** 사용자는 프로세스를 실행할 수 있지만 열려는 새 창을 가져 오는 것은 위험한 제안입니다. 이 작업을 수행하려고 시도 할 모든 보안 문제는 말할 것도 없습니다. 타겟 서비스 사용자가 Windows Vista 또는 그 이후의 서비스 보안 모델을 고려하여 실행중인 경우 Windows 서비스 이외의 다른 것을 사용하거나 디자인을 다시 생각해 볼 필요가 있습니다. –

+0

또한 여기에서 가능한 복제본을 참조하십시오. http://stackoverflow.com/questions/677874/starting-a-process-with-credentials-from-a-windows-service (다른 자격 증명으로 실행되도록 서비스를 향상시키는 방법에 대해 논의하십시오. 및/또는 대화 형 모드 (참고 :이 지원되지 않습니다 (http://www.microsoft.com/whdc/system/sysinternals/Session0Changes.mspx) Vista 이상)). –

답변

19

처음에 알아 두었던 의견에 대한 설명을 덧붙이고 있습니다. 프로세스가 시작되었지만 창을 열어 본 이유는 Windows Vista 이상에서 Windows 서비스에 적용된 보안 모델 변경 때문입니다. 특별히 언급하지는 않았지만 이러한 운영 체제 중 하나에서이 프로그램을 실행하려고하는 것에 대해 강한 의구심을 갖고 있습니다. 실제 문제는 프로세스를 시작하지 않고 UI를 보여줍니다.

달성하고자하는 것은 사용자와 데스크톱과 직접 상호 작용할 수있는 창 (예 : 창 또는 대화 상자 표시)이 허용되는 "Interactive Service"입니다.
Windows XP를 사용하는 경우 서비스가 인 경우에만 Windows XP에서 실행해야합니다. 해당 문서의 지침에 따라 서비스를 대화 형 모드로 실행할 수 있습니다. Adobe Acrobat 응용 프로그램 창. 이 문서는 표시하지만,이 기능 는 Windows Vista 이상에서 작동하지 않습니다

중요   서비스는 바로 윈도우 비스타로 사용자와 상호 작용할 수 없습니다. 따라서 대화 형 서비스 사용이라는 절에서 언급 한 기술은 새 코드에서 사용하면 안됩니다.

보다 구체적으로, 이러한 버전에서는 서비스 및 응용 프로그램의 실행 방법이 변경되었습니다. 응용 프로그램이 다른 세션에서 실행되는 동안 서비스는 이제 세션 0에서 시스템에 의해 격리됩니다. 이것은 응용 프로그램 코드에서 시작된 공격으로부터 서비스를 격리하기위한 것입니다. 따라서 간단한 메시지 상자를 포함하여 시스템의 모든 사용자가 서비스에 표시되는 UI를 볼 수 없습니다. 이러한 변경 사항을 자세히 설명하는 백서는 here에서 읽을 수 있습니다. 좀 더 시각적 인 경우, 분할 선에 특별한주의를 기울이고, 새로운 모델을 보여주는 다이어그램은 다음을 참조하십시오

          Windows process isolation model under Windows Vista/7

결말은 사람들을 대상으로하는 경우이다 버전을 타겟팅해야하거나 이러한 버전을 타겟팅해야하는 경우이 허점을 사용할 수 없습니다. 의견에서 언급했듯이 결론은 Windows 서비스가 대화 형이 아니기 때문에 "허점"이라고 말합니다.. 여기에서하려는 것은 서비스의 목적과 디자인에 위배됩니다. 전에는 권장되지 않았지만 지금은 플랫이 전혀 작동하지 않습니다. 이 특정 기능이 필요한 경우에는 다른 종류의 응용 프로그램을 만들어야합니다. Windows Forms와 WPF는 모두 사용자 모드 응용 프로그램 용이며 둘 모두 필요에 따라 프로세스를 시작하고 새 창을 열 수 있습니다. 대신이 스타일의 응용 프로그램으로 변환하는 것이 좋습니다.

+0

Windows 서비스를 통해 GlobalKeyHook을 구현하는 방법이 있다면? 또한 서비스는'SetWindowsHookEx' 키 누르기 이벤트를 볼 수 있습니까? – Elshan

+0

@Jimmer No. [Windows 서비스의 글로벌 키보드 후크] (0120-385-424) –

0

서비스에서 UI를 표시하는 프로세스가 없기 때문에 사용자가 로그온하여 프로세스를 시작할 때 도우미 프로세스를 실행하는 것이 좋습니다.

+0

나는 그렇지 않습니다. 최소한 반드시 ... 서비스를 만드는 이유와 도우미 프로세스를 만드는 이유는 무엇입니까? 로그인시 자동 시작되는 도우미 프로세스를 만들 필요가있는 경우, 먼저 서비스가 필요한지 여부를 심각하게 재평가해야합니다. 당신이 할 수있는 일이 단지 당신이하는 것을 권장한다는 것을 의미하지는 않습니다. –

+0

예 - 당신이 바로 이것입니다. 그러나, 항상 실행되고 사용자에게보고해야하는 것이 필요한 경우이 아키텍처는 일종의 OK-ish입니까? –

0

나는이 파티에 조금 늦다는 것을 알고 있습니다. 그러나이 질문이 해결책을 찾기 위해 나왔기 때문에 OP의 질문에 대한 답을 제공 할 것입니다.

로그온 한 사용자의 토큰을 사용하여 CreateProcessAsUser를 사용하여 서비스에서 프로그램을 시작할 수 있습니다. MSDN은 이것을 보여주는 멋진 샘플 응용 프로그램을 제공합니다. CSCreateProcessAsUserFromService를 찾으십시오. https://code.msdn.microsoft.com/windowsapps/CSCreateProcessAsUserFromSe-b682134e#content

시도해 보았습니다. 서비스에서 내 기존 .NET 응용 프로그램에 대한 새 프로세스를 만들 수 있으며 정상적으로 작동합니다. 서비스 로그온 속성을 로컬 시스템 계정으로 설정했지만 "서비스와 데스크톱 상호 작용 허용"을 선택 취소했습니다. 타이머가 만료되면 내 응용 프로그램이 만들어지고 GUI 프레젠테이션과 사용자 상호 작용을 포함하여 정상적으로 시작될 때와 똑같이 작동합니다.

이것이 부적절하거나 바람직하지 않은 작업인지 여부는 다른 논의입니다. 그러나 그것은 실제로 가능하며 실제로 그렇게 어려운 것은 아닙니다.

0

일종의 해결 방법이 있지만 보안 문제를 수락 할 경우에만이 작업을 수행하는 것이 좋습니다.

귀하의 문제에 대한 답변 일 수 있습니다. CreateProcessAsUser.

이 샘플에서는 C# .Net으로 작성된 서비스 응용 프로그램의 로그온 한 사용자 세션에서 대화 형으로 프로세스를 만들고 실행하는 방법을 보여줍니다.

관련 문제