管理者権限を必要としないアプリの UAC プロンプトと権限を修正
プログラムを起動すると、光沢のある盾のアイコンが表示され、管理者権限が必要であることを知らせてくれることがあります。しかし、正直なところ、一部のアプリは不必要に警告を出したり、開発者が権限がなくても問題なく動作できるにもかかわらず、常に権限の昇格を求めるように設定している場合もあります。これは煩わしいものです。特に、たくさんの補助ツールや自動化を実行しようとしているときに、UAC プロンプトが表示されるのです。そのため、毎回「はい」をクリックするのにうんざりしている、または管理者権限を煩わせることなくアプリをスムーズに実行したい場合は、このガイドに、それを管理するための非常に安価なトリックをいくつか紹介します。目標は?通常のユーザーとしてアプリケーションを実行し、無限に表示される UAC プロンプトをスキップし、タスクバーが盾で乱雑にならないように修正することです。
Windows の UAC プロンプトと昇格の問題を修正する方法
管理者以外のユーザーがプログラムを実行できるように権限を設定する
プログラムが起動時に管理者権限を要求する場合(システムフォルダにアクセスしようとしたり、保護された領域に書き込もうとしたりする場合など)、多くの場合、NTFSのアクセス権がロックされている可能性があります。そのため、ユーザーまたはUsersなどのグループに、該当するフォルダまたはファイルへの変更または書き込み権限を付与することが解決策となります。
C:\Program Files (x86)\SomeAppにあるアプリのフォルダに権限を付与するか、アプリが特定のレジストリキーを使用している場合はレジストリキーを調整する必要があるかもしれません。Process Monitor ( Sysinternalsからダウンロード)を使用すると、ブロックされているファイルやレジストリ領域を正確に確認できます。プロセス名でフィルターを有効にし、「アクセス拒否」が表示されるかどうかを確認してください。原因がわかったら、フォルダまたはレジストリキーを右クリックし、「プロパティ」 > 「セキュリティ」と進み、権限を変更できるユーザーまたはグループを追加します。
補足ですが、アプリのデータはC:\Program Filesではなく、ユーザープロファイル( %APPDATA%など)に保存する方が賢明です。ただし、Windows では処理を複雑にする必要があるため、レガシーアプリではこの回避策が必要になる場合があります。
通常は管理者権限が必要なプログラムを標準ユーザーが実行できるようにする
これは、「UAC の影響を受けずにこれを実行するにはどうすればいいか?」という典型的なトリックで、RunAsInvoker互換レイヤーを使用します。基本的には、Windows にアプリが既にユーザーの現在の権限で実行されていると認識させ、UAC プロンプトをスキップします。アプリが実際には管理者権限を必要としない場合でも、コンパイル時に管理者権限としてフラグ付けされていればうまく機能します。
例えば、C:\Windowsにあるregedit.exe を例に挙げましょう。通常は盾のアイコンが表示され、認証情報の入力を求められます。しかし、デスクトップにrun-as-non-admin.batというバッチファイルを作成し、以下のコマンドを実行すれば、このような事態を防げます。
cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" %1"
regedit.exe をそのバッチファイルにドラッグするだけで、管理者権限を要求されることなく起動するはずです。タスクマネージャーで、管理者権限なしで実行されていることを確認できます。ただし、システム全体の設定を変更しようとする場合は、その制限を受け入れられる場合を除き、変更しないでください。この方法は権限レベルを「偽装」するものなので、本当に管理者権限が必要なアプリでは万全とは言えませんが、多くのツールでは便利です。
さらに簡単にしたい場合は、アプリのショートカットを作成し、そのターゲットにバッチコマンドを指定して、アプリのパスを渡します。例えば、管理者権限のないテストのショートカットは次のように記述します。
Set ApplicationPath="C:\Program Files\SomeApp\testapp.exe" & start "" %ApplicationPath%
ヒント:レジストリキーをインポートすることで、任意のファイルを右クリックして「UACなしでユーザーとして実行」を選択できるコンテキストメニュー項目を追加することもできます(下記参照)。こうすることで、毎回この操作を行う必要がなくなります。
CMD環境でRunAsInvokerを使用してUACをバイパスする
この方法では、__COMPAT_LAYER環境変数を設定します。少し奇妙ですが、機能します。以下のコマンドを実行できます。
set __COMPAT_LAYER=RunAsInvoker && start "" "C:\Path\To\YourApp.exe"
要点はこうです。シンプルにするために、アプリをこのように起動すると、WindowsはUACプロンプトをスキップし、現在の権限で動作します。これはアプリに管理者権限を与えるわけではなく、プロンプトを非表示にするだけです。テストや、制御された環境でスムーズに動作させたい場合に便利です。
プログラムのマニフェストを編集して呼び出し元として実行する
開発者は通常、アプリを管理者権限で実行するようにマニフェストを設定します。しかし、カスタムアプリやレガシーアプリの場合は、Resource Hackerなどのツールを使ってアプリのマニフェストを編集できます。EXEファイルを開き、<requestedPrivileges>セクションrequireAdministratorを に変更して保存するだけasInvokerで、WindowsはUACシールドアイコンを表示しなくなります。
重要:アプリがデジタル証明書で署名されている場合、実行ファイルを変更すると署名に関する警告が表示されたり、アプリが実行できなくなったりする可能性があります。その場合は、外部マニフェストファイルを使用してください。適切なXMLを記述したappname.exe.manifestというプレーンテキストファイルを作成し、レジストリを調整してWindowsに外部マニフェストを使用するように指示してください(公式ドキュメントを参照)。
保存した管理者パスワードで実行するショートカットを作成する(最も安全性の低い方法)
どうしてもUACプロンプトなしで管理者権限でアプリを実行する必要がある場合は、runasコマンドに/savecredオプションを指定してショートカットを作成できます。ただし、これは安全ではありません。保存されたパスワードは悪意のあるツールによって読み取られる可能性があるため、管理された環境でのみ使用してください。
ショートカットターゲットの例:
runas /user:Administrator /savecred "C:\Path\To\YourApp.exe"
初回実行時には、管理者パスワードの入力を求められます。その後は、パスワードは安全に保存されます(システム側ではそう表示されます)。次回実行時には、パスワードの入力を求められません。Windows 11で「要求された操作には昇格が必要です」などのエラーが表示される場合は、コマンドを次のように調整してください。
C:\Windows\System32\runas /profile /user:YourPC\Administrator /savecred "cmd /C C:\Path\To\YourApp.exe"
パスワードをこのように保存すると、多くのセキュリティホールが生まれることを覚えておいてください。アクセス権を持つ人なら誰でも、パスワードさえ知っていれば管理者アカウントとして管理者コマンドを実行できます。このような状況を安全に対処するには、認証情報のキャッシュを無効にするか、 Winhanceなどのサードパーティ製ツールを使用することをお勧めします。
UACや権限の設定は必ずしも簡単ではありませんし、Windowsも決して楽にしてくれません。でも、これらのコツを使えば、プロンプトを何度もクリックしたり、Windowsの権限設定と格闘したりすることなく、少なくともアプリをよりスムーズに動作させることができます。
まとめ
- アプリが必要なフォルダに書き込めない場合は、ユーザーにNTFS権限を付与する
- バッチファイルやコンテキストメニューでRUNASINVOKERトリックを使用する
- アプリケーションマニフェストを編集して管理者権限を必要としないようにする
- 保存されている管理者パスワードには注意し、必要に応じてサードパーティのツールを使用してください。
まとめ
UACプロンプトに煩わされることなくアプリを実行するには、権限の調整、マニフェストの変更、互換性レイヤーの使用など、ある程度の工夫が必要です。ありがたいことに、一部の設定ではこれらの方法でシステム全体を危険にさらすことなく問題を解決できます。ただし、一部のアプリは正常に動作するために管理者権限を必要とするため、UACを無効にするなどの設計上の選択が万能薬ではないことに注意してください。しかし、ほとんどの正当なケースでは、これらの方法でクリック回数とフラストレーションを軽減できます。この方法が、標準ユーザーとしてアプリを実行しようとする数分、あるいは数時間を節約するのに役立つことを願っています。