バッチの管理者実行とダブルクリックの違い


管理者実行周りの説明

Windowsに管理者権限を持ったユーザでログインし、GUIで操作を行います。そのとき、管理者権限が不要な操作は標準ユーザー権限で実行され、管理者権限が必要な操作は、ダイアログで確認が行われた上で、管理者権限で実行される仕様です。

管理者権限を持つユーザ

管理者実行の確認ダイアログ

これは、マルウェアなどがOSに変更を加えないようにするための仕様で、Windows Vista以降の標準になっています。

では、バッチの場合はどうなるのでしょうか?
バッチは無人で実行されるので、管理者権限が必要な操作が出てくるたびに確認ダイアログを表示しても、確認できる人がいません。そのため、管理者実行を行うかどうかをバッチ起動時に決めます。

  • ダブルクリックだと、標準ユーザー実行
  • 右クリック→管理者として実行 だと、管理者実行

になります。

バッチの管理者実行のメリット

以下に挙げるのは、バッチの管理者実行ではできるが、ダブルクリックではエラーになる操作です。

管理者(Administratorsグループ)のアクセス権で処理ができる

C:\Windows、C:\Program Filesなどの配下は、Administratorsグループはフルコントロールですが、Usersグループは読み取りと実行権限しか与えられていないケースが多いです。
したがって、C:\Program Files内の設定ファイルを上書きコピーしようとした場合などは、バッチを管理者で実行する必要があります。

レジストリ操作ができる

管理者実行だとレジストリ操作ができます。

例)最近使ったファイルの表示を有効化

reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer" /v "ShowRecent" /t "REG_DWORD" /d "1" /f

管理者コマンドが使える

その他、管理者しか実行できないコマンドが使えます。

例)windows updateで使うプロキシ設定をieからインポート

netsh winhttp import proxy source=ie

なお、管理者実行を強制させる方法については、以下の記事を参照ください。
管理者権限でbatを実行したい時にやッた事

バッチの管理者実行のデメリット

以下に挙げるのは、バッチの管理者実行ではできないが、ダブルクリックではできる操作です。回避策についても説明します。

カレントフォルダがバッチのフォルダにならない

管理者実行の場合、カレントフォルダがC:\Windows\System32になります。
ダブルクリックの場合、カレントフォルダはバッチのフォルダになります。

そのため、以下のtest.batを管理者実行すると正しく動作しません。ダブルクリックだと正しく動作します。

D:\test\test.bat
D:\test\test.ps1

test.bat

powershell -NoProfile -ExecutionPolicy Unrestricted .\test.ps1 > .\test.log

test.ps1

write-host "test"

管理者実行で動作できるようにするには、バッチにバッチのあるフォルダへの移動を追加します(ただし、jmeter.batなどダブルクリックで起動するしかないバッチもあります。)

test.bat

pushd %~dp0
powershell -NoProfile -ExecutionPolicy Unrestricted .\test.ps1 > .\test.log
popd