Windows XP および Windows Vista でのゲーム ソフトウェアの修正プログラムの適用
XNA デベロッパー コネクション (XDC)
2006 年 4 月
はじめに
Windows Vista には、オペレーティング システムのセキュリティ保護を強化する機能が数多く追加されています。セキュリティが強化されたということは、ソフトウェアへの修正プログラムの適用が、従来ほど単純ではないということを意味しています。ここでは、Windows Vista および Windows XP での効果的な修正プログラムの適用方法をいくつか検討します。
修正プログラムが必要なゲームは、主に次の 2 つのカテゴリに分かれます。
- 大多数のオフライン ゲームなど、ごくたまに修正プログラムが必要とされるゲーム
- 大多数のオンライン ゲームなど、頻繁に修正プログラムが必要とされるゲーム
ここでは、Windows Vista ユーザー アカウント制御 (UAC) についても簡単に紹介します。これは特権に関するバックグラウンドとして機能します。開発者は、Windows Vista のユーザーはこの特権を所有していると想定することができます。
Windows Vista ユーザー アカウント制御
Windows Vista には、主に 2 種類のユーザー アカウントがあります。標準ユーザーと管理者です。標準ユーザー アカウントには、アクセス制限がいくつかあります。たとえば、%SystemDrive%\Program Files のファイル システムや、HKEY_LOCAL_MACHINE のレジストリにはデータを書き込むことができません。これは、ゲームが読み取り専用の場所にインストールされている場合の、そのゲームへの修正プログラムの適用にも関係します。Windows XP とは異なり、標準ユーザーのアカウントは、Windows Vista ではより一般的になります。標準ユーザーの種類のアカウントは、保護者による制限のような、オペレーティング システムの重要機能にも必要です。Windows Vista の保護者による制限では、子供のアカウントは標準ユーザーにすることが必要です。子供のアカウントをゲーム 1 つでも管理者に昇格すると、保護者による制限は他のすべてのゲームに対して機能しなくなります。したがって、ゲームは標準ユーザー用に設計することが重要です。
Windows Vista では、従来の特権モデルを変更して、ユーザーが意図または承認しない操作を実行しようとするプログラムを、ユーザーが実行できないようにします。そのため、ユーザー アカウント制御 (以前は最小特権ユーザー アカウント (LUA) と呼ばれていました) を使用することで、ユーザーはほとんどの時間を低い特権で実行でき、必要に応じてより高い特権が必要なアプリケーションを簡単に実行できます。これは、標準ユーザー アカウントと管理者アカウントはどちらも、標準ユーザー特権でアプリケーションを実行しますが、昇格された特権をアプリケーションに付与できるのは管理者アカウントのみ、ということです。オペレーティング システムは、昇格された特権でアプリケーションを実行する前に、管理者アカウントを持つユーザーに明示的な同意を要求します。管理者特権が必要なプログラムが標準ユーザー アカウントで実行されると、管理者の承認を求めるプロンプトが表示されます。
ごくたまに修正プログラムが必要とされるゲーム
一部のゲームでは、ライフサイクルを通じて数回のみ修正プログラムが必要となります。こうした頻度で修正プログラムを適用する場合には、Windows インストーラー パッケージで修正プログラムを配布する方法 (通常は管理者権限が不要) か、ゲーム ファイルを直接変更するその他の種類の配布形態を使用する方法の 2 つを使用できます。
注 ゲームで必要とされる修正プログラム適用の頻度にかかわらず、アプリケーションでは通常、インストールまたは削除に管理者特権が必要です。
方式 1: 頻度の低い修正プログラム適用に Windows インストーラーを使用
この方式では、パッケージ (.msi ファイル) のインストールに Windows インストーラーを使用し、Windows インストーラー修正プログラム (.msp ファイル) は、修正プログラムをインストールするために配布されます。パッケージには MsiPatchCertificate テーブルが必要であり、修正プログラムはこのテーブルの証明書でデジタル署名されている必要があります。デジタル署名の詳細については、「ゲーム開発者のための Authenticode 署名」を参照してください。
この修正プログラム適用方法の詳細および要件については、次の Windows インストーラーのドキュメントを参照してください。
- Patching and Upgrades (修正プログラムとアップグレード)
- User Account Control (UAC) Patching (ユーザー アカウント制御 (UAC) での修正プログラム適用)
この方式では、Windows XP でゲームがリムーバブル メディアからインストールされていない場合、修正プログラムの適用には管理者特権が必要となるというデメリットがあります。ただし、Windows XP ではほとんどのユーザーが管理者であり、リムーバブル メディアからインストールされたソフトウェアに対する制限は Windows Vista にはないので、これで制限が強すぎるということはないと考えられます。
この方式の主な利点は、昇格された権限についてのプロンプトや承認を必要とせずに、標準ユーザー アカウントで修正プログラムを適用できることです。この方式では、ゲームをプレイするために、標準ユーザー アカウントを持つユーザーが管理者アカウントを持つユーザーに修正プログラムのインストールを頼んだり、標準ユーザー アカウントに永続的な管理者特権を与えたりする必要がないので、ユーザー エクスペリエンスが向上します。
この方式は、修正プログラムの頻繁な適用が必要なゲームにも使用できますが、ビルドの統合や多数ファイルのサポートに関する Windows インストール パッケージのオーバーヘッドがあるため、これ以外の方式に比べて望ましくない可能性があります。
方式 2: 修正プログラムの適用に管理者権限が必要
この方式では、修正プログラムを適用する実行可能ファイルの実行に、管理者権限が必要です。修正プログラムを適用する実行可能ファイルに管理者権限がある場合、このファイルが %SystemDrive%\Program Files にあるゲーム ファイルを直接変更できます。
この方式のメリットは、単純さです。ただし、この方式は、ゲームに修正プログラムを頻繁に適用する必要がある場合は不向きです。なぜなら、標準ユーザー アカウントを持つユーザーが、大規模なマルチプレイヤー オンライン ゲームのような、修正プログラムを頻繁に適用する必要があるゲームをプレイしようとする場合、そのユーザーには選択肢が 2 つあります。
- 管理者にログオンしてもらい、ゲームに修正プログラムを適用してもらいます。両者にとって不便な可能性があります。
- アカウントを永続的に管理者権限に昇格してもらいます。
注 後者の解決策は、システム全体のセキュリティを弱体化するだけでなく、保護者による制限などの重要な機能の動作を妨げます。
この方式を実行する際、修正プログラムを適用する実行可能ファイルは、ゲームの実行可能ファイルとは別のファイルである必要があります。修正プログラム適用の実行可能ファイルのマニフェストでは、requestedExecutionLevel の requireAdministrator を指定して、管理者権限が必要なアプリケーションとして表す必要があります。この方法の詳細については、「アプリケーション マニフェスト スキーマ」の Developer Best Practices and Guidelines for Applications in a Least Privileged Environment (最小特権環境のアプリケーションに関する開発者のベスト プラクティスとガイドライン) を参照してください。
総体的には、使用期間中に修正プログラムを数回だけ適用する必要があるゲームには、方式 1 が妥当です。
頻繁に修正プログラムが必要とされるゲーム
多くのインターネットベースのゲームは絶えず進歩しており、通常は定期的に修正プログラムを適用する必要があります。こうしたゲームでは、次のトピックで説明するように、修正プログラムをユーザーごとまたはコンピューターごとに適用できます。その他に可能な解決策には、%SystemDrive%\Program Files を保護する ACL を変更したり、カスタム サービスを作成したりする方法があります。
方式 3: ユーザーごとのインストール
推奨される簡単な方法の 1 つは、ローカル アプリケーション データ フォルダーのユーザーごとのサブフォルダーにゲーム全体をインストールすることです。これは、CSIDL_LOCAL_APPDATA を指定して SHGetFolderPath を呼び出すと見つかります。パスの例は C:\Documents and Settings\user_name\Local Settings\Application Data\ExampleGame です。こうした場所では、標準ユーザーの権限で実行しているアプリケーションで、ゲーム ファイルを直接変更できます。
ただし、コンピューターに複数のユーザーがいて、各ユーザーがそのゲームのコピーをインストールしており、それぞれのユーザーが修正プログラムをダウンロードして適用する必要がある場合、この方法にはデメリットがあります。この方法では、ユーザーの時間とディスク領域を無駄にするだけでなく、修正プログラムを提供するサーバーへのネットワーク帯域幅の使用量が増加します。また、標準ユーザー特権があるすべてのアプリケーションがゲームを変更できるので、ゲームの実行可能ファイルの保護が弱まります。これが許容範囲内に入るかどうかを判断するのは、ゲームの製造元次第です。
方式 4: コンピューターごとの共通の場所にインストール
もう 1 つの方法は、実行可能でないゲーム データを SHGetFolderPath CSIDL_COMMON_APPDATA で指定されたパスのサブディレクトリにインストールすることです。パスの例は、C:\Documents and Settings\All Users\Application Data\ExampleGame です。これはすべてのユーザーの共有の場所であり、標準ユーザー権限で実行するアプリケーションで変更できます。この方法では、複数のアカウントでゲームをプレイする場合に、大規模な修正プログラムを再適用する必要性が最小限に抑えられます。ゲームの実行可能ファイルは %SystemDrive%\Programs Files に保存して、システムの別のアカウントに対するリスクを最小化します。この場所は標準ユーザー権限を持つプログラムまたはユーザーにより変更される可能性があるので、実行可能ファイルでは、共有ディレクトリの新しいコンテンツの整合性を検証する必要があります。MapFileAndCheckSum を使用して、ファイルのチェックサムを計算することを検討してください。
この方法には、Windows XP と Windows Vista の両方で同じように効果的に動作し、管理者権限が必要ないという利点があります。
その他の可能性
既に説明した方式の他にも、標準ユーザー権限で実行する際にも修正プログラム適用ツールがゲームのファイルに直接書き込めるように、インストール時に %SystemDrive%\Program Files\Game Folder\ の ACL を変更するという方法も考えられます。この方法は難しくはありませんが、ゲームのファイルに対してシステムから提供されるセキュリティ保護をバイパスし、悪質なプログラムがディレクトリの内容を変更する機会を与えてしまいます。この方法はお勧めできません。代わりに別の方法を使用することを強くお勧めします。
最後に、カスタム サービスを記述するという方法も考えられます。一般的に、カスタム サービスを記述してゲームに修正プログラムを適用するのは、複雑でエラーが発生しやすいため、あまり良い考えではありません。ここで説明した別の方法を使用して、修正プログラムの適用を行うことをお勧めします。ただし、ごまかし行為や著作権侵害の対策と組み合わせる場合は、カスタム サービスが必要となる場合があります。こうしたサービスでは、多数のゲームをサポートする必要があり、また、修正プログラム ファイルのダウンロードのみを行い、対象となるゲームのインストール ディレクトリにのみ書き込めるように設計する必要があります。サービスは小規模に、外部からのアクセスを受ける攻撃を受けやすい領域を最小限にし、さらに、ゲームを実行していないときは使用するシステム リソースをできるだけ少なくすることが重要です。
まとめ
どの方式を実装するかを判断するのは、最終的にはユーザーです。自分にとって重要な要素を秤にかける必要があります。セキュリティ、修正プログラム適用の頻度、顧客にとっての使いやすさ、実装に必要なワークロード、ソリューションの複雑さ、およびプラットフォーム機能の準拠は、特定の方式に決定する前に、各開発者が考慮しなければならない要因です。
Windows Vista でのユーザー アカウント保護の詳細については、Developer Best Practices and Guidelines for Applications in a Least-Privileged Environment (最小特権環境のアプリケーションに関する開発者のベスト プラクティスとガイドライン) を参照してください。