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での設定手順
- Win+R →
taskschd.mscでタスクスケジューラを起動 - 右側の「タスクの作成」をクリック
- 全般タブ:名前を入力し、「最上位の特権で実行する」にチェック
- トリガータブ:「新規」→ 実行タイミングを設定
- 操作タブ:「新規」→「プログラム/スクリプト」にバッチファイルのパスを入力
- 条件タブ:不要な条件(AC電源のみ等)のチェックを外す
- 「OK」で保存
登録したタスクをバッチから呼び出す
タスクスケジューラに登録済みのタスクは、schtasks /run で即時実行できます。
rem ダブルクリックで管理者タスクを実行(UAC表示なし) schtasks /run /tn "AdminBatch"
この方法を使えば、ユーザーがダブルクリックするだけで、UACダイアログなしに管理者権限の処理が実行されます。
方法3:ショートカットに「管理者として実行」を設定する
簡単な方法として、バッチファイルのショートカットに管理者権限を設定できます。
- バッチファイルのショートカットを作成
- ショートカットを右クリック →「プロパティ」
- 「ショートカット」タブ →「詳細設定」
- 「管理者として実行」にチェック → 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でタスクを即時実行すれば、ダブルクリック感覚で使える- 自動処理には必ずログ出力を組み込む

