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

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

はじめに

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

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

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

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

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

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

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

 

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

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

これは、\Program Files に保存ゲームを配置するのではなく、\My Documents のサブフォルダーに移動する必要があることを意味します。 また、一時アプリケーション データを \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: ユーザーが表示または変更する必要があるファイル

一般的な例は、ユーザーの保存されたゲーム ファイルです。 ユーザーが簡単に表示できるように、ユーザーのドキュメント フォルダーにファイルを格納します。 アプリケーションは、次のコード例に示すように、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レジストリ ハイブ ルートを列挙することです。 HKEY_USERS の各サブキーは、システム上の特定のユーザーのHKEY_CURRENT_USERハイブに対応します。 HKEY_USERS列挙し、各サブキーの下にあるゲーム固有の情報を削除することで、アンインストーラーは情報が残らないようにすることができます。

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

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

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

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

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

Note

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