Windowsでシステム設定を変更するバッチファイルや、インフラ保守の自動化スクリプトを実行しようとした際、「アクセスが拒否されました」というエラーに直面して困った経験はないでしょうか。毎回バッチファイルを右クリックして「管理者として実行」を選ぶのは手間がかかりますし、エンドユーザーに配布する自動化ツールであれば、ダブルクリックを起点にUACの昇格要求を自動的に開始できると便利です。
この記事を読むと、バッチファイルの先頭に数行のコードを追加するだけで、管理者権限で自分自身を再起動(自動昇格)させて実行できるようになります。情シス担当者やヘルプデスク、インフラエンジニアの業務効率化にぜひお役立てください。
確認した環境
本記事で紹介する手順とコードは、以下の環境で動作を確認しています。
- OSOS [オーエス]Operating System。基本ソフトウェア: Windows 11
- スクリプト形式: バッチファイル(
.bat/.cmd)、PowerShell
バッチファイルを管理者権限で実行する必要性とは
Windows環境では、レジストリの保護された領域への書き込み、システムサービスの操作、システムフォルダへのファイル配置など、管理者権限が必要となる操作があります。これらの操作を含むバッチファイルを通常のダブルクリック(標準権限)で実行すると、管理者権限が必要な処理でアクセス拒否などのエラーが発生する場合があります。
本来であれば「右クリック > 管理者として実行」を選択する必要がありますが、運用の現場では以下のような課題があります。
- 作業者が「管理者として実行」を忘れてしまい、中途半端な状態でスクリプトが失敗する
- デスクトップ ショートカットや他のプログラムから自動起動させたい場合に、手動操作が挟まるため完全自動化できない
- ショートカットのプロパティから「管理者として実行」にチェックを入れる方法もあるが、ファイルや配布先が変わるたびに設定が必要になる
バッチファイル自体に「自分自身を管理者権限で再起動する」仕組みを組み込んでおけば、ユーザーが普段どおりダブルクリックするだけで、自動的にUAC(ユーザーアカウント制御)画面を呼び出して処理を続行させることができます。
【推奨】PowerShellを使った管理者権限の自動昇格コード(基本)
現在のWindows 11環境では、Windowsに標準搭載されているPowerShellの Start-Process コマンドレットを利用して管理者昇格を行う方法を基本とするのがおすすめです。
以下のコードを、作成したいバッチファイルの最上部にそのままコピーして貼り付けてください。
@echo offnet session >nul 2>&1 || ( powershell -Command "Start-Process cmd -ArgumentList '/c \"\"%~f0\"\" %*' -Verb RunAs" exit /B)pushd "%~dp0"
:: ==========================================:: ここから下に実際の処理を記述する:: ==========================================echo 管理者権限で実行されています。whoami /userpauseこのコードの仕組みは以下の通りです。
- 権限チェック:
net sessionコマンドを実行し、その終了コード(errorlevel)を利用して、現在管理者権限で実行されているかを判定しています。このコマンドは管理者権限がないと失敗するため、判定用として広く標準的に利用されています。 - UACプロンプトの呼び出し: 管理者権限でない場合、PowerShellの
Start-Processと-Verb RunAsオプションを使って、別プロセスのcmd(コマンドプロンプト)経由で自分自身(%~f0)を管理者として再起動させます。これにより、WindowsのUACによる同意または管理者資格情報の入力画面が表示されます。表示内容はユーザーアカウントやセキュリティポリシーによって異なります。- ※
%~f0は、実行しているバッチファイル自身の完全修飾パスを取得する特殊なパラメーターです。 - ※
%*を引数(-ArgumentList)に含めることで、元のバッチファイル実行時に渡された引数(パラメーター)を、管理者として再起動した後のプロセスにも正しく引き継ぐことができます。
- ※
- カレントディレクトリの維持: 昇格後のプロセスでは、カレントディレクトリが想定した場所になっていない場合があります。そのため
pushd "%~dp0"を実行し、作業ディレクトリを「バッチファイルが実際に存在する場所」に強制的に移動させています。
【従来方式】VBScriptを使った管理者昇格コード(参考)
以前から広く利用されている方法として、VBScriptを一時生成して昇格する方法があります。
[!WARNING] VBScriptはMicrosoftによって非推奨(Deprecateddeprecated [デプリケーテッド]非推奨。将来削除される予定の機能)とされており、将来のWindowsではFeature on Demand化されたのち、削除される予定です。今後の新規スクリプトでは、VBScriptへの依存を避け、PowerShellなどの代替手段を検討することをおすすめします。
@echo off:: ==========================================:: 管理者権限の自動昇格ブロック:: ==========================================>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"if '%errorlevel%' NEQ '0' ( goto UACPrompt) else ( goto GotAdmin)
:UACPromptecho 昇格要求中...echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs""%temp%\getadmin.vbs"exit /B
:GotAdminif exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )pushd "%~dp0"
:: ==========================================:: ここから下に実際の処理を記述する:: ==========================================echo 管理者権限で実行されています。whoami /userpauseここでは、権限チェックに 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ライフを!
人気記事
- 1
- 2
- 3
- 4
- 5
思考の整理というテーマを、実務ですぐに使える具体的な「技術」として落とし込んだ一冊です。