Jaa


Remote Session인지 확인하는 방법

Windows 운영체제는 기존에는 개인 사용자용 PC의 운영체제로 주로 사용 되었으나 Windows NT 4.0 Server의 Option Pack에 IIS가 추가되면서 HTTP나 FTP 서버로서의 역할을 수행하게 되었고, 인터넷 시장의 급성장에 발맞추어 서버 운영체제로서 주목을 받기 시작합니다. 당시 서버 시장의 추축을 이루고 있던 Unix 서버에 비해서 적은 비용으로 쉽게 서버를 구성할 수 있다는 게 큰 장점으로 부각되었습니다. 하지만 서버 가용성 측면에서, 그리고 back office 서비스를 제공해주는 서버 어플리케이션이 아직 부족했던 때라 중소 규모의 사이트에서만 주로 사용되었던 것 같습니다.

시장 상황은 Windows 2000이 출시되면서 조금 변화하게 됩니다. Windows 2000이 Home, Professional, Server, Data Center Server의 라인업을 갖추고 본격적으로 서버용 운영체제로서의 기능을 제대로 갖추기 시작했기 때문입니다.

Windows 2000 Server와 함께 소개된 여러 서버 구성요소 중에서 원격 관리를 위해 소개된 서비스가 바로 Terminal Service 입니다. Server 장비는  일반 PC와 달리 물리적으로 IDC나 전산센터 서버실 같은 원격지에 위치하는 것이 일반적입니다. 따라서 서버의 상태나 서비스를 관리하기 위해서 매번 서버가 위치한 곳으로 이동할 수 없기 때문에 네트워크를 통한 원격 관리 기능이 필수적입니다. 이를 위해서 Windows 2000 Server 제품군에 Terminal Service라는 구성요소가 추가되었고, Terminal Service Client 프로그램을 이용해서 원격에서 로그인하고 서버의 실행화면을 직접 보면서 키보드나 마우스를 통해서 원격지에서 관리가 가능하게 되었습니다.

image

[그림] 원격 장비에 접근하기 위해 사용되는 Remote Desktop

이렇게 기존과 달리 하나의 Windows 운영체제에서 컴퓨터에 직접 연결된 모니터, 키보드, 마우스를 이용해서 접근하고 있는 사용자 외에 원격지에서 접근해서 사용중인 사용자를 구분해서 관리할 필요성이 대두하였고, 이를 ‘Session’ 이라는 용어로 부르기 시작합니다. 그리고 로컬에서 console을 이용해서 접근한 session을 ‘Session 0’ 라고 명하고, 그외에 원격에서 접속한 session을 ‘Remote Session’ 이라고 이름 지었습니다. 하나의 운영체제에서 동시에 여러 개의 session이 생성되어서 독립적인 환경에서 각각 사용이 가능하게 됩니다.

Windows XP에서 도입된  ‘Fast User Swiching’ 이라는 기능 또한 일맥상통하는 기술입니다. Windows 2000 서버 에디션에만 포함되던 Terminal Service에서 사용되던 원격 관리 기술을 서버가 아닌 개인용 PC에 적용한 것입니다. 이를 이용해서 현재 로그인된 A라는 사용자의 세션을 그대로 유지한 상태에서, 새로운 사용자 B로 로그인해서 다른 세션에서 작업이 가능합니다. 동일한 PC에서 A 사용자의 세션과 B 사용자의 세션이 모두 active 한 상태에서 전환이 가능합니다.

그러면 이제 운영체제의 환경이 이렇게 되다보니 응용 프로그램을 개발하는 개발자도 고민거리가 하나 생기게 됩니다. 현재 실행되는 응용 프로그램이 로컬 컴퓨터에서 실행되고 있는지, 아니면 Remote Session에 의해서 실행되고 있는지 확인하는 방법이 필요하게 됩니다. 아주 간단한 예로 애플리케이션 라이센스에 민감한 유료 응용 프로그램이 있다면, 하나만 구입하고 서버에서 설치한 상태에서 여러 사용자들이 원격으로 접속해서 공유해서 사용하는 방법이 가능하기 때문입니다.

만약 remote session 환경인지 판단해서 “원격 환경에서는 실행되지 않는 프로그램입니다.”라는 메시지를 띄우고 종료하고 싶다면 이를 어떠한 방법으로 확인할 수 있을까요. GetSystemMetrics Win32 API를 통해 저희가 원하는 내용을 얻을 수 있습니다.

이 함수는 다음과 같이 nIndex라는 int 형 인자를 받고, int 형으로 결과를 리턴 해주는 함수 입니다.

 int WINAPI GetSystemMetrics(
  __in  int nIndex
);
 nIndex 값으로 다음 값을 전달하면 현재 실행되는 환경이 원격 환경인지 확인이 가능합니다.
SM_REMOTECONTROL (0x2001) This system metric is used in a Terminal Services environment. Its value is nonzero if the current session is remotely controlled; otherwise, 0.
SM_REMOTESESSION (0x1000) This system metric is used in a Terminal Services environment. If the calling process is associated with a Terminal Services client session, the return value is nonzero. If the calling process is associated with the Terminal Services console session, the return value is 0.

Windows Server 2003 and Windows XP:   The console session is not necessarily the physical console. For more information, see WTSGetActiveConsoleSessionId.

GetSystemMetrics 함수 및 nIndex에 대한 보다 자세한 내용은 아래 MSDN 문서를 참고하시기 바랍니다.

GetSystemMetrics
https://msdn.microsoft.com/en-us/library/ms724385(VS.85).aspx

Comments

  • Anonymous
    May 21, 2009
    The comment has been removed