Windows VistaからUAC(ユーザーアカウント制御、User Account Control)が導入されました。このUACが有効になっていると、Windows XPでは正常に機能していたアプリケーションでも問題が発生する場合があります。例えば、ファイルを作成しようとしたり、レジストリに書き込もうとすると、エラーが発生することがあります。
具体的には、以下のようなケースで問題が発生します。
特定のフォルダにファイルを作成しようとすると、例外UnauthorizedAccessExceptionが発生します。例外が発生しなくても、指定したフォルダにファイルが作成されず、「仮想化(Virtualization)」と呼ばれる機能によって、「仮想ストア(VirtualStore)」と呼ばれる別のフォルダ(「C:\Users\Username\AppData\Local\VirtualStore」など)にファイルが作成されている場合があります。
このような問題はファイルの作成だけでなく、ファイルの変更や削除、フォルダの作成や削除などでも同じように発生します。
このような制限のあるフォルダには、プログラムファイルフォルダ(「C:\Program Files」など)、システムルートフォルダ(「C:\Windows」など)、システムドライブルートフォルダ(「C:\」など)、プログラムデータフォルダ(「C:\ProgramData」など)があります。
このため、例えば、インストールされているフォルダに設定ファイルを保存しているアプリケーションは、「C:\Program Files」以下にインストールされていると設定を正常に保存できなくなります。
レジストリの「HKEY_LOCAL_MACHINE」以下に値を保存しようとすると、例外UnauthorizedAccessExceptionが発生します。例外が発生しなくても、仮想化によって、別のキー(「HKEY_LOCAL_MACHINE\SOFTWARE」なら「HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\Software」)に値が保存されている場合があります。
このため、設定を「HKEY_LOCAL_MACHINE」に書き込んでいるアプリケーションは、設定を正常に保存できなくなります。
Application.CommonAppDataRegistryプロパティは「HKEY_LOCAL_MACHINE\Software」以下にキーを作成しますので、これを使っているとうまくいかないかもしれません。
その他にも、システムタイムを変更できないなどの問題が発生します。
以下に対策を示します。
ファイルを作成する時、問題の発生しない場所に作成するように変更します。例えば、今まで設定ファイルをアプリケーションのフォルダに保存していたのであればそれをやめて、代わりにApplicationクラスのUserAppDataPath、LocalUserAppDataPath、CommonAppDataPathプロパティで取得できる「C:\Documents and Settings」以下のフォルダに保存します。詳しくは、「設定をどこに保存するか?」をご覧ください。
同様に、レジストリに値を書きこむ時は、「HKEY_LOCAL_MACHINE」に書き込まないようにします。ユーザー共通の設定はレジストリにではなく、ファイルに保存するようにします。
どうしても「Program Files」フォルダ以下にファイルを作成したい場合、そのフォルダのアクセス権を変更して、「Users」にフルコントロール(あるいは、「書き込み」や「変更」など必要なものだけ)のアクセス許可を与えるという方法があります。
そのためには、まずエクスプローラーで対象のフォルダのプロパティ画面を出します。「セキュリティ」タブを選択し、「編集」をクリックします。「グループ名またはユーザー名」で「Users」を選択し、「Usersのアクセス許可」で「フルコントロール」の「許可」にチェックを入れて「OK」をクリックします。
言うまでもありませんが、アクセス権を変更するフォルダは、そうしても安全なフォルダだけにしてください。
「Windows Vista & 7のUAC対策について」によると、すでに仮想化されたファイルの場合、後でアクセス権を変更したとしても、仮想化が優先されるということです。よって、もし仮想化されているならば、仮想化されたフォルダを削除しておきます。仮想化されたファイルがあるフォルダをエクスプローラで開くと、「互換性」というボタンが上部に出現します(Windows 7以降?)。このボタンをクリックすると、そのフォルダが開きます。
レジストリの場合も同様に、アクセス権を変更することで書き込みができるようになります。
方法は、まずレジストリエディター(スタートメニューの「プログラムとファイルの検索」に「regedit」と入力して起動)で対象のキーを選択し、メニューの「編集」-「アクセス許可」をクリックします。「グループ名またはユーザー名」で「Users」を選択し、「Usersのアクセス許可」で「フルコントロール」の「許可」にチェックを入れて「OK」をクリックします。
ファイルの場合と同じように、仮想化された値が仮想ストアにあるならば、削除した方が良いでしょう。
もしアプリケーションがインストール先のフォルダにファイルを書き込んでいるのであれば、インストール先を「Program Files」以外の場所にする方法も考えられます。
ただ、「Program Files」以外の場所にアプリケーションをインストールしなければならないという制限を与えるのは良いことではないでしょう。
上記の方法では問題が解決できないのであれば、アプリケーションを起動する時に管理者権限に昇格させます。この方法は「UACが有効の時、アプリケーションを管理者に昇格させて起動する」で詳しく説明します。
この方法でアプリケーションを起動させると「ユーザーアカウント制御」ダイアログが表示され、ユーザーには分かりにくかったり、面倒だったりします。やむを得ない場合は仕方ありませんが、前述したような方法で解決できるのであればそうした方が良いです。
最後の手段として、UACを無効にする方法を幾つか紹介します。ここで紹介している事柄は、「Windows ユーザー アカウント制御手順ガイド」や「Windows Vista UAC(ユーザーアカウント制御)機能を無効にする方法」、「UAC(User Account Control)を無効にする - Windows Vista情報局」などを参考にしました。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。