'desktop'에 해당되는 글 1건

  1. 2007/01/29 Window Station과 Desktop 그리고 Session

Window Station과 Desktop 그리고 Session
2007/01/29 08:25

예전 프린터 드라이버를 개발하는 회사에서 일할때 잉크나 토너의 사용여부등을 알려주는 프린터 모니터 프로그램에서 대화상자를 올바르게 띄우지 못하는 버그가 발생했었다.
윈도우 XP에 FastUserSwitching이란 기능이 있는데 이를 이용하여 두번째 logon 한 사용자는 프린터 모니터의 대화상자를 볼수없었다.
디버깅을 해본 결과 FastUserSwitching은 터미널 서비스 세션을 이용하여 첫번째 logon 한 사람과 두번째 logon 사람의 Session이 각각 Session0과 Session1로 다르기 때문에 두번째 logon한 사람은 프린터 모니터의 대화상자를 볼수없고 엉뚱하게 첫번째 logon사람의 화면에 대화상자가 보여졌기 때문이다.
오래되서 기억은 나지 않지만 꽤 번거로운 작업을 해서 해결했던 기억이...
프린터 드라이버에서 모니터 프로그램을 CreateProcessAsUser로 실행했던가?!

Window Station 과 Desktop

윈도우는 User Interface, GDI 그리고 커널 메인 객체를 제공한다.
커널은 안전하지만 UI, GDI는 그렇지 않기 때문에 추가적인 보안성을 제공하기 위해 윈도우는 stations와 desktops 을 사용한다.
Station은 클립보드, desktop 등을 포함하는 프로세스와 관련이 있는 보안객체 이고 Desktop은 Station내에 존재하며 논리화면, 윈도우, 메뉴, 훅과 같은 User Interface를 포함하는 보안객체이다. 로그온 화면을 관리하는 winlogon desktop, 화면보호기를 담당하는 screen saver desktop, 평상시 윈도우 화면을 보여주는 interactive desktop의 3가지로 나눠진다.

사용자가 logon을 하게 되면 WinSta0\Winlogon 에서  smss.exe(세션메니져), winlogon.exe, msgina.dll를 통해 일련의 logon 작업을 거쳐 최종적으로 Winsta0\default 라는 interacive window station을 생성한다.
그러므로 사용자는 Winsta0 의 station에서만이 UI 및 키입력을 받을수 있다. (즉 서비스의 경우는 Service-0x0-3e7$\default 로 생성된다.)
Winlogon 과 default desktop은 서로 메세지나 대화상자를 공유할수 없다. 자신의 desktop(winlogon, default)에서만 사용이 가능하다. 하지만 클립보드는 Station에서 관리되기 때문에 다른 desktop에서 사용이 가능하다.

Service의 경우 LocalSystem 계정(administrator 계정보다 상위개념)으로 실행되어 Service-0x0-3e7$\default 와 같은 station을 생성하므로 UI 및 키입력을 받을수 없다. 그래서 서비스내에서 UI를 가진 프로그램을 실행시키기 위해서는 STARTUPINFO 구조체의 si.lpDesktop = "WinSta0\\Default"; 와 같이 설정하여 실행시켜야 한다. 서비스 프로그램중에서 mtask.exe와 같은 프로그램은 WinSta0을 사용한다.
반면 서비스 프로그램을 UI 또는 키입력을 받기 위해서는 CreateService로 실행시 SERVICE_INTERACTIVE_PROCESS 옵션을 사용하거나 서비스 등록정보에서 로그온정보에 "데스크과 상호 작용" 을 설정하면 서비스도 UI 및 키입력을 받을수 있다.

여기까지가 Station과 Desktop에 관한 이야기였고 맨위에서 말한바와 같이 우리가 알고 있어야 Session이라는 개념이 하나가 더있다.
XP에서는 Session을 통해 사용자마다 다른 Session ID를 부여한다. 이러한 Session의 개념은 Teminal Service Session에서 이미 사용되어 졌다. (FastUserSwitching도 결국 Teminal Service Session을 이용한다.)
결국 Session -> WindowStation -> Desktop 와 같은 구조를 이루는데 다른 Session에서는 같은 winsta0\default 를 가졌더라도 메세지 및 UI가 공유될수 없다. 즉 Session 1 에 logon 한 사용자가 실행시킨 프로그램에서 표시된 대화상자는 Session 2로 logon 사용자의 화면에는 나타나지 않는다는 이야기다. (당연한 이야기 아닌가?)

단 XP에서는 첫번째 logon 사용자에게 Session 0 이 부여되는것(서비스도 마찬가지로 Session 0 이 주어진다.)과 달리 윈도우 Vista에서는 Session 0은 서비스에게만 주어지고 첫번째 logon 사용자는 Session 0 이외에 다른 Session ID가 부여되어진다.


2007/01/29 08:25 2007/01/29 08:25
Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다