대화형 서비스

일반적으로 서비스는 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 _ 서비스 _ 알림을 사용 하 여 MessageBox 함수를 호출 하 여 메시지 상자를 표시 합니다. 간단한 상태 메시지를 표시 하는 데 권장 됩니다. 서비스를 초기화 하는 동안 또는 Handlerex 루틴에서 MessageBox 를 호출 하지 마세요. 별도의 스레드에서 호출 하지 않는 한 SCM을 적시에 반환할 수 있습니다.

대화형 서비스 사용

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

주의

LocalSystem 계정 등의 승격 된 보안 컨텍스트에서 실행 되는 서비스는 대화형 데스크톱에서 실행 되는 다른 응용 프로그램이이 창과 상호 작용할 수 있으므로 대화형 데스크톱에서 창을 만들지 않아야 합니다. 이는 로그온 한 사용자가 실행 하는 모든 응용 프로그램에 서비스를 노출 합니다. 또한 LocalSystem으로 실행 되는 서비스는 OpenWindowStation 또는 getthreaddesktop 함수를 호출 하 여 대화형 데스크톱에 액세스 하면 안 됩니다.

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

  1. LpServiceStartName 매개 변수에 대해 NULL을 지정 하 여 LocalSystem 계정의컨텍스트에서 서비스를 실행 합니다.
  2. 서비스 _ 대화형 _ 프로세스 플래그를 지정 합니다.

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

그러나 다음 레지스트리 키에는 서비스 대화형 프로세스의 효과를 제어 하는 NoInteractiveServices 값이 포함 되어 _ 있습니다 _ .

HKEY _ 로컬 _ 컴퓨터 \ 시스템 \ CurrentControlSet \ 컨트롤 \ Windows

NoInteractiveServices 값은 기본적으로 1로 설정 됩니다. 즉, 서비스에 _ 대화형 _ 프로세스가 있는지 여부에 관계 없이 서비스가 대화형으로 실행 되도록 허용 되지 않습니다. NoInteractiveServices 가 0으로 설정 되 면 서비스 _ 대화형 _ 프로세스 를 사용 하는 서비스를 대화형으로 실행할 수 있습니다.

Windows 7, Windows server 2008 R2, Windows XP 및 Windows Server 2003: NoInteractiveServices 값의 기본값은 0으로,이는 서비스 _ 대화형 _ 프로세스 를 사용 하는 서비스를 대화형으로 실행할 수 있음을 의미 합니다. NoInteractiveServices 이 0이 아닌 값으로 설정 된 경우 서비스 _ 대화형 _ 프로세스 의 여부와 관계 없이 시작 된 서비스를 대화형으로 실행할 수 없습니다.

중요

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