🪟

バッチを管理者権限で強制実行するのを1度だけ試行する

2024/01/01に公開

こんにちは、$@(ダラ~っと)です(๑Ò﹃ Ó๑)ゝ

はじめに

バッチ実行時に、強制的に管理者として実行する必要が出てきたため、その時のメモです。

何がわかる?

下記の処理を行うバッチ

  • 指定したバッチを管理者権限で実行する
  • 管理者権限がない/拒否された場合は、標準ユーザー権限で実行する

環境

  • 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