Least-Privileged 사용자 계정으로 게임

이 문서에서는 게임 개발자가 권한이 가장 낮은 사용자 계정(제한된 사용자 계정이라고도 함)과 잘 작동하는 Microsoft Windows 게임을 작성하는 방법을 설명합니다.

소개

Windows 계정으로 사용자를 관리합니다. 현재 가정용 컴퓨터 사용자의 80% 이상이 컴퓨터를 다른 가족 구성원과 공유합니다. 여러 사용자가 Windows 컴퓨터를 공유하는 경우 여러 사용자 계정이 생성되고 각 사용자가 개별 계정으로 로그인하여 컴퓨터에 액세스합니다. 보안에 대한 인식이 높아짐에 따라 시스템을 완전히 제어할 수 없는 제한된 사용자 계정이라고도 하는 최소 권한의 사용자 계정으로 컴퓨터를 운영하는 사람이 늘어나고 있습니다. 관리자 계정은 일반적으로 컴퓨터의 모든 부분에 무제한으로 액세스할 수 있습니다. 이는 Windows 기반 게임의 작동 방식에 영향을 줄 수 있습니다.

최소 권한의 사용자 계정으로 작업하기 위해 게임을 작성하는 게임 개발자에게는 추가적인 이점이 있습니다. Windows Vista 이상에서는 최소 권한의 사용자 계정이 적용됩니다. 즉, 로컬 관리자를 제외한 시스템의 모든 계정이 최소 권한의 사용자 계정입니다. 이는 Windows Vista 이상에서 지침(레거시 애플리케이션)을 따르지 않는 게임이 실행되는 방식에 영향을 줍니다. 예를 들어 애플리케이션이 권한이 없는 폴더 또는 레지스트리 값에 쓰려고 하면 파일 쓰기가 사용자의 가상 파일 저장소로 리디렉션됩니다. 이 가상 파일 저장소는 사용자가 쓰기 권한이 있는 폴더에 상주합니다. 이 동작은 쓰기 시도가 완전히 실패하는 것만큼 치명적이지 않을 수 있습니다. 그러나 가상화된 파일을 만드는 애플리케이션은 사용자가 예상하는 위치에 파일이 기록되지 않으므로 사용자를 혼동할 수 있습니다. 예를 들어 실행 파일 폴더와 동일한 폴더에 높은 점수의 파일을 쓰는 게임은 이러한 파일을 가상화된 폴더에 대신 씁니다. 따라서 모든 사용자에게는 별도의 가상화된 파일 저장소가 있기 때문에 한 사용자가 다른 사용자가 달성한 높은 점수를 볼 수 없습니다.

이 문서의 지침을 따르는 게임은 최소 권한의 사용자 계정으로 실행되므로 Windows Vista 이상과의 호환성을 유지합니다.

Least-Privileged 사용자 계정에 대한 파일 액세스

Windows FAT32 및 NTFS라는 두 개의 파일 시스템을 지원합니다. FAT32는 이전 버전과의 호환성을 위해서만 지원되는 레거시 파일 시스템입니다. NTFS는 더 강력하고 강력한 파일 권한을 지원합니다. 소매업체가 NTFS 분할 하드 드라이브에 사전 설치된 Windows 새 컴퓨터를 배송함에 따라 NTFS의 사용이 확대되고 있습니다. NTFS 기반 Windows XP 시스템에서 권한이 가장 낮은 사용자 계정이 있는 사용자는 여러 폴더에 대한 액세스 권한만 제한됩니다. 그러나 FAT32 기반 Windows XP 시스템에 대한 완전한 액세스 권한이 있습니다.

다음 표에서는 이러한 폴더의 기본 위치와 해당 사용 권한을 나열합니다.

경로 폴더 내용 읽기 쓰기 만들기/삭제
<드라이브>:\Windows Windows 운영 체제 X
<드라이브>:\Program Files 실행 파일 애플리케이션 파일 X
<드라이브>:\Documents and 설정\Username* 각 사용자의 파일 X X X
<드라이브>:\문서 및 설정\모든 사용자 모든 사용자 파일 X X X

 

* 사용자 이름은 사용자의 로그인 이름입니다.

권한이 가장 낮은 사용자 계정에서는 문서 및 설정\사용자 이름 또는 문서 및 설정\모든 사용자 폴더에서 파일을 읽고, 쓰고, 만들고, 삭제할 수 있습니다.

즉, 저장 게임을 \Program Files에 배치하지 말고 \My Documents의 하위 폴더에 배치해야 합니다. 또한 \Program Files 또는 \My Documents에 임시 애플리케이션 데이터를 배치하지 않아야 하며 대신 애플리케이션 데이터 폴더(CSIDL_LOCAL_APPDATA)에 배치해야 합니다.

더 구체적으로 말하자면, 각 게임에서 처리해야 하는 두 가지 시나리오가 있습니다.

시나리오 1: 사용자가 보거나 변경할 필요가 없는 파일

일반적인 예로는 게임의 구성 파일, 임시 파일 및 게임 캐시 파일이 있습니다. 이러한 파일은 일반적으로 Application Data 폴더에 보관됩니다. 이 폴더 경로를 가져오려면 다음 코드 예제와 같이 CSIDL_APPDATA 또는 CSIDL_LOCAL_APPDATA 사용하여 SHGetFolderPath 함수를 호출합니다.

#include <shlobj.h>
#include <strsafe.h>

#define APPNAME L"MyApp"

WCHAR wszPath[MAX_PATH];

// Local Application Data
SHGetFolderPath( hWnd, CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, wszPath );
StringCchCatW( wszPath, MAX_PATH, L"\\" );
StringCchCatW( wszPath, MAX_PATH, APPNAME );

// Create the folder wszPath
// Then create files in wszPath
// Roaming Application Data
SHGetFolderPath( hWnd, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, wszPath );
StringCchCatW( wszPath, MAX_PATH, L"\\" );
StringCchCatW( wszPath, MAX_PATH, APPNAME );

// Create the folder wszPath
// Then create files in wszPath

로컬 및 로밍 애플리케이션 데이터 폴더의 차이점은 Windows 2000 및 Windows XP에서 로밍 콘텐츠는 로그온/로그오프 프로세스 중에 서버 간에 복사되지만 로컬 콘텐츠는 복사되지 않는다는 것입니다. 대부분의 게임의 경우 로컬 애플리케이션 데이터로 충분합니다.

시나리오 2: 사용자가 보거나 변경해야 하는 파일

일반적인 예로는 사용자의 저장된 게임 파일이 있습니다. 사용자가 쉽게 볼 수 있도록 사용자의 문서 폴더에 파일을 Microsoft Store. 애플리케이션은 다음 코드 예제와 같이 CSIDL_PERSONAL SHGetFolderPath 를 호출하여 사용자의 문서 폴더 경로를 가져옵니다.

#include <shlobj.h>
#include <strsafe.h>

#define APPNAME L"MyApp"

WCHAR wszPath[MAX_PATH];

SHGetFolderPath( hWnd, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, wszPath );
StringCchCatW( wszPath, MAX_PATH, L"\\" );
StringCchCatW( wszPath, MAX_PATH, APPNAME );

// Create the folder wszPath
// Then create files in wszPath

때때로 게임은 모든 사용자가 보고 사용하기 위한 파일을 저장해야 할 수 있습니다. 한 가지 예는 높은 점수 레코드입니다. 여기서 모든 사용자가 동일한 레코드 파일에 기록하여 각 사용자에 대해 별도의 높은 점수 대신 시스템 전체에서 높은 점수를 유지 관리합니다. 다른 예제는 다운로드된 맵, 미션 및 게임 수정입니다. 공유되는 경우 한 명의 사용자만 모든 사용자 대신 다운로드해야 합니다. 이 시나리오에서는 다음 코드와 같이 공유 프로필 폴더 아래에 있는 문서 폴더를 사용합니다.

#include <shlobj.h>
#include <strsafe.h>

#define APPNAME L"MyApp"

WCHAR wszPath[MAX_PATH];

SHGetFolderPath( hWnd, CSIDL_COMMON_DOCUMENTS, NULL, SHGFP_TYPE_CURRENT, wszPath );
StringCchCatW( wszPath, MAX_PATH, L"\\" );
StringCchCatW( wszPath, MAX_PATH, APPNAME );

// Create the folder wszPath
// Then create files in wszPath

Least-Privileged 사용자 계정에 대한 레지스트리 액세스

애플리케이션에서 Windows 레지스트리를 사용하여 정보를 저장하는 것이 일반적입니다. 파일 액세스와 마찬가지로 관리자 및 최소 권한의 사용자 계정에는 레지스트리에 대한 동일한 권한이 없습니다. 권한이 가장 낮은 사용자 계정의 경우 전체 HKEY_LOCAL_MACHINE 노드는 읽기 전용입니다. 예를 들어 게임은 기본 구성 정보를 읽을 수 있지만 이 노드에 새 정보를 작성하지 않을 수 있습니다. 따라서 레지스트리에 기록해야 하는 최소 권한 사용자 모드로 실행되는 게임은 다음 코드와 같이 HKEY_CURRENT_USER 노드를 사용하여 사용자별 정보를 저장해야 합니다.

#define APP_REGISTRY_KEY_PATH L"Software\\MyCompany\\MyApp"

LONG lRetVal;
HKEY hKey;

lRetVal = RegCreateKeyExW( HKEY_CURRENT_USER,
                           APP_REGISTRY_KEY_PATH,
                           0,
                           NULL,
                           REG_OPTION_NON_VOLATILE,
                           KEY_WRITE|KEY_READ,
                           NULL,
                           &hKey,
                           NULL );

if( ERROR_SUCCESS == lRetVal )
{
    // Store information in hKey
}

설치하는 동안 레지스트리 정보는 HKEY_CURRENT_USER 아니라 HKEY_LOCAL_MACHINE 기록해야 합니다. 이는 설치를 실행하는 사람이 일반적으로 관리자이며 프로그램을 사용하는 유일한 사람이 아닐 수 있기 때문입니다. 이 경우 HKEY_CURRENT_USER 작성하면 다른 사용자가 정보를 사용할 수 없게 됩니다. 설치하는 동안 레지스트리에 기록된 정보는 프로그램의 모든 사용자에게 적용되는 구성 및 기본 설정이므로 일반적으로 문제가 되지 않습니다.

게임을 제거할 때는 게임이 레지스트리에 쓴 모든 값을 제거하기 위해 추가적인 노력이 필요합니다. 제거자는 한 사람(일반적으로 관리자)이 실행하므로 HKEY_LOCAL_MACHINE 관련 정보를 삭제하기만 하면 HKEY_CURRENT_USER 다른 사용자의 값이 제거되지 않습니다. 레지스트리에서 사용자별 정보를 제거하는 한 가지 방법은 HKEY_USERS 레지스트리 하이브 루트를 열거하는 것입니다. HKEY_USERS 아래의 각 하위 키는 시스템의 특정 사용자에 대한 HKEY_CURRENT_USER 하이브에 해당합니다. HKEY_USERS 열거하고 각 하위 키에서 게임 관련 정보를 제거하면 제거자가 정보가 남아 있지 않은지 확인할 수 있습니다.

Least-Privileged 사용자 계정으로 패치

게임을 패치하려면 게임의 파일을 업데이트해야 합니다. 따라서 일반적으로 게임의 프로그램 폴더에 대한 쓰기 액세스 권한이 필요합니다. 게임의 프로그램 폴더에 대한 무제한 액세스 권한이 있으므로 관리자가 게임을 패치하는 것은 간단한 프로세스입니다. 반대로, 액세스 제한으로 인해 최소 권한의 사용자가 게임을 패치하는 것은 불가능하지는 않지만 전통적으로 어려웠습니다. 이제 최소 권한의 사용자 계정 패치를 가능하게 하기 위해 Windows Installer가 향상되었습니다. 이 기능을 활용하기 위해 게임은 설치 및 패치에 Windows 설치 관리자를 활용하는 것이 좋습니다.

Windows Installer 3.0부터 특정 조건이 충족될 때 최소 권한의 사용자가 애플리케이션 패치를 적용할 수 있습니다. 이러한 조건은 다음과 같습니다.

  • 애플리케이션은 Windows Installer 3.0을 사용하여 설치되었습니다.
  • 애플리케이션은 원래 컴퓨터별로 설치되었습니다.
  • 애플리케이션은 CD-ROM 또는 DVD(디지털 비디오 디스크)와 같은 이동식 미디어에서 설치됩니다.
  • 패치는 원래 설치 관리자 패키지(.msi 파일)로 식별되는 인증서로 디지털 서명됩니다.
  • 패치는 디지털 서명에 대해 유효성을 검사할 수 있습니다.
  • 원래 설치 관리자 패키지는 최소 권한의 사용자 계정 패치를 사용하지 않도록 설정하지 않았습니다.
  • 시스템 관리자가 시스템 정책을 통해 최소 권한의 사용자 계정 패치를 사용하지 않도록 설정하지 않았습니다.

일반적으로 최소 권한의 사용자는 게임의 프로그램 파일을 수정할 수 없습니다. 그러나 위의 조건이 충족되고 LUA 패치를 사용하는 경우 Windows 설치 관리자는 사용자가 최신 버전을 가져오도록 게임 파일을 업데이트할 수 있습니다.

참고

이 문서에 포함된 정보는 시험판 소프트웨어 제품과 관련이 있으며, 이는 첫 번째 상용 릴리스 전에 실질적으로 수정될 수 있습니다. 따라서 이 정보는 처음 상업적으로 출시될 때 소프트웨어 제품을 정확하게 설명하거나 반영하지 않을 수 있습니다. 이 문서는 정보 제공 목적으로만 제공되며 Microsoft는 이 문서 또는 이 문서에 포함된 정보와 관련하여 명시적이거나 묵시적인 보증을 하지 않습니다.