最小特権ユーザー アカウントを使用するゲーム
ソフトウェア デザイン エンジニア、Jack Lin 著
Microsoft Corporation
2004 年 12 月
はじめに
この記事では、最小特権ユーザー アカウント (制限付きユーザー アカウントとも呼ばれます) で適切に動作する Microsoft Windows ゲームを作成する方法について説明します。
目次
- 最小特権ユーザー アカウントでのファイル アクセス
- 最小特権ユーザー アカウントでのレジストリへのアクセス
- 最小特権ユーザー アカウントでの修正プログラムの適用
Windows ではユーザーがアカウントで管理されます。現在では、家庭のコンピューター ユーザーの 80% 以上が、コンピューターを家族で共有しています。Windows コンピューターを複数のユーザーで共有する場合は、複数のユーザー アカウントが作成され、各ユーザーが個別のアカウントでログインしてコンピューターにアクセスします。セキュリティへの意識が高まる中、システムを完全に制御できない最小特権ユーザー アカウント (制限付きユーザー アカウントとも呼ばれます) でコンピューターを操作する人が増えています。一般に、管理者アカウントはコンピューターのあらゆる部分に無制限にアクセスできます。このことが Windows ベースのゲームの動作に影響する場合があります。
ゲーム開発者にとって、最小特権ユーザー アカウントで動作するようにゲームを作成することには、さらに利点があります。近日リリースされる Windows Server 2008 では、最小特権ユーザー アカウントが適用されます。つまり、ローカル管理者を除くシステムのすべてのアカウントが最小特権ユーザー アカウントとなります。このことは、ガイドラインに従っていないゲーム (レガシー アプリケーション) の Windows Server 2008 での動作に影響します。たとえば、アプリケーションがアクセス許可を持たないフォルダーやレジストリ値に書き込もうとすると、そのファイル書き込みがユーザーの仮想ファイル ストアにリダイレクトされます。この仮想ファイル ストアは、ユーザーが書き込みアクセス権を持つフォルダーに配置されます。この動作は、書き込みが完全に失敗することに比べると深刻ではないように思われますが、アプリケーションで仮想ファイルを作成すると、ファイルがユーザーの予期する場所に書き込まれないためにユーザーが混乱する可能性があります。たとえば、ハイ スコア ファイルを実行可能フォルダーに書き込むゲームでは、ハイ スコア ファイルが仮想フォルダーに書き込まれます。その結果、すべてのユーザーが仮想ファイル ストアを個別に持つことになるため、各ユーザーは別のユーザーが達成したハイ スコアを見ることができません。
このドキュメントのガイドラインに従うゲームは、最小特権ユーザー アカウントで実行されることになるため、Windows Server 2008 との互換性が維持されます。
最小特権ユーザー アカウントでのファイル アクセス
Windows では FAT32 と NTFS の 2 つのファイル システムがサポートされています。FAT32 は、下位互換性を確保するためにのみサポートされているレガシー ファイル システムです。NTFS はより強力で堅牢なファイルのアクセス許可をサポートします。NTFS でパーティション分割されたハード ドライブに Windows がプリインストールされた新しいコンピューターを小売業者が販売するようになり、NTFS の使用が拡大しています。NTFS ベースの Windows XP システムでは、最小特権ユーザー アカウントを持つユーザーにはいくつかのフォルダーに対して限られたアクセス権しか与えられません。一方、FAT32 ベースの Windows XP システムでは、このユーザーに完全なアクセス権が与えられます。
次の表に、各種フォルダーの既定の場所とそのアクセス許可を示します。
Path | フォルダーの内容 | Read | Write | 作成/削除 |
---|---|---|---|---|
<ドライブ>:\Windows | Windows オペレーティング システム | x | ||
<ドライブ>:\Program Files | 実行可能なアプリケーション ファイル | x | ||
<ドライブ>:\Documents and Settings\Username* | 各ユーザーのファイル | x | x | x |
<ドライブ>:\Documents and Settings\All Users | 全ユーザーのファイル | x | x | x |
* Username はユーザーのログイン名です。
最小特権ユーザー アカウントでは、Documents and Settings\Username または Documents and Settings\All Users フォルダーで、ファイルの読み取り、書き込み、作成、および削除を実行できます。
つまり、セーブ データは \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
https://msdn2.microsoft.com/en-us/library/bb762181.aspx( 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
https://msdn2.microsoft.com/en-us/library/bb762181.aspx( 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];
https://msdn2.microsoft.com/en-us/library/bb762181.aspx( 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 人のユーザーのみがダウンロードする必要があります。このシナリオでは、次のコードに示すように、共有プロファイル フォルダーの下のドキュメント フォルダーを使用します。
#include <shlobj.h>
#include <strsafe.h>
#define APPNAME L"MyApp"
WCHAR wszPath[MAX_PATH];
https://msdn2.microsoft.com/en-us/library/bb762181.aspx( 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
最小特権ユーザー アカウントでのレジストリへのアクセス
アプリケーションで 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 で関連情報を削除するだけでは、他のユーザーの値が残ったままとなります。レジストリ内のユーザー単位の情報を削除するには、HKEY_USERS レジストリ ハイブ ルートを列挙するのが 1 つの方法です。HKEY_USERS の下の各サブキーは、システム上の各ユーザーの HKEY_CURRENT_USER ハイブに対応します。HKEY_USERS を列挙し、各サブキーの下にあるゲーム固有の情報を削除することで、アンインストーラーで確実にすべての情報を削除できます。
最小特権ユーザー アカウントでの修正プログラムの適用
ゲームの修正プログラムでは、ゲームのファイルが更新されます。このため、通常はゲームのプログラム フォルダーへの書き込みアクセス権が必要となります。管理者がゲームに修正プログラムを適用するのであれば、そのプロセスは簡単です。管理者はゲームのプログラム フォルダーに無制限にアクセスできるからです。一方、最小特権ユーザーがゲームに修正プログラムを適用することは、アクセス上の制限のために、従来より不可能ではありませんが困難でした。現在は、Windows インストーラーの機能が拡張されて、最小特権ユーザー アカウントによる修正プログラムの適用が可能となりました。この機能を利用できるように、ゲームでは Windows インストーラーを使用することをお勧めします。
Windows インストーラー 3.0 より、一定の条件を満たしていれば、最小特権ユーザーがアプリケーションの修正プログラムを適用できるようになりました。その条件とは次のとおりです。
- アプリケーションが Windows インストーラー 3.0 を使用してインストールされていること。
- アプリケーションが最初にコンピューター単位でインストールされていること。
- アプリケーションが CD-ROM や DVD (デジタル ビデオ ディスク) などのリムーバブル メディアからインストールされていること。
- 修正プログラムが、オリジナル インストーラー パッケージ (.msi ファイル) で識別される証明書でデジタル署名されていること。
- 修正プログラムをデジタル署名と照合して検証できること。
- オリジナル インストーラー パッケージで最小特権ユーザー アカウントによる修正プログラムの適用が無効になっていないこと。
- システム管理者がシステム ポリシーで最小特権ユーザー アカウントによる修正プログラムの適用を無効にしていないこと。
通常は、最小特権ユーザーがゲームのプログラム ファイルを変更することはできません。ただし、上記の条件が満たされ、かつ最小特権ユーザー アカウントによる修正プログラムの適用が有効になっていれば、Windows インストーラーでゲームのファイルを更新して、ユーザーに最新バージョンを提供できます。
注
このドキュメントに記載されている情報は、リリース前のソフトウェア製品に関連するものであり、製品が最初にリリースされる前に実質的に変更されることがあります。したがって、製品が最初にリリースされる時点では、この情報が製品を正確に記述または反映していない可能性があります。このドキュメントは情報提供のみを目的としており、マイクロソフトでは、このドキュメントおよびその内容に関して、明示的か暗黙的かを問わず、一切の保証を行いません。