【Windows】バッチファイルを管理者権限で自動昇格させて実行する方法

【Windows】バッチファイルを管理者権限で自動昇格させて実行する方法

PR Amazonのアソシエイトとして、ITナレッジライフは適格販売により収入を得ています。

記事の文字数:3,024

バッチファイルをダブルクリックした際に、UAC経由で自動的に管理者権限(特権)で昇格して実行させる方法を解説します。情シスやインフラ保守の自動化スクリプトで役立つ、PowerShellを用いた実用的な記述コードを紹介します。

ITエンジニアにお勧めの本 ↗

おすすめ

エンジニアが知っておきたい思考の整理術 複雑な情報を【理解する】【伝える】テクニック

難易度
実用性
図解

思考の整理というテーマを、実務ですぐに使える具体的な「技術」として落とし込んだ一冊です。

ベストセラー

世界一流エンジニアの思考法

難易度
実用性
思考法

技術スキル以上に大切な「考え方」をアップデートできる。世界基準の効率的な仕事術が学べます。

文系社会人のためのIT資格の歩き方: 文系のあなたに最適な道をご提案します (YKcreate kiki)

難易度
実用性
キャリア度

ロードマップが非常に明確。キャリアプランを見据えた、無駄のない学習順序を提案してくれます。

エンジニアを説明上手にする本 相手に応じた技術情報や知識の伝え方

難易度
実用性
コミュ力

「伝える技術」もエンジニアの重要なスキル。相手の視点に立った、具体的な説明のコツが満載です。

技術広報入門 ー テックブログから始めるエンジニアカルチャーのつくり方

難易度
実用性
独自性

テックブログを入口にエンジニア組織の文化をどう設計し、育てていくかという実践論が学べます。

Windowsでシステム設定を変更するバッチファイルや、インフラ保守の自動化スクリプトを実行しようとした際、「アクセスが拒否されました」というエラーに直面して困った経験はないでしょうか。毎回バッチファイルを右クリックして「管理者として実行」を選ぶのは手間がかかりますし、エンドユーザーに配布する自動化ツールであれば、ダブルクリックを起点にUACの昇格要求を自動的に開始できると便利です。

この記事を読むと、バッチファイルの先頭に数行のコードを追加するだけで、管理者権限で自分自身を再起動(自動昇格)させて実行できるようになります。情シス担当者やヘルプデスク、インフラエンジニアの業務効率化にぜひお役立てください。

確認した環境

本記事で紹介する手順とコードは、以下の環境で動作を確認しています。

バッチファイルを管理者権限で実行する必要性とは

Windows環境では、レジストリの保護された領域への書き込み、システムサービスの操作、システムフォルダへのファイル配置など、管理者権限が必要となる操作があります。これらの操作を含むバッチファイルを通常のダブルクリック(標準権限)で実行すると、管理者権限が必要な処理でアクセス拒否などのエラーが発生する場合があります。

本来であれば「右クリック > 管理者として実行」を選択する必要がありますが、運用の現場では以下のような課題があります。

  • 作業者が「管理者として実行」を忘れてしまい、中途半端な状態でスクリプトが失敗する
  • デスクトップ ショートカットや他のプログラムから自動起動させたい場合に、手動操作が挟まるため完全自動化できない
  • ショートカットのプロパティから「管理者として実行」にチェックを入れる方法もあるが、ファイルや配布先が変わるたびに設定が必要になる

バッチファイル自体に「自分自身を管理者権限で再起動する」仕組みを組み込んでおけば、ユーザーが普段どおりダブルクリックするだけで、自動的にUAC(ユーザーアカウント制御)画面を呼び出して処理を続行させることができます。

【推奨】PowerShellを使った管理者権限の自動昇格コード(基本)

現在のWindows 11環境では、Windowsに標準搭載されているPowerShellの Start-Process コマンドレットを利用して管理者昇格を行う方法を基本とするのがおすすめです。

以下のコードを、作成したいバッチファイルの最上部にそのままコピーして貼り付けてください。

Terminal window
@echo off
net session >nul 2>&1 || (
powershell -Command "Start-Process cmd -ArgumentList '/c \"\"%~f0\"\" %*' -Verb RunAs"
exit /B
)
pushd "%~dp0"
:: ==========================================
:: ここから下に実際の処理を記述する
:: ==========================================
echo 管理者権限で実行されています。
whoami /user
pause

このコードの仕組みは以下の通りです。

  1. 権限チェック: net session コマンドを実行し、その終了コード(errorlevel)を利用して、現在管理者権限で実行されているかを判定しています。このコマンドは管理者権限がないと失敗するため、判定用として広く標準的に利用されています。
  2. UACプロンプトの呼び出し: 管理者権限でない場合、PowerShellの Start-Process と -Verb RunAs オプションを使って、別プロセスの cmd(コマンドプロンプト)経由で自分自身(%~f0)を管理者として再起動させます。これにより、WindowsのUACによる同意または管理者資格情報の入力画面が表示されます。表示内容はユーザーアカウントやセキュリティポリシーによって異なります。
    • ※ %~f0 は、実行しているバッチファイル自身の完全修飾パスを取得する特殊なパラメーターです。
    • ※ %* を引数(-ArgumentList)に含めることで、元のバッチファイル実行時に渡された引数(パラメーター)を、管理者として再起動した後のプロセスにも正しく引き継ぐことができます。
  3. カレントディレクトリの維持: 昇格後のプロセスでは、カレントディレクトリが想定した場所になっていない場合があります。そのため pushd "%~dp0" を実行し、作業ディレクトリを「バッチファイルが実際に存在する場所」に強制的に移動させています。

【従来方式】VBScriptを使った管理者昇格コード(参考)

以前から広く利用されている方法として、VBScriptを一時生成して昇格する方法があります。

[!WARNING] VBScriptはMicrosoftによって非推奨(Deprecateddeprecated [デプリケーテッド]非推奨。将来削除される予定の機能)とされており、将来のWindowsではFeature on Demand化されたのち、削除される予定です。今後の新規スクリプトでは、VBScriptへの依存を避け、PowerShellなどの代替手段を検討することをおすすめします。

Terminal window
@echo off
:: ==========================================
:: 管理者権限の自動昇格ブロック
:: ==========================================
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (
goto UACPrompt
) else (
goto GotAdmin
)
:UACPrompt
echo 昇格要求中...
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:GotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%~dp0"
:: ==========================================
:: ここから下に実際の処理を記述する
:: ==========================================
echo 管理者権限で実行されています。
whoami /user
pause

ここでは、権限チェックに cacls.exe コマンドを使用しています。cacls.exe はWindows 11にも引き続き搭載されていますが、Microsoftでは非推奨となっており、後継として icacls.exe が案内されています。本記事では既存の自動昇格パターンで広く使われている方法として紹介しています。

実行時の注意点とトラブルシューティング

バッチファイルを自動昇格させる運用を行うにあたり、いくつか知っておくべき注意点とトラブルシューティングを解説します。

1. UACのキャンセル時の動作

紹介したコードでは、昇格要求後に元のバッチプロセスを exit /B で終了するため、UACでキャンセルした場合に同じバッチが繰り返し起動する(無限ループする)構造にはなっていません。ただし、UACの動作はユーザーアカウントや組織のセキュリティポリシーによって異なります。

2. ポリシーによる動作制限

UACや関連するセキュリティポリシーが組織の設定によって変更されている場合、想定したUACプロンプトが表示されない、または昇格が拒否される場合があります。 また、PowerShellの起動自体が組織のポリシーなどによって制限されている環境では、PowerShell方式を利用できない場合があります。

3. スクリプトの文字コード(文字化け対策)

日本語を含むバッチファイルでは、ファイルの文字コードと実行時のコンソールコードページの組み合わせによって文字化けが発生することがあります。既存環境との互換性を重視する場合は Shift-JIS(CP932) が扱いやすく、UTF-8 を利用する場合は実行環境のコードページも確認してください。

4. セキュリティ上の注意

自動昇格すると、昇格後に実行されるバッチファイル内の処理は、管理者権限で実行されます。管理者権限が必要な処理だけを昇格させるなど、必要最小限の権限で実行できる構成も検討してください。

まとめ

今回は、バッチファイルをUAC経由で自動的に管理者権限に昇格させて実行する方法を解説しました。

  • PowerShellの Start-Process -Verb RunAs を利用する方法を基本とする
  • VBScriptを利用する方法は従来の実装例だが、現在は非推奨である
  • 昇格後のカレントディレクトリをバッチファイルの配置場所に合わせるには、pushd "%~dp0" を利用します

情シス部門でのキッティング作業や、インフラの保守・メンテナンス用スクリプトの自動化において、ユーザービリティと運用性を高める方法としてぜひ活用してください。


以上で本記事の解説を終わります。
よいITライフを!
ITナレッジライフ 運営者
この記事を書いた人

Z (ITナレッジライフ)

現役のITエンジニア。Linux、プログラミング、IT用語など、日々の業務で得た「痒いところに手が届く」技術情報を発信しています。

プロフィールと編集ポリシーを見る →

ITエンジニアにお勧めの本 ↗

おすすめ

エンジニアが知っておきたい思考の整理術 複雑な情報を【理解する】【伝える】テクニック

難易度
実用性
図解

思考の整理というテーマを、実務ですぐに使える具体的な「技術」として落とし込んだ一冊です。

人気記事


記事を評価

Thanks!
目次
Scroll to Top