バッチファイルやPowerShellスクリプトを自動的に管理者として実行させる方法

バッチファイルやPowerShellスクリプトを自動的に管理者として実行させる方法

バッチファイルやPowerShellスクリプトでは、実行する処理によっては管理者として(管理者権限で)実行しなければならない時がありますが、バッチファイルやPowerShellスクリプトを右クリックしてメニューから「管理者として実行」をクリックする方法は、効率が良いとは言えません。

そんなときは、バッチファイルやPowerShellスクリプト内に自分自身を管理者として再実行する処理を追記しておくことで、バッチファイルやPowerShellスクリプトを普通に実行するだけで、自動的に管理者として再実行させることができます。

そこでここでは、WindowsでバッチファイルやPowerShellスクリプトを自動的に管理者として実行させる方法を紹介します。

バッチファイルの場合

バッチファイルを実行したら自動的に管理者として実行させるには、バッチファイルの先頭に管理者として実行されているかを判別する処理を追記します。

たとえば、下のバッチファイルでは、whoamiコマンドを使ってバッチファイルが管理者として実行されているかを判別して、管理者として実行されていない場合は、PowerShellのStart-Processコマンドレットでバッチファイルを管理者として再実行しています。

@echo off
cd /d %~dp0
for /f "tokens=3 delims=\ " %%i in ('whoami /groups^|find "Mandatory"') do set LEVEL=%%i
if NOT "%LEVEL%"=="High" (
  powershell.exe -NoProfile -ExecutionPolicy RemoteSigned -Command "Start-Process %~f0 -Verb runas"
  exit
)

rem これ以降に、実行したい処理を記述します

よりシンプルな方法としては、openfilesコマンドを使った判別方法があります。openfilesコマンドは管理者権限が必要なコマンドのため、バッチファイルの先頭でopenfilesコマンドを実行してリターンコードをチェックすることで、バッチファイルが管理者として実行されているかを判別できます。

@echo off
cd /d %~dp0
openfiles > NUL 2>&1
IF ERRORLEVEL 1 (
  powershell.exe -NoProfile -ExecutionPolicy RemoteSigned -Command "Start-Process %~f0 -Verb runas"
  exit
) 

rem これ以降に、実行したい処理を記述します

PowerShellスクリプトの場合

PowerShellスクリプトを実行したら自動的に管理者として実行させるには、PowerShellスクリプトの先頭に、次の処理を追記します。

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators"))
{
Start-Process powershell.exe "-File `"$PSCommandPath`"" -Verb RunAs
exit
}

# これ以降に、実行したい処理を記述します

処理内容はバッチファイルの時と同様に、自分自身が管理者として実行されているかチェックし、もし管理者として実行されていない場合は、管理者として再実行しています。

あとがき

参考までに、Windowsでプログラムを管理者として実行する方法は、以下の記事で紹介しています。

Windowsでアプリやプログラムを管理者として実行する8つの方法
Windowsでアプリやプログラムを管理者として実行する8つの方法
Windowsでアプリやプログラム、コマンドを管理者として(管理者権限で)実行する方法として、8つの方法を紹介します。