Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

管理者権限なしでプログラムを実行しUACプロンプトを回避する方法【RUNASINVOKER活用術】

多くのプログラムは起動時に権限の昇格(アプリアイコンの盾マーク)を要求しますが、実際には通常の動作に管理者権限が不要なケースも少なくありません。例えば、Program Files内のアプリフォルダや、プログラムが使用するレジストリキーに対して、ユーザーへ手動でアクセス許可を付与すれば足りる場合があります。

しかし、標準ユーザーアカウントでこのようなプログラムを起動すると、UAC(ユーザーアカウント制御)が有効な環境ではUACプロンプトが表示され、管理者パスワードの入力を求められます。これを回避するために、UACを無効化したり、ユーザーをローカルの「Administrators」グループに追加して管理者権限を与えたりするユーザーも多くいますが、どちらの方法もセキュリティ上好ましくありません。

一部のWindowsアプリが標準ユーザーで動作せず管理者権限を要求する理由

アプリによっては、C:\Program Files (x86)\SomeAppのような自身のフォルダ内にあるファイル(ログや設定ファイルなど)を書き換える必要があるため、管理者権限を要求することがあります。デフォルトでは、ユーザーはこのディレクトリに対して編集(書き込み・変更)権限を持っていません。そのため、プログラムを正常に動作させるには管理者権限が必要になるのです。

この問題を解決するには、NTFSファイルシステムのレベルで、アプリフォルダに対して特定のユーザー(または組み込みのUsersグループ)に「変更」および「書き込み」権限を手動で付与します。

注意: 実際には、変更されるアプリケーションデータをC:\Program Files配下のフォルダに保存することは推奨されません。本来はユーザープロファイルにデータを保存すべきです。これは開発者の怠慢や設計上の未熟さによる問題と言えます。

管理者権限が必要なプログラムを標準ユーザーで実行する方法

以前、RunAsInvokerパラメータを使って特定アプリのUACプロンプトを無効化する方法をご紹介しましたが、この方法は柔軟性に欠けます。

また、Windows資格情報マネージャーに保存した管理者パスワードを使って/SAVECREDオプション付きのRunAsを実行する方法もありますが、保存された管理者資格情報を使えば任意のプログラムを実行できてしまうため、こちらも安全とは言えません。

ここでは、より簡単に、UACを有効にしたまま(UACスライダーのレベル4・3・2の状態で)任意のプログラムを管理者パスワード入力なしで実行する方法を解説します。

例として、レジストリエディターregedit.exe(C:\Windows\フォルダにあります)を使用します。アプリアイコンの横にUACの盾マークが表示されていることに注目してください。このアイコンは、このプログラムの実行にUACによる権限昇格が要求されることを意味しています。

regedit.exeを実行すると、「このアプリがデバイスに変更を加えることを許可しますか?」というユーザーアカウント制御の画面が表示され、管理者資格情報の入力を求められます。パスワードを入力せず昇格を確認しない場合、アプリは起動しません。

それでは、このプログラムのUAC要求を回避してみましょう。デスクトップに以下のコードを含むテキストファイルrun-as-non-admin.batを作成します。

cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" %1"

regedit.exeを管理者権限なしで実行し、UACプロンプトを抑制するには、起動したいEXEファイルをデスクトップ上のこのBATファイルにドラッグ&ドロップするだけです。

すると、レジストリエディターがUACプロンプトなし、管理者パスワード入力なしで起動します。タスクマネージャーを開いて「昇格」列を追加すると、regedit.exeのプロセスが昇格されていない状態(非管理者ユーザー権限で実行)になっていることが確認できます。

HKEY_LOCAL_MACHINEハイブのパラメータを編集してみてください。ご覧のとおり、ユーザーはこのレジストリキーの項目を編集できません(システムレジストリキーへの書き込み権限がないため)。ただし、ユーザーハイブであるHKEY_CURRENT_USER内のレジストリキーやパラメータは追加・編集可能です。

同じ要領で、BATファイルを使って任意のアプリを実行できます。実行ファイルへのパスを指定するだけです。

run-app-as-non-admin.bat
Set ApplicationPath="C:\Program Files\SomeApp\testapp.exe"
cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" %ApplicationPath%"

さらに、すべてのアプリを昇格なしで実行できるコンテキストメニューを追加することもできます。RunAsUser.REGファイルを作成し、以下のコードをコピーして保存した後、regファイルをダブルクリックしてWindowsレジストリにインポートしてください(この変更の適用には管理者権限が必要です)。

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker]
@="Run as user without UAC privilege elevation"
[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker\command]
@="cmd /min /C \"set __COMPAT_LAYER=RUNASINVOKER && start \"\" \"%1\"\""

設定後は、エクスプローラーの右クリックメニューから「Run as user without UAC privilege elevation」を選択するだけで、任意のアプリケーションを管理者権限なしで実行できます。

このオプションは、GPOを使ってレジストリパラメータをインポートすることで、ドメイン内のすべてのコンピューターに展開することも可能です。

重要な注意点: RUNASINVOKERモードでプログラムを実行しても、プログラムを昇格できるわけではありません。RunAsInvokerはUACプロンプトを抑制し、プログラムに対して現在のユーザーの権限で実行するよう指示するだけです。システム設定やファイルの編集に本当に昇格された権限が必要なプログラムの場合、動作しないか、再度管理者権限を求められます。

__COMPAT_LAYERのRunAsInvokerでUACをバイパスする仕組み

環境変数__COMPAT_LAYERを使うと、アプリケーションにさまざまな互換性レベルを設定できます(EXEファイルのプロパティにある「互換性」タブに相当)。この変数により、プログラム起動時に使用する互換性設定を指定できます。例えば、Windows 8互換モードかつ640×480解像度でアプリを起動するには、次のように設定します。

set __COMPAT_LAYER=Win8RTM 640x480

__COMPAT_LAYER変数には、今回目的とするオプションがいくつか用意されています。主なパラメータは以下のとおりです。

  • RunAsInvoker – 親プロセスの権限でUACプロンプトなしにアプリを実行する;
  • RunAsHighest – ユーザーに許可されている最高レベルの権限でプログラムを実行する(ユーザーが管理者権限を持っている場合はUACプロンプトが表示される);
  • RunAsAdmin – アプリを管理者として実行する(毎回UACプロンプトが表示される)。

つまり、RunAsInvokerパラメータは管理者権限を付与するものではなく、単にUACプロンプトを抑制するだけの機能です。

以下のCMDコードは、現在のプロセスに対してRunAsInvokerモードを有効化し、指定したプログラムを昇格なしで実行します。

set __COMPAT_LAYER=RUNASINVOKER
start "" "C:\Program Files\MyApp\testapp.exe"

EXEファイルのマニフェストでRunAsInvokerモードを有効化する

前述のとおり、Windows 10では昇格を必要とするプログラムにUACの盾アイコンが表示されます。開発者は、アプリケーションのコンパイル時にプログラムのマニフェストでこの要件を設定しています。

任意のexeファイルのマニフェストを編集し、昇格モードでの実行要件を無効化することが可能です。

マニフェストの編集には、無料ツールのResource Hackerを使用できます。Resource Hackerでアプリの実行ファイルを開いてください。

この例では、Sysinternals製のAutologon.exeツール(パスワードなしでWindowsに自動ログオンするためのツール)のマニフェストを編集します。

左側のツリーで「Manifest」セクションに移動し、プログラムのマニフェストを開きます。以下のXMLセクションに注目してください。

<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>

requireAdministratorオプションがあるため、Windowsは常にこのプログラムを管理者として実行しようとします。

requireAdministratorをasInvokerに変更し、exeファイルに変更を保存します。

すると、プログラムアイコンからUACの盾マークが消え、管理者パスワードを求められることなく、現在のユーザー権限で実行できるようになります。

注意: 実行ファイルがMS Authenticode(コード署名証明書)で署名されている場合、exeファイルを改変すると、プログラムが動作しなくなったり警告が表示されたりする可能性があります。

そのような場合は、外部マニフェストファイルを使用するようプログラムに強制できます。exeファイルと同じディレクトリにappname.exe.manifestという名前のプレーンテキストファイル(例:Autologon.exe.manifest)を作成し、Resource Hackerからマニフェストのコードをコピーします。requireAdministratorをasInvokerに変更して、マニフェストファイルを保存してください。

Windowsが常にexeファイルの起動時に外部マニフェストファイルを使用するようにするには、特別なレジストリパラメータを有効化します。

REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide" /v PreferExternalManifest /t REG_DWORD /d 1 /f

Windowsを再起動し、プログラムが「管理者権限なしで実行する」と指定された外部マニフェストファイルを使用していることを確認してください。

  1. Raspberry PiでKodiを使ってNetflixを視聴する方法【完全ガイド】

    Raspberry Piをメディアセンターに変えて、対応するテレビやモニターで動画コンテンツをストリーミング再生したいと思ったことはありませんか?最近のDRM(デジタル著作権管理)関連のアップデートにより、Kodiユーザーは以前よりも多くのコンテンツにアクセスできるようになりました。その中にはNetflixも含まれています。このチュートリアルでは、Kodiメディアセンターを使用してRaspberry PiにNetflixをインストールする方法を解説します。最後まで読めば、Kodi本体とNetflixプラグインがインストールされ、Raspberry Pi経由でNetflixの全カタログをストリー

  2. Windows 8で管理者パスワードやその他のパスワードをバイパスする3つの方法

    Windows 8を起動するたびにパスワードを入力するのが面倒に感じたことはありませんか?また、うっかりパスワードを忘れてしまい、焦った経験はないでしょうか?Windows 8ユーザーの私も、こうしたパスワード関連のトラブルに悩まされたことがあります。そこでインターネットで調べて集めた「Windows 8 パスキー」的な解決策を、ここで皆さんとシェアしたいと思います。この記事を読めば、Windows 8のログインパスワードをバイパスできるようになります。 状況1:パスワードが分かっている場合にログイン画面をバイパスする方法 現在のパスワードが分かっていてWindows 8にログインできるので