대화형 서비스

일반적으로 서비스는 GUI(그래픽 사용자 인터페이스) 없이 무인으로 실행되도록 설계된 콘솔 애플리케이션입니다. 그러나 일부 서비스는 사용자와 가끔 상호 작용해야 할 수 있습니다. 이 페이지에서는 서비스에서 사용자와 상호 작용하는 가장 좋은 방법을 설명합니다.

중요

서비스는 Windows Vista를 기준으로 사용자와 직접 상호 작용할 수 없습니다. 따라서 대화형 서비스 사용 섹션에 언급된 기술은 새 코드에서 사용하면 안 됩니다.

 

간접적으로 서비스에서 사용자와 상호 작용

다음 기술을 사용하여 지원되는 모든 Windows 버전의 서비스에서 사용자와 상호 작용할 수 있습니다.

  • WTSSendMessage 함수를 사용하여 사용자 세션에 대화 상자를 표시합니다.

  • 별도의 숨겨진 GUI 애플리케이션을 만들고 CreateProcessAsUser 함수를 사용하여 대화형 사용자의 컨텍스트 내에서 애플리케이션을 실행합니다. 명명된 파이프와 같은 일부 IPC(프로세스 간 통신) 방법을 통해 서비스와 통신하도록 GUI 애플리케이션을 디자인합니다. 서비스는 GUI 애플리케이션과 통신하여 GUI를 표시할 시기를 알려줍니다. 애플리케이션은 서비스가 적절한 작업을 수행할 수 있도록 사용자 상호 작용의 결과를 서비스에 다시 전달합니다. 적절한 ACL(액세스 제어 목록)을 사용하지 않는 한 IPC는 네트워크를 통해 서비스 인터페이스를 노출할 수 있습니다.

    이 서비스가 다중 사용자 시스템에서 실행되는 경우 각 세션에서 실행되도록 애플리케이션을 다음 키에 추가합니다. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. 애플리케이션이 IPC에 명명된 파이프를 사용하는 경우 서버는 각 파이프에 세션 ID에 따라 고유한 이름을 지정하여 여러 사용자 프로세스를 구분할 수 있습니다.

다음 기술은 Windows Server 2003 및 Windows XP에서도 사용할 수 있습니다.

  • MB_SERVICE_NOTIFICATION 사용하여 MessageBox 함수를 호출하여 메시지 상자를 표시합니다. 간단한 상태 메시지를 표시하는 데 권장됩니다. SCM으로 적시에 돌아갈 수 있도록 별도의 스레드에서 호출하지 않는 한 서비스 초기화 중 또는 HandlerEx 루틴에서 MessageBox를 호출하지 마세요.

대화형 서비스 사용

기본적으로 서비스는 비대화형 창 스테이션 을 사용하며 사용자와 상호 작용할 수 없습니다. 그러나 대화형 서비스는 사용자 인터페이스를 표시하고 사용자 입력을 받을 수 있습니다.

주의

LocalSystem 계정과 같은 관리자 권한 보안 컨텍스트에서 실행되는 서비스는 대화형 데스크톱에서 실행되는 다른 애플리케이션이 이 창과 상호 작용할 수 있으므로 대화형 데스크톱에 창을 만들지 않아야 합니다. 그러면 로그온한 사용자가 실행하는 모든 애플리케이션에 서비스가 노출됩니다. 또한 LocalSystem으로 실행되는 서비스는 OpenWindowStation 또는 GetThreadDesktop 함수를 호출하여 대화형 데스크톱에 액세스해서는 안 됩니다.

 

대화형 서비스를 만들려면 CreateService 함수를 호출할 때 다음을 수행합니다.

  1. localSystem 계정의 컨텍스트에서 서비스를 실행하려면 lpServiceStartName 매개 변수에 NULL을 지정합니다.
  2. SERVICE_INTERACTIVE_PROCESS 플래그를 지정합니다.

서비스가 대화형 서비스로 실행되고 있는지 확인하려면 GetProcessWindowStation 함수를 호출하여 창 스테이션에 대한 핸들을 검색하고 GetUserObjectInformation 함수를 호출하여 창 스테이션에 WSF_VISIBLE 특성이 있는지 여부를 테스트합니다.

그러나 다음 레지스트리 키에는 SERVICE_INTERACTIVE_PROCESS 영향을 제어하는 NoInteractiveServices 값이 포함되어 있습니다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows

NoInteractiveServices 값은 기본적으로 1입니다. 즉, SERVICE_INTERACTIVE_PROCESS 있는지 여부에 관계없이 대화형으로 실행할 수 있는 서비스가 없습니다. NoInteractiveServices를 0으로 설정하면 SERVICE_INTERACTIVE_PROCESS 있는 서비스를 대화형으로 실행할 수 있습니다.

Windows 7, Windows Server 2008 R2, Windows XP 및 Windows Server 2003:NoInteractiveServices 값은 기본적으로 0으로 설정됩니다. 즉, SERVICE_INTERACTIVE_PROCESS 있는 서비스가 대화형으로 실행될 수 있습니다. NoInteractiveServices가 0이 아닌 값으로 설정된 경우 이후 시작된 서비스는 SERVICE_INTERACTIVE_PROCESS 여부에 관계없이 대화형으로 실행할 수 없습니다.

중요

모든 서비스는 터미널 서비스 세션 0에서 실행됩니다. 따라서 대화형 서비스가 사용자 인터페이스를 표시하는 경우 세션 0에 연결된 사용자에게만 표시됩니다. 대화형 사용자가 세션 0에 연결되어 있음을 보장할 수 있는 방법이 없으므로 터미널 서비스 또는 빠른 사용자 전환을 지원하는 시스템에서 대화형 서비스로 실행되도록 서비스를 구성하지 마세요(빠른 사용자 전환은 터미널 서비스를 사용하여 구현됨).