빠른 사용자 전환 및 원격 데스크톱을 사용하는 사용자 계정

Windows XP 사용자 계정을 사용하면 여러 사용자가 동시에 로그온할 수 있으며, 각 사용자는 자신의 설정과 각각 자신의 애플리케이션을 실행합니다. 한 사용자가 다른 사용자에 대한 액세스를 허용하기 위해 로그오프할 필요가 없으므로 빠른 사용자 전환 기능을 사용하여 각 사용자의 데스크톱에 쉽게 액세스할 수 있습니다. 사용자 계정에는 사용자가 원격 시스템에서 데스크톱 계정에 액세스할 수 있는 개인 터미널 서버 기능 또는 원격 데스크톱도 포함됩니다.

다음 항목을 다룹니다.

인프라 사용 요구 사항

Windows 2000에서 상속된 기본 인프라는 사용자 데이터, 사용자 설정 및 컴퓨터 설정의 상태 분리를 지원합니다. 이 인프라를 활용하면 Windows XP에서 애플리케이션을 성공적으로 실행하려면 다음이 필요합니다.

  • 사용자가 만든 데이터의 스토리지에 대한 내 문서 폴더는 기본적으로 설정됩니다.
  • 애플리케이션 데이터를 올바르게 분류하고 저장합니다.
  • "액세스 거부" 메시지에서 정상적으로 저하됩니다.

임시 파일, 메모리 매핑된 파일 및 문서는 모두 사용자 프로필 디렉터리의 적절한 하위 디렉터리에 저장되어야 합니다. SHGetFolderLocation 또는 SHGetFolderPath를 사용하여 이러한 파일에 대한 적절한 스토리지 위치를 확인합니다. 이러한 함수에 CSIDL_APPDATA 플래그를 전달하면 애플리케이션별 데이터에 대한 공통 리포지토리 역할을 하는 파일 시스템 디렉터리의 경로가 반환됩니다. 임시 파일과 같이 사용자가 변경할 때 변경해야 하는 데이터에 대해 CSIDL_APPDATA 대신 플래그 CSIDL_LOCAL_APPDATA 사용합니다.

위에 나열된 요구 사항은 Microsoft 인증 프로그램의 하위 집합입니다. 자세한 내용은 Windows 데스크톱 앱대한 인증 요구 사항 페이지를 참조하세요.

기존 애플리케이션과의 호환성

빠른 사용자 전환과 개인 터미널 서버 모두 터미널 서비스 기술을 사용하므로 대부분의 이전 Microsoft Win32 애플리케이션과 호환됩니다. 애플리케이션이 Windows 2000 로고를 준수하고 기본 프로필 분리 및 전원 관리 기능을 구현하는 경우 해당 애플리케이션은 개별 Windows XP 사용자 계정에서 제대로 실행되어야 합니다.

세션 전환 알림 등록

일반적으로 데스크톱 스위치가 발생할 때 애플리케이션에 알림을 받을 필요가 없습니다. 그러나 실행 중인 계정이 현재 데스크톱인 경우 알림을 받아야 하는 애플리케이션(예: 직렬 포트 또는 기타 공유 리소스에 액세스하는 애플리케이션)은 데스크톱 스위치 알림에 등록할 수 있습니다. 알림을 등록하려면 WTSRegisterSessionNotification 함수를 사용합니다.

해당 함수가 호출되면 hWnd 핸들이 있는 창이 등록되어 WndProc 함수를 통해 WM_WTSSESSION_CHANGE 메시지를 받습니다. 세션 ID는 lParam 매개 변수로 전송되며 메시지를 생성한 이벤트를 나타내는 코드는 wParam에서 다음 플래그 중 하나로 전송됩니다.

  • WTS_CONSOLE_CONNECT
  • WTS_CONSOLE_DISCONNECT
  • WTS_REMOTE_CONNECT
  • WTS_REMOTE_DISCONNECT
  • WTS_SESSION_LOGOFF
  • WTS_SESSION_LOGON

애플리케이션은 이 메시지를 사용하여 상태를 추적하고 콘솔 관련 리소스를 해제하고 획득할 수 있습니다. 사용자 데스크톱을 원격 및 콘솔 컨트롤 간에 동적으로 전환할 수 있습니다. 애플리케이션은 WM_WTSSESSION_CHANGE 메시지를 사용하여 원격 또는 로컬 연결 상태와 동기화해야 합니다.

프로세스가 더 이상 이러한 알림이 필요하지 않거나 종료되는 경우 WTSUnRegisterSessionNotification을 호출하여 알림을 등록 취소해야 합니다.

Important

WTSRegisterSessionNotification 전달된 hWnd 값은 참조 횟수가 계산되므로 할당된 모든 리소스의 릴리스를 보장하려면 WTSUnRegisterSessionNotification에 대해 동일한 수의 호출을 수행해야 합니다.

 

애플리케이션의 인스턴스 하나만 실행 중인지 확인

많은 애플리케이션이 하나의 인스턴스만 실행 중인지 확인해야 합니다. Windows XP에서 이 작업을 수행하는 방법에는 여러 가지가 있습니다. 그 중에는 다음이 있습니다.

  • FindWindow 또는 FindWindowEx를 사용하여 애플리케이션이 열리는 알려진 창을 검색합니다. 해당 창이 이미 열려 있는 경우 애플리케이션이 이미 실행 중임을 나타내는 표시로 사용할 수 있습니다.
  • 애플리케이션을 열 때 뮤텍스 또는 세마포 개체를 만들고 애플리케이션이 종료될 때 해당 개체를 닫습니다. 전역 개체 네임스페이스는 각 데스크톱에 대해 구분되어 각각에 대해 고유한 뮤텍스 및 세마포 개체 목록을 허용합니다.

모든 세션에서 애플리케이션 종료

애플리케이션은 모든 세션에서 자체 종료해야 할 수 있습니다. 예를 들어 둘 이상의 세션에서 동시에 실행되는 애플리케이션은 웹에서 새 파일을 다운로드할 수 있습니다. 그런 다음 업데이트된 비트로 자체를 닫고 다시 시작해야 할 수 있습니다. 물론 이 작업은 실행 중인 모든 세션에서 수행해야 합니다. 알림이 수신되면 애플리케이션이 클린 종료되도록 애플리케이션을 작성해야 합니다.

System Services와의 상호 작용

프로그래밍 방식의 관점에서 다음 사례를 해결해야 합니다.

  • 서버 프로세스는 클라이언트 프로세스에서 직접 요청을 받습니다.

    이 경우 메시지는 LPC(로컬 프로시저 호출) 또는 RPC(원격 프로시저 호출)를 사용하여 전송될 수 있습니다. 클라이언트 토큰을 검색할 수 있도록 하는 LPC 또는 RPC에 대한 API가 있습니다. 클라이언트 토큰을 가져오면 서버는 CreateProcessAsUser 호출에서 이를 사용할 수 있습니다. 이렇게 하면 클라이언트 사용자 토큰에 세션 태그가 있다고 가정하여 올바른 창 스테이션에서 프로세스가 표시됩니다.

    참고 항목

    CreateProcessAsUser 는 현재 세션 간에 처리 상속을 지원하지 않습니다.

     

  • 서버 프로세스는 알림을 받고 UI를 표시해야 하지만 현재 사용자의 컨텍스트에 표시할 필요는 없습니다.

    이 경우 서버 프로세스는 기본 프로세스 토큰을 복제하고 현재 세션 식별자와 일치하도록 해당 세션 식별자를 변경할 수 있습니다. 현재 세션 식별자는 WTSGetActiveConsoleSessionId 함수를 사용하여 가져올 수 있습니다.

    참고 항목

    토큰 세션 ID를 설정하려면 SE_TCB_PRIVILEGE 필요합니다. NT AUTHORITY\SYSTEM에서 실행되는 서비스로만 사용할 수 있습니다.

     

원격 데스크톱 및 대역폭

Windows XP에 원격 데스크톱 기능이 추가되면 애플리케이션은 필요한 것보다 더 많은 대역폭을 사용하지 않도록 노력해야 하며 데스크톱이 원격으로 연결된 경우 광범위한 화면 드로잉 및 애니메이션 효과를 피해야 합니다. 현재 세션이 원격인지 여부를 확인하려면 SM_REMOTESESSION 사용하여 GetSystemMetrics를 호출할 수 있습니다. 그러나 이 호출은 원격 호출과 연결 끊김을 구분하지 않습니다.