DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

Vista以降でUACが有効だとファイルの作成等に失敗する問題の対処法

UACを有効にしていると、どのような問題が起こるか?

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」以外の場所にする方法も考えられます。

ただ、「Program Files」以外の場所にアプリケーションをインストールしなければならないという制限を与えるのは良いことではないでしょう。

管理者としてアプリケーションを起動する

上記の方法では問題が解決できないのであれば、アプリケーションを起動する時に管理者権限に昇格させます。この方法は「UACが有効の時、アプリケーションを管理者に昇格させて起動する」で詳しく説明します。

この方法でアプリケーションを起動させると「ユーザーアカウント制御」ダイアログが表示され、ユーザーには分かりにくかったり、面倒だったりします。やむを得ない場合は仕方ありませんが、前述したような方法で解決できるのであればそうした方が良いです。

UACを無効にする

最後の手段として、UACを無効にする方法を幾つか紹介します。ここで紹介している事柄は、「Windows ユーザー アカウント制御手順ガイド」や「Windows Vista UAC(ユーザーアカウント制御)機能を無効にする方法」、「UAC(User Account Control)を無効にする - Windows Vista情報局」などを参考にしました。

ユーザーアカウントの設定を変更する方法

  1. コントロールパネルで「ユーザーアカウントと家族のための安全設定」のカテゴリにある「ユーザーアカウント」を開きます。
  2. Vistaでは「ユーザーアカウント制御の有効化または無効化」、Windows 7では「ユーザーアカウント制御設定の変更」をクリックします。
  3. Windows Vistaの場合は「ユーザーアカウント制御(UAC)を使ってコンピューターの保護に役立たせる」に付いているチェックを外して「OK」をクリックします。
    Windows 7の場合は「ユーザーアカウント制御の設定」ダイアログが表示されるので、スライダーを一番下の「通知しない」にして「OK」をクリックします。
  4. 再起動後、UACが無効になります。

システム構成を使用する方法

  1. コントロールパネルで「システムとメンテナンス」のカテゴリにある「管理ツール」を開きます。
  2. 「システム構成」を起動します。
  3. システム構成ダイアログの「ツール」タブを表示します。
  4. Windows Vistaでは、「UACの無効化」を選択し、起動します。その後、コマンドプロンプトで「この操作を正しく終了しました。」と表示されますので、コマンドプロンプトを閉じます。
    Windows 7では、「UAC設定の変更」を選択し、起動します。その後、先の紹介した方法と同じ「ユーザーアカウント制御の設定」ダイアログが表示されるので、「通知しない」に設定して「OK」をクリックします。
  5. 再起動後、UACが無効になります。

グループポリシーを使用する方法

  1. コントロールパネルで「システムとメンテナンス」のカテゴリにある「管理ツール」を開きます。
  2. 「ローカル セキュリティ ポリシー」を起動します。
  3. 左側にあるカテゴリで「ローカルポリシー」-「セキュリティオプション」を選択します。
  4. 右側のリストから、「ユーザー アカウント制御: 管理者承認モードですべての管理者を実行する」を探し、ダブルクリックします。
  5. 「無効」を選択し、「OK」をクリックします。
  6. 再起動後、UACが無効になります。

レジストリを書き換える方法

  1. スタートメニューの「アクセサリ」にある「ファイル名を指定して実行」を起動します。「名前」に「regedit」と入力し、「OK」をクリックします。すると、レジストリエディターが起動します。
  2. 「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System」というキーを探して選択します。
  3. 「EnableLUA」という項目を探してダブルクリックします。「値のデータ」に「0」と入力し、「OK」をクリックします。
  4. 再起動後、UACが無効になります。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。