Least-Privileged ユーザー アカウントを使用したゲーム

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

はじめに

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

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

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

Least-Privileged ユーザー アカウントのファイル アクセス

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

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

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

 

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

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

つまり、セーブ データは \Program Files に配置しないでください。代わりに、[マイ ドキュメント] のサブフォルダーに移動する必要があります。 また、一時アプリケーション データは \Program Files または \My Documents に配置しないでください。代わりに、アプリケーション データ フォルダー (CSIDL_LOCAL_APPDATA) に配置する必要があります。

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

シナリオ 1: ユーザーが表示または変更する必要がないファイル

一般的な例として、ゲームの構成ファイル、一時ファイル、ゲーム キャッシュ ファイルがあります。 通常、これらのファイルはアプリケーション データ フォルダーに保持されます。 このフォルダー パスを取得するには、次のコード例に示すように、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

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

#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レジストリ Hive ルートを列挙する方法です。 HKEY_USERS下の各サブキーは、システム上の特定のユーザーのHKEY_CURRENT_USER ハイブに対応します。 HKEY_USERS列挙し、各サブキーの下にあるゲーム固有の情報を削除することで、アンインストーラーは情報が残らないようにすることができます。

Least-Privileged ユーザー アカウントを使用した修正プログラムの適用

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

Windows インストーラー 3.0 以降では、特定の条件が満たされたときに、最小限の特権を持つユーザーがアプリケーションパッチを適用できます。 これらの条件は次のとおりです。

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

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

Note

この記事に含まれる情報は、プレリリースソフトウェア製品に関連しており、最初の商用リリースの前に大幅に変更される可能性があります。 したがって、情報は、最初に商用リリースされたときにソフトウェア製品を正確に説明または反映していない可能性があります。 この記事は情報提供のみを目的として提供されており、Microsoft は、この記事またはそれに含まれる情報に関して、明示または黙示を問わず、いかなる保証も行いません。