본문 바로가기

프로그래밍/미분류

[번역] 대화형 서비스 (from msdn)

msdn 문서인데 한글판이 없어서 번역해 본다.

비공식 번역본. ms측의 공식 번역본이 나오면 링크로 대신하겠음. 개인적 용도로 번역한 것이지만, 저작권에 문제가 있다면 내리겠습니다.


대화형 서비스

서비스는 GUI없이 자동으로 실행되도록 디자인된 콘솔 어플리케이션이다. 그런데, 어떤 서비스는 가끔 사용자와의 상호작용이 필요할 때도 있다.여기선 서비스에서 사용자와 상호작용하는 가장 좋은 방법에 대해 논한다.

 

중요 비스타에서 서비스는 사용자와 직접 상호작용할 수 없다. 따라서, 아래 언급된 "대화형 서비스 사용하기" 테크닉은 새 코드에는 적용되어서는 안 된다.

서비스에서 사용자와 간접적으로 대화하기

모든 윈도우 버전에서 다음과 같은 테크닉을 사용하여, 사용자와 대화할 수 있다.

  • WTSSendMessage 함수를 사용하여, 사용자 세션에 다이얼로그 박스를 띄운다.
  • 숨겨진 GUI 응용 프로그램을 따로 만들고, 사용자 대화 컨텍스트에서 CreateProcessAsUser 함수로 그 응용프로그램을 실행한다. GUI 응용프로그램은 명명된 파이프(named pipe) 같은 프로세스간 통신을 이용하여 통신하도록 설계하라. 서비스는 GUI 응용프로그램과 통신하여 언제 GUI를 띄울지를 알려준다. 응용프로그램은 사용자와의 상호작용 결과를 다시 서비스에게 전달하여 서비스가 필요한 행동을 하도록 한다. IPC로 당신의 서비스 인터페이스가 네트워크에 공개될 수 있으므로, 적절한 접근 제어 리스트(ACL)을 설정하라.

    서비스가 다계정 시스템에서 실행된다면, 응용 프로그램이 각 세션에서 시작될 수 있도록 다음 레지스트리 키를 등록하라. : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run. 만약 응용프로그램이 IPC로 명명된 파이프를 사용한다면, 서버는 각 세션 아이디를 기반으로 만들어진 유일한 이름을 할당하여 어떤 사용자의 프로세스인지를 구분할 수 있을 것이다.

윈도우즈 서버 2003, 윈도우즈 XP, 윈도우즈 2000에서는 또한 다음 테크닉을 사용할 수 있다.

  •  MB_SERVICE_NOTIFICATION를 넣어 MessageBox함수를 호출하여 메시지를 띄운다. 간단한 메시지를 이 방법을 이용하길 권장한다. 그러나 서비스 초기화나 HandlerEx 루틴에서는 늦지 않게 SCM으로 돌아가야 하므로 MessageBox를 호출하지 않거나, 다른 쓰레드에서 호출하라.

대화형 서비스 사용하기

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

 

주의 로컬시스템 계정같은 향상된 보안 컨텍스트에서 실행되는 서비스는 대화형 데스크탑에서 윈도우를 만들면 안 된다. 왜냐하면, 대화형 데스크탑에서 실행되고 있는 다른 응용프로그램이 이 윈도우와 상호작용할 수 있기 때문이다. 로그인된 사용자가 실행하는 모든 응용프로그램에 이 서비스가 보여진다. 또한 로컬시스템으로 실행되는 서비스는 OpenWindowStation이나 GetThreadDesktop 함수를 호출하여 대화형 데스크탑에 접근하면 안된다.

대화형 서비스를 만들려면, CreateService 함수를 호출할 때 다음과 같이 하라.

  1. lpServiceStartName 패러미터를 NULL로 지정하여 로컬시스템 계정에서 서비스를 실행한다.
  2. SERVICE_INTERACTIVE_PROCESS 플래그를 지정한다.

서비스가 대화형으로 실행되고 있는지 알아보려면, GetProcessWindowStation 함수를 호출하여 윈도우 스테이션 핸들을 뽑아내고, GetUserObjectInformation 함수로 윈도우 스테이션이 WSF_VISIBLE 속성을 갖는지 확인한다.

그러나, SERVICE_INTERACITVE_PROCESS의 효과를 제어하는 아래 레지스트리 키의 NoInteractiveService 값을 주시하자.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows

NoInteractiveServices 의 기본값은 0이다. 이 때 SERVICE_INTERACITVE_PROCESS는 대화형으로 실행이 허가된다. NoInteractiveServices가 0이 아닌 값이라면, 이후 실행되는 서비스는 SERVICE_INTERACITVE_PROCESS 설정 여부에 상관없이 모두 비대화형으로 실행된다.

 

중요 모든 서비스는 터미널 서비스 세션 0에서 실행된다. 그래서, 대화형 서비스가 사용자 인터페이스를 띄우면, 이 인터페이스는 세션 0에 연결된 사용자에게만 보인다. 대화하려는 사용자가 모든 세션 0에 연결됐으리라는 보장이 없기 때문에, 터미널 서비스나 빠른 사용자 전환(fast user switching)을 지원하는 시스템에서의 대화형 서비스는 대화형으로 설정하지 말라.

728x90