ユーザー アカウントLeast-Privilegedゲーム

この記事では、ゲーム開発者が、最小特権のユーザー アカウント (制限付きユーザー アカウントとも呼ばれる) でうまく機能する Microsoft Windows ゲームを作成する方法について説明します。

はじめに

Windowsアカウントを使用してユーザーを管理します。 現在、自宅のコンピューター ユーザーの 80% 以上が、自分のコンピューターを他の家族と共有しています。 複数のユーザーが 1 Windowsコンピューターを共有すると、複数のユーザー アカウントが作成され、各ユーザーは個々のアカウントでログインしてコンピューターにアクセスします。 セキュリティに対する認識が高まり、システムを完全に制御できない、最も特権の少ないユーザー アカウント (制限付きユーザー アカウントとも呼ばれる) を使用してコンピューターを操作するユーザーが増えています。 管理者アカウントは、通常、コンピューターのすべての部分に無制限にアクセスできます。 これは、システム ベースのWindows動作に影響する可能性があります。

ゲームを作成して最小特権のユーザー アカウントを操作するゲーム開発者には、追加の利点があります。 Vista Windows以降では、最小特権のユーザー アカウントが適用されます。つまり、ローカル管理者を除く、システム上のすべてのアカウントが最小特権のユーザー アカウントです。 これは、ガイドライン (レガシ アプリケーション) に従ってないゲームが Windows Vista 以降で実行される方法に影響します。 たとえば、アプリケーションがアクセス許可を持たないフォルダーまたはレジストリ値への書き込みを試みる場合、ファイルの書き込みはユーザーの仮想ファイル ストアにリダイレクトされます。 この仮想ファイル ストアは、ユーザーが書き込みアクセス権を持つフォルダーに存在します。 この動作は、書き込み試行が完全に失敗するほど致命的とは思えない可能性があります。ただし、仮想化されたファイルを作成するアプリケーションでは、ユーザーが期待する場所にファイルが書き込まれるため、ユーザーを混乱させる可能性があります。 たとえば、ハイ スコア ファイルを実行可能フォルダーと同じフォルダーに書き込むゲームでは、代わりにこれらのファイルが仮想化されたフォルダーに書き込みされます。 そのため、すべてのユーザーが個別の仮想化ファイル ストアを持つため、あるユーザーは別のユーザーが達成した高いスコアを確認できません。

この記事のガイドラインに従うゲームは、最小特権のユーザー アカウントで実行されます。その結果、Windows Vista 以降との互換性が維持されます。

ユーザー アカウントのLeast-Privilegedアクセス

Windows、FAT32 と NTFS の 2 つのファイル システムがサポートされています。 FAT32 は、下位互換性のためにのみサポートされるレガシ ファイル システムです。NTFS では、より強力で堅牢なファイルアクセス許可がサポートされています。 NTFS の使用は、小売業者が NTFS でパーティション分割されたハード ドライブにWindowsされた新しいコンピューターを出荷する場合に拡大しています。 NTFS ベースの WINDOWS XP システムでは、最も特権の少ないユーザー アカウントを持つユーザーは、複数のフォルダーへのアクセスが制限されています。 ただし、FAT32 ベースの XP システムで完全Windowsアクセスできます。

次の表に、これらのフォルダーの既定の場所とそのアクセス許可を示します。

パス フォルダーの内容 Read Write 作成/削除
<ドライブ > : \ Windows Windows オペレーティング システム X
<ドライブ > : \ プログラム ファイル 実行可能なアプリケーション ファイル X
<ドライブ > : \ ドキュメントと設定 \ ユーザー名* 各ユーザーのファイル X X X
<ドライブ > : \ ドキュメントと設定 \ すべてのユーザー すべてのユーザー ファイル X X X

* ユーザー名は、ユーザーのログイン名です。

最小特権のユーザー アカウントでは、いずれかのフォルダーにファイルを読み取り、書き込み、作成、および削除できます:ドキュメントと 設定 ユーザー名またはドキュメントと 設定 すべてのユーザー。 \ \

つまり、保存ゲームを Program Files に配置するのではなく、ファイル内のサブフォルダーに配置 \ \ マイ ドキュメント。 また、Program Files または マイ ドキュメント に一時的なアプリケーション データを配置するのではなく、アプリケーション データ フォルダー \ \ (CSIDL LOCAL APPDATA) に配置する _ _ 必要があります。

具体的には、各ゲームで処理する必要がある 2 つのシナリオがあります。

シナリオ 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: ユーザーが表示または変更する必要があるファイル

一般的な例は、ユーザーの保存されたゲーム ファイルです。 ユーザーが簡単に見えるように、ファイルをユーザーのドキュメント フォルダーに格納します。 次のコード例に示すように、アプリケーションは 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

ゲームでは、すべてのユーザーが表示して使用することを意図したファイルを格納する必要がある場合があります。 1 つの例として、すべてのユーザーが同じレコード ファイルに書き込み、各ユーザーに対して個別のハイ スコアではなく、システム全体でハイ スコアが維持されるハイ スコア レコードがあります。 その他の例としては、ダウンロードされたマップ、ミッション、ゲームの変更があります。 これらが共有されている場合は、すべてのユーザーではなく、1 人のユーザーだけがダウンロードする必要があります。 このシナリオでは、次のコードに示す共有プロファイル フォルダーの下の document フォルダーを使用します。

#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 に書き込むと、他のユーザー _ _ が情報を使用できません。 インストール中にレジストリに書き込まれる情報が、プログラムのすべてのユーザーに適用される構成と既定の設定なので、これは通常は問題ではありません。

ゲームをアンインストールする場合は、ゲームがレジストリに書き込んだすべての値を削除するために、追加の作業が必要です。 アンインストーラーは 1 人 (通常は管理者) によって実行されるので、HKEY LOCAL MACHINE と HKEY CURRENT USER で関連情報を削除するだけでは、他のユーザーの値 _ _ _ _ は削除されません。 レジストリ内のユーザーごとの情報を削除する方法の 1 つは、HKEY USERS レジストリ ハイブ ルート _ を列挙する方法です。 HKEY USERS の下の各サブキーは、システム上の特定のユーザーの _ HKEY _ CURRENT USER _ ハイブに対応します。 HKEY USERS を列挙し、各サブキーの下にあるゲーム固有の情報を削除することで、アンインストーラーは情報が残っていない _ か確認できます。

ユーザー アカウントのLeast-Privileged適用

ゲームに修正プログラムを適用するには、ゲームのファイルを更新する必要があります。 そのため、通常、ゲームのプログラム フォルダーへの書き込みアクセスが必要です。 ゲームに修正プログラムを適用すると、管理者がゲームのプログラム フォルダーに無制限にアクセスすることができるため、簡単なプロセスになります。 逆に、これまでは、アクセス制限のために、最も特権の少ないユーザーがゲームにパッチを適用することは、不可能ではない場合でも困難でした。 現在、Windowsインストーラーが強化され、最小特権のユーザー アカウントの修正プログラムの適用が可能になります。 この機能を利用するには、インストールと修正プログラムの適用に Windows インストーラーを利用する必要があります。

Windows Installer 3.0 から、特定の条件が満たされた場合に、最も特権の少ないユーザーがアプリケーションパッチを適用できます。 これらの条件は次のとおりです。

  • アプリケーションは、インストーラー 3.0 Windows使用してインストールされました。
  • アプリケーションは、最初はコンピューターごとにインストールされました。
  • アプリケーションは、CD-ROM やデジタルビデオディスク (DVD) などのリムーバブルメディアからインストールされます。
  • 修正プログラムは、元のインストーラーパッケージ (.msi ファイル) で識別される証明書によってデジタル署名されています。
  • 修正プログラムは、デジタル署名に対して検証できます。
  • 元のインストーラーパッケージでは、最小限の特権を持つユーザーアカウントの修正プログラムが無効にされていません。
  • システム管理者は、システムポリシーを使用して、最小限の特権を持つユーザーアカウントに修正プログラムを適用できませんでした。

通常、最小限の特権を持つユーザーがゲームのプログラムファイルを変更することはできません。 ただし、上記の条件が満たされ、LUA 修正プログラムが有効になっている場合、Windows インストーラーは、ユーザーが最新バージョンを取得できるように、ゲームのファイルを更新できます。

注意

この記事に記載されている情報はプレリリースソフトウェア製品に関連しており、最初の商用リリースの前に大幅に変更される可能性があります。 この情報は、最初の販売時にソフトウェア製品を正確に説明したり、反映したりすることはできません。 この記事は、情報提供のみを目的として提供されています。マイクロソフトは、この記事またはこの記事に含まれている情報に関して、明示または黙示について一切の保証を行いません。