🪟
バッチを管理者権限で強制実行するのを1度だけ試行する
こんにちは、$@(ダラ~っと)です(๑Ò﹃ Ó๑)ゝ
はじめに
バッチ実行時に、強制的に管理者として実行する必要が出てきたため、その時のメモです。
何がわかる?
下記の処理を行うバッチ
- 指定したバッチを管理者権限で実行する
- 管理者権限がない/拒否された場合は、標準ユーザー権限で実行する
環境
- windows 11 Pro
ソース
環境変数RUN_BAT_PATH
に管理者権限で実行したいバッチのパスを指定する。
カレントディレクトリを違う場所にしたい時は、適当に変更してください。
@echo off
setlocal enabledelayedexpansion
@REM 実行するバッチ
set "RUN_BAT_PATH=~.bat"
@REM カレントディレクトリ変更
cd /d %~dp0
@REM 実行するバッチが存在するかチェックする
if not exist "%RUN_BAT_PATH%" (
PowerShell -NoProfile -ExecutionPolicy Unrestricted -Command "Write-Host -ForegroundColor Red 'エラー:バッチファイルが存在しないため、処理を終了します。'"
pause
exit
)
@REM 管理者権限での実行を要求する
@REM 管理者権限の取得に失敗/拒否された場合は、標準ユーザーとして実行する
whoami /priv | find "SeDebugPrivilege" > nul
if !errorlevel! neq 0 (
@REM 標準ユーザー
@REM 管理者権限の実行を試す
PowerShell -NoProfile -ExecutionPolicy Unrestricted -Command "Start-Process '%RUN_BAT_PATH%' -Verb RunAs"
if !errorlevel! neq 0 (
@REM 管理者権限の取得に失敗/拒否された場合は、標準ユーザーとして実行する
call %RUN_BAT_PATH%
)
) else (
@REM 管理者権限ユーザーのため、そのまま実行する
call %RUN_BAT_PATH%
)
endlocal
メモ
- PowerShellで管理者権限としてバッチファイルを呼び出します。
-
-NoProfile
:PowerShell起動時にユーザープロファイルスクリプトを読み込まないようにする -
-ExecutionPolicy Unrestricted
:PowerShellスクリプトの実行ポリシーを「Unrestricted」に設定します。これにより、すべてのPowerShellスクリプト(署名されているものも署名されていないものも)を実行することができるので、セキュリティ的に問題がないか確認が必要です。
-
- 管理者権限として実行するなら、下記だけでも良いが、管理者権限を持っていないユーザーが実行すると無限ループしてしまう。そのため、管理者権限で実行できたかを確認している
whoami /priv | find "SeDebugPrivilege" > nul if !errorlevel! neq 0 ( @REM 標準ユーザー @REM 管理者権限の実行を試す PowerShell -NoProfile -ExecutionPolicy Unrestricted -Command "Start-Process '%~0' -Verb RunAs" )
おわりに
なんかマニアック!
Discussion