【bat】管理者権限で自動実行するバッチファイルの作り方|UAC回避とタスク登録の方法

【bat】管理者権限で自動実行するバッチファイルの作り方|UAC回避とタスク登録の方法 bat

Windowsでシステム設定の変更やサービスの操作を行うバッチファイルには管理者権限が必要です。しかし、通常のダブルクリックでは「ユーザーアカウント制御(UAC)」の確認画面が表示され、自動処理が止まってしまいます。

この記事では、バッチファイルを管理者権限で自動実行する方法を解説します。バッチ内で自動昇格する方法タスクスケジューラでUACを完全に回避する方法昇格時の落とし穴と対策まで、実務で使えるテンプレート付きで紹介します。

スポンサーリンク

管理者権限が必要な操作の例

以下のような操作をバッチファイルで行う場合、管理者権限が必要です。

操作 コマンド例
サービスの起動・停止 net start / net stop
ファイアウォールの設定 netsh advfirewall
ネットワーク設定の変更 netsh interface ip set
レジストリの変更 reg add HKLM\...
システムフォルダへの書き込み copy ... C:\Windows\
hostsファイルの編集 echo ... >> C:\Windows\System32\drivers\etc\hosts
タスクスケジューラの登録 schtasks /create

権限が不足していると「アクセスが拒否されました」エラーになります。詳しくは「管理者権限が必要な処理が失敗するときの解決策」をご覧ください。

方法1:バッチファイル内で自動的に管理者権限に昇格する

バッチファイルの冒頭に以下のコードを入れると、管理者権限がない場合に自動で再起動して昇格します。

@echo off
rem --- 管理者権限チェック ---
net session >nul 2>&1
if %ERRORLEVEL% neq 0 (
    echo 管理者権限で再起動します...
    powershell -Command "Start-Process cmd -ArgumentList '/c ""%~f0""' -Verb RunAs"
    exit /b
)

rem --- ここから管理者権限で実行される ---
cd /d "%~dp0"
echo 管理者として実行中です。

rem 実際の処理をここに書く
net start W32Time
echo 処理が完了しました。
pause

コードの解説

説明
net session >nul 2>&1 管理者権限があるか確認(管理者でないと ERRORLEVEL 1)
powershell ... -Verb RunAs UACダイアログを表示して管理者権限で再起動
exit /b 元のプロセスを終了(昇格後のプロセスに引き継ぐ)
cd /d "%~dp0" カレントディレクトリをバッチの場所に戻す(重要)

net session を使う理由

管理者権限の判定方法はいくつかありますが、net session が最も確実です。

判定方法 信頼性 備考
net session 高い 管理者でないと必ずエラーになる
openfiles 高い やや遅い
cacls %SYSTEMROOT%\system32\config\system 低い 環境によっては誤判定する

古い記事では cacls.exe を使う方法が紹介されていますが、環境依存があるため net session を推奨します。

昇格時の落とし穴:カレントディレクトリが変わる

管理者権限で再起動すると、カレントディレクトリが C:\Windows\System32 に変わります。これが最もよくあるトラブルの原因です。

@echo off
rem 管理者権限で再起動した後...
echo 現在のディレクトリ: %CD%
rem → C:\Windows\System32(バッチの場所ではない!)

rem ファイルが見つからないエラーになる
copy data.txt C:\backup\

対処法:cd /d “%~dp0” で戻す

昇格後に cd /d "%~dp0" を実行して、バッチファイルのあるディレクトリに移動します。

@echo off
net session >nul 2>&1
if %ERRORLEVEL% neq 0 (
    powershell -Command "Start-Process cmd -ArgumentList '/c ""%~f0""' -Verb RunAs"
    exit /b
)

rem ★ カレントディレクトリをバッチの場所に戻す
cd /d "%~dp0"

rem これで相対パスが正しく動作する
copy data.txt C:\backup\
pause

%~dp0 の詳しい使い方は「%dp0を使用して所在ディレクトリを基準にファイル操作を行う方法」で解説しています。

方法2:タスクスケジューラでUACを完全に回避する

UACダイアログを一切表示せずに管理者権限で実行するには、タスクスケジューラに登録します。この方法が最も安全で確実です。

schtasks コマンドで登録する

rem ログオン時に管理者権限で実行するタスクを登録
schtasks /create /tn "AdminBatch" /tr "C:\scripts\admin_task.bat" /sc onlogon /rl highest /f
オプション 意味
/tn タスク名
/tr 実行するバッチファイルのパス
/sc トリガー(onlogon=ログオン時、daily=毎日、onstart=PC起動時)
/rl highest 最上位の特権で実行(管理者権限)
/f 既存タスクを強制上書き

よく使うトリガーの例

rem PC起動時に実行(ユーザーログオン不要)
schtasks /create /tn "StartupTask" /tr "C:\scripts\startup.bat" /sc onstart /rl highest /ru SYSTEM /f

rem 毎日 03:00 に実行
schtasks /create /tn "DailyTask" /tr "C:\scripts\daily.bat" /sc daily /st 03:00 /rl highest /f

rem 5分ごとに実行
schtasks /create /tn "IntervalTask" /tr "C:\scripts\check.bat" /sc minute /mo 5 /rl highest /f

/ru SYSTEM を指定すると、ログオンしていなくても SYSTEM アカウントで実行できます。ただし、ユーザーのネットワークドライブにはアクセスできません。

タスクスケジューラの詳細は「バッチでタスクスケジューラを登録・削除する方法」をご覧ください。

GUIでの設定手順

  1. Win+R → taskschd.msc でタスクスケジューラを起動
  2. 右側の「タスクの作成」をクリック
  3. 全般タブ:名前を入力し、「最上位の特権で実行する」にチェック
  4. トリガータブ:「新規」→ 実行タイミングを設定
  5. 操作タブ:「新規」→「プログラム/スクリプト」にバッチファイルのパスを入力
  6. 条件タブ:不要な条件(AC電源のみ等)のチェックを外す
  7. 「OK」で保存

登録したタスクをバッチから呼び出す

タスクスケジューラに登録済みのタスクは、schtasks /run で即時実行できます。

rem ダブルクリックで管理者タスクを実行(UAC表示なし)
schtasks /run /tn "AdminBatch"

この方法を使えば、ユーザーがダブルクリックするだけで、UACダイアログなしに管理者権限の処理が実行されます。

方法3:ショートカットに「管理者として実行」を設定する

簡単な方法として、バッチファイルのショートカットに管理者権限を設定できます。

  1. バッチファイルのショートカットを作成
  2. ショートカットを右クリック →「プロパティ」
  3. 「ショートカット」タブ →「詳細設定」
  4. 管理者として実行」にチェック → OK

この方法ではダブルクリック時にUACダイアログが表示されます。UACを回避したい場合はタスクスケジューラを使ってください。

実務で使えるテンプレート

自動昇格 + ログ出力テンプレート

@echo off
rem ============================================
rem  管理者権限で実行するバッチテンプレート
rem ============================================

rem --- 管理者権限チェック&自動昇格 ---
net session >nul 2>&1
if %ERRORLEVEL% neq 0 (
    powershell -Command "Start-Process cmd -ArgumentList '/c ""%~f0""' -Verb RunAs"
    exit /b
)

rem --- 初期設定 ---
cd /d "%~dp0"
set LOGFILE=%~dp0logs\admin_%date:~0,4%%date:~5,2%%date:~8,2%.log

rem --- ログディレクトリ作成 ---
if not exist "%~dp0logs" mkdir "%~dp0logs"

echo ========================================>> "%LOGFILE%"
echo [%date% %time%] 管理者バッチ開始>> "%LOGFILE%"
echo [%date% %time%] 実行ユーザー: %USERNAME%>> "%LOGFILE%"

rem --- メイン処理 ---
echo [%date% %time%] サービスを再起動します...>> "%LOGFILE%"
net stop W32Time >> "%LOGFILE%" 2>&1
net start W32Time >> "%LOGFILE%" 2>&1
if %ERRORLEVEL% neq 0 (
    echo [%date% %time%] エラー: サービス再起動に失敗>> "%LOGFILE%"
    goto :finally
)
echo [%date% %time%] サービス再起動完了>> "%LOGFILE%"

echo [%date% %time%] 管理者バッチ正常終了>> "%LOGFILE%"

:finally
pause
exit /b

タスクスケジューラ登録スクリプト

@echo off
rem ============================================
rem  管理者タスクをタスクスケジューラに登録する
rem  ※ このスクリプト自体を管理者で実行してください
rem ============================================

net session >nul 2>&1
if %ERRORLEVEL% neq 0 (
    echo このスクリプトは管理者権限で実行してください。
    pause
    exit /b 1
)

set TASK_NAME=DailyMaintenance
set SCRIPT_PATH=C:\scripts\daily_maintenance.bat

rem 既存タスクを削除(あれば)
schtasks /delete /tn "%TASK_NAME%" /f >nul 2>&1

rem 新しいタスクを作成
schtasks /create /tn "%TASK_NAME%" /tr "%SCRIPT_PATH%" /sc daily /st 03:00 /rl highest /f

if %ERRORLEVEL% equ 0 (
    echo タスク「%TASK_NAME%」を登録しました。
    echo 毎日 03:00 に管理者権限で実行されます。
) else (
    echo タスクの登録に失敗しました。
)

pause

まとめ

方法 UACダイアログ 適用場面
バッチ内で自動昇格 表示される 手動実行で管理者権限が必要な場合
タスクスケジューラ 表示されない 定時実行・完全自動化
ショートカット設定 表示される 特定のバッチだけ管理者で実行したい場合

ポイント

  • 管理者権限の判定は net session が最も確実
  • 昇格後は cd /d "%~dp0" でカレントディレクトリを戻す
  • UACを完全に回避するにはタスクスケジューラに登録する
  • schtasks /run でタスクを即時実行すれば、ダブルクリック感覚で使える
  • 自動処理には必ずログ出力を組み込む

あわせて読みたい