2011-03-01 4 views
2

현재 Windows 시작시 LocalService 사용자로 .NET WinService가 시작되었습니다. 이 서비스는 Process.Start()를 사용하여 다른 WinForms 응용 프로그램을 시작합니다..NET WinService의 대화 형 로그온 사용자로 프로그램 시작

그러나이 솔루션에서 여러 가지 문제가 있습니다

  1. 우리는 대화 형 사용자 로그온을 기다리지 않고 그것을 시도 및 DirectX 장치를 초기화하지 못하기 때문에 응용 프로그램이 떨어진다.
  2. LocalService에서 시작된 응용 프로그램은 Windows XP에서 사용자 데스크톱과 완벽하게 상호 작용합니다. 그러나 win7에서 각 사용자마다 그래픽 스테이션이 다르기 때문에 Windows 7에서는 작동하지 않습니다.
  3. 때때로 우리는 현재 대화 형 로그온 사용자 권한으로 응용 프로그램을 실행해야합니다.

누구나 서비스에서 사용자 대화 형 로그온을 기다리는 방법을 알고 이러한 사용자 권한으로 WinForms 응용 프로그램을 시작 하시겠습니까?

나는 이것이 모든 문제를 해결하는 데 도움이된다고 생각합니다.

+0

로그온 할 때 사용자의 권한으로 응용 프로그램을 시작하려면 표준 자동 실행 옵션 중 하나 (레지스트리 키 또는 시작 폴더)에 어떤 문제가 있습니까? – Zooba

+0

@Zooba, winservice 작업 중 하나는 시작 후 응용 프로그램을 돌보고 넘어 질 때 다시 시작하는 것입니다. – acoolaum

+0

@acoolaum Windows는이 기능 중 일부를 제공하며 (http://msdn.microsoft.com/en-us/library/cc303708.aspx), 옵션 일 수 있습니다. 또는 응용 프로그램이 시작할 때 서비스에 알릴 수 있습니까? 같은 효과를 얻으시겠습니까? – Zooba

답변

2

별도의 클라이언트 응용 프로그램이 필요합니다. 이 문서 (6 페이지)를 확인하십시오 : http://msdn.microsoft.com/en-us/windows/hardware/gg463353.aspx.

모니터링/재시작 시나리오에서이 문서에서 언급 한대로 CreateProcessAsUser를보십시오. 거의 확실하게 클라이언트 응용 프로그램이이를위한 서비스와 조정될 필요가 있으며 둥근 구멍으로 정사각형 페그를 밀고 있습니다.

+0

좋아, 내가 읽을 게하지만 문제 2 번만 해결할 것 같아. – acoolaum

+0

아마도 다른 두 가지 문제는 서비스가 필요한 문제가 아니기 때문일 수 있습니다. –

+0

왜 안 되니? 내 WinService의 주요 목표는 중요한 응용 프로그램 상태 모니터링이며 컴퓨터에 원격 제어를 제공하는 것입니다. – acoolaum

1

위의 답변을 조합하여 사용해 보겠습니다.

# 1을 해결하려면 사용자 로그온시 레지스트리 또는 시작 폴더에서 자동 시작을 사용하여 Winforms 응용 프로그램을 시작하십시오. 성공적으로 시작되었음을 서비스에 알리십시오.

사용자 로그온 후 Winform 응용 프로그램이 성공적으로 시작되었는지 확인하려면 : 응용 프로그램이 현재 백그라운드에서 실행되고 있는지 확인한 후 초기 시작을 허용하지 않는지 확인하는 서비스를 요청하십시오. 대신 사용자가 로그온 할 때 등록 만하면 OnSessionChange를 수신하여 수행 할 수 있어야합니다. 실행중인 응용 프로그램을 확인하기 전에 로그인/시작 프로세스가 완료 될 때까지 허용되는 X 초의 지연을 설정합니다 (가장 좋은 해결책은 아닐 수도 있음).

서비스에서 응용 프로그램이 시작되지 않았거나 충돌이 발생했다는 메시지가 나타나면 Mark point out, CreateProcessAsUser 메서드를 사용하여 서비스에서 응용 프로그램을 다시 시작하십시오.

1

당신이하려는 일에 올바른 접근 방식이 아닌 것이 가능합니까? 모니터링 로직이나 가동 시간 요구 사항을 서비스에 포함하는 것이 더 좋으므로 서비스가 항상 "켜져"있습니다. 그렇다면 WinForms 앱에 UI 로직이 남아있을 것입니다. WinForms 앱은 불편을 끼치 지 않고 열거 나 닫을 수 있습니다.