2008年7月18日金曜日

.NET Vista対応 その1

ユーザーアカウント制御(UAC:User Account Control)について


Vistaには、“管理者”と“標準ユーザ”が存在し、UACではたとえ管理者権限でログインしていても標準ユーザ権限しか与えられていません。
そのためアプリケーションのインストールやシステム設定の変更を行うプログラムを実行するたびに警告画面が表示され、ユーザーの許可を求めるようになります。
このとき管理者権限でログインしていれば許可することで権限が管理者に昇格し、プログラムを実行できます。
標準ユーザでログインしていれば、管理者ユーザのパスワードを求められます。
これにより、ユーザーが知らない間に悪意のあるソフトウェアをインストールされたり、システム設定を変更されることを防止できるようになります。


既存アプリの影響


Vistaでは,「%ProgramFiles%」「%WinDir%」フォルダへの書き込み、レジストリ・キー「HKEY_LOCAL_MACHINE\Software」への書き込みを制限しています。
既存アプリで上記のフォルダやレジストリに書き込みをしているアプリケーションは注意が必要です。

UACでは制限フォルダへの書き込みを行っているプログラムがVistaでも正常に動作するように、別の安全なフォルダへリダイレクトし、そのフォルダへ書き込みを行います。
「%ProgramFiles%」「%WinDir%」へのアクセスは、「%LoadlAppData%\VirtualStore」にリダイレクトされます。
レジストリ「HKEY_LOCAL_MACHINE\Software」以下へのアクセスは,「HKEY_CURRENT_USER\Software\Classes\VirtualStore\Machine\Software」にリダイレクトされます。

制限フォルダから読み込みは、UACにより制限されていませんが、
UACはまずリダイレクト先を見に行き、該当ファイルがある場合はそのファイルを読み込みます。
リダイレクト先に該当ファイルがない場合は、制限フォルダから該当ファイルを読み込みます。


具体例
1、
ユーザAがC:/Program Filesにファイルを作成し書き込みを行う。
実際にはリダイレクト先(C:/ユーザー/ユーザA/AppData/Local/VirtualStore/Program Files)にファイルが作成される。

2、
ユーザAがC:/Program Filesから1で作成したファイルを読み込む。
実際にはリダイレクト先(C:/ユーザー/ユーザA/AppData/Local/VirtualStore/Program Files)よりファイルが読み込まれる。

ここで「一見」正常に動作しているように思えてしまいます。
ところが

3、
ユーザBがC:/Program FilesからユーザAが1で作った(つもり)のファイルを読み込もうとします。
まずリダイレクト先(C:/ユーザー/ユーザB/AppData/Local/VirtualStore/Program Files)にファイルを探しに行きます。
リダイレクト先にはファイルはありませんので、C:/Program Filesを探しに行きますが、もちろんここにもファイルはありません。


問題が起こるのはユーザ間でファイルを共有する場合です。


UACの対応


■対応方法その1 UACを無効にしてしまう
かなり強硬手段ですが、UACの機能を無効にしてしまえばこんな問題も起こらないわけです。
制限フォルダへの書き込みも自由です。お勧めはしませんが。

UAC機能はデフォルトではオンになっています。
これを無効にするには、[コントロール パネル]で[ユーザー アカウント]を表示し「ユーザーアカウントの有効化または無効化」をクリックします。
「ユーザーアカウント制御(UAC)を使ってコンピュータの保護に役立たせる」のチェックをOFFにします。


■対応方法その2 プログラムのプロパティでに管理者権限を与える
制限フォルダへの書き込みは、管理者権限での許可が必要です。
まずプログラム自体に「管理者権限が必要ですよ」と設定します。

プログラムのexeのプロパティより「互換性」タブの「特権レベル 管理者としてこのプログラムを実行」をチェックONにします。

プログラムを実行すると、管理者権限でログインしている場合は許可を求めるダイアログが表示されます。
標準ユーザでログインしている場合は、管理者アカウントのパスワードを求められます。


■対応方法その3 マニフェストファイルを使用する
方法その2の代わりにマニフェストとよばれる外部ファイルで「管理者権限が必要ですよ」と設定します。
Vista対応 その2 マニフェストファイルを使用するには?
Vista対応 その5 ビルド時にマニフェストファイルを埋め込む


プログラムを実行すると、管理者権限でログインしている場合は許可を求めるダイアログが表示されます。
標準ユーザでログインしている場合は、管理者アカウントのパスワードを求められます。



ここでもまた問題が発生します。
管理者権限ユーザと標準ユーザがファイルを共有するには、%Program Files%といった制限フォルダは使えません。
標準ユーザが制限フォルダに書き込むためには管理者権限アカウントのパスワードを求められるからです。



すべてのユーザで共有するファイルの保存場所


Vistaではすべてのユーザで共有するファイルはどこに保存すればいいのでしょうか?

■対応方法その1 仕様を見直す
そもそもすべてのユーザで共有しなければ、なにも問題はおこらないのです。
可能なら仕様を見直しましょう。



■対応方法その2 パブリックフォルダでファイルを共有する
Vistaでは「C:/ユーザ/パブリック」フォルダというファイルを共有するためのフォルダが用意されています。
Vista対応 その3 パブリックフォルダでファイルを共有する


■対応方法その3 任意のフォルダでファイルを共有する
たとえばCommonApplicationDataフォルダ(Vistaでは「C:/ProgramData」、XPでは「C:\Documents and Settings\All Users\Application Data」)でファイルを共有します。
Vista対応 その4 任意のフォルダでファイルを共有する


許可ダイアログの表示を最小限にする


基本的にはインストーラを除くプログラムから制限フォルダへの書き込みは行わないようにしますが、どうしても制限フォルダに書き込みを行いたい場合があります。
制限フォルダに書き込みを行う場合、埋め込みマニフェストを使用して管理者権限で実行することを明示しますが、かならず許可を求めるダイアログが表示されます。

このような場合は制限フォルダへの書き込み部分を別のexeとし、このexeに対してのみ管理者権限用マニフェストを埋め込みます。他のexeは一般権限用マニフェストを埋め込みます。こうすることで許可ダイアログの表示を最小限に抑えることができます。


Vista対応 まとめ


1、プログラムは埋め込みマニフェストを使用する。
2、管理者権限を必要とするプログラムは、別のプログラムにわけることで許可ダイアログの表示を最小限にする。
3、すべてのユーザで共有するファイルがある場合、インストーラでCommonApplicationDataフォルダにアプリケーション用のデータフォルダを作成し、カスタム動作でアクセス権限を変更する。

0 件のコメント: