バッチファイルを管理者権限を確認して権限ありで実行させるスクリプト例

バッチファイル自体を管理者権限で実行させるための PowerShell コマンドレットを組み込んだスクリプト例を紹介します。
コマンドエコーを無効にする設定や、バッチが管理者権限で実行されているかどうかを判定する方法、コマンドプロンプトは終了せずに不要なバッチだけを終了させるコマンドオプションも紹介します。

バッチファイルを管理者権限で実行させるスクリプト例と文字コードによる文字化け2

スクリプト例

管理者権限なしの場合は、管理者権限ありで同じバッチを起動するバッチファイルの例です。

REM から始まる行はコメント扱いで無視されます。

@echo off

REM 管理者かどうか判定し、違うなら再起動(管理者として)
net session >nul 2>&1
if %errorLevel% neq 0 (
    echo 管理者権限で再実行します...
    powershell -Command "Start-Process '%~f0' -Verb runAs"
    exit /b
)
echo 管理者として実行されています。
REM ここに処理を記述します。

echo 処理が完了しました。ウィンドウを閉じるには何かキーを押してください。
pause >nul

文字化けを防ぐため、文字コードは Shift-JIS で、改行コードは CRLF保存してください。
UTF-8 で行った場合に起きた文字化けや誤認について次回の記事を参照してください。

以下は、各コマンドなどの説明です。

不要なメッセージ標準出力の抑制

echo off によって、コマンド実行時の標準出力(コマンドエコー)を抑制します。
@ を行頭につけることで、これ自体の標準出力も抑制します。
echo コマンドによる標準出力は、 echo off の場合も標準出力されます。

@echo off

echo
echoコマンドは標準出力にメッセージを表示する。メッセージ文字列をダブルクォーテーションやシングルクォーテーションなどで囲む必要はない。

また、echo onおよびecho offでコマンドエコーのON/OFFを切り替えることができる。コマンドエコーは既定でONになっており、各コマンド行を実行する前に標準出力にその内容を表示する[4]。この動作は通常必要とされないので、echo off コマンドをバッチファイルの最初に記述してそれを防ぐ。しかし、そのままでは echo off コマンド自体は表示されてしまう。単価記号 @ をコマンド行の先頭に置くと、その行は表示されないようになっているので、多くのバッチファイルには @echo off という行が先頭にある。

バッチファイル – Wikipedia

管理者権限が有効であることを試すコマンドを実行

net session 自体はコマンドのひとつですが、これは管理者権限が必要なコマンドのため、管理者権限がないと最後に実行した内容のエラーの値を持つ %errorLevel% が 0 以外になります。
これを利用して、管理者権限ありで実行しているかを確認します。

net session >nul 2>&1

net sessionコマンドは管理者でないと実行できないことを利用しています。
net sessionコマンドを実行した結果がエラーとなれば管理者ではない、エラーにならなければ管理者と判断しています。

[Windowsバッチ] 管理者権限で実行しているか判定する | ぱそまき

net sessionは、共有にアクセスされているセッションの確認/切断するコマンドです。

net session – Windowsコマンド虎の巻

管理者権限が必要なコマンドの成功・失敗の判定

コマンドの実行直後、それが成功したかどうかを %errorLevel% 変数で確認できます。
neq は比較演算子のひとつで、値が異なる (not equal) 場合に真 (true) を返します。
例では、 %errorLevel% が 0 以外の場合にその次の () 内の処理を実行します。。

if %errorLevel% neq 0 (

現在の ERRORLEVEL の値に展開します。

バッチファイル – Wikipedia
演算子意味
EQU等しい
NEQ等しくない
LSSより小さい
LEQ以下
GTRより大きい
GEQ以上
コマンドプロンプト | バッチファイルで条件分岐を使う(IF)

管理者権限でこのバッチ自体を起動する

コマンドプロンプトで PowerShellStart-Process コマンドレットを用いて、管理者権限でこのバッチを起動します。

powershell -Command "Start-Process '%~f0' -Verb runAs"

powershell -Command “PowerShell コマンドレット“
と書くことで、コマンドプロンプト上で PowerShell コマンドレットが実行できます。

【PowerShell】コマンドプロンプトでPowerShellコマンドレットを実行する | てこエンジニアブログ

ローカル コンピューター上の 1 つ以上のプロセスを開始します。

-Verb
このコマンドレットがプロセスを開始するときに使用する動詞を指定します。 使用できる動詞は、プロセスで実行されるファイルのファイル名拡張子によって決まります。

この例では、[管理者として実行] オプションを使用して PowerShell を起動します
Start-Process -FilePath “powershell” -Verb RunAs

Start-Process (Microsoft.PowerShell.Management) – PowerShell | Microsoft Learn
書式説明
%~f0変数を完全なパス文字列に展開C:\Documents and Settings\xxxxxxxx\デスクトップ\X.bat
バッチファイル基礎文法リファレンス #コマンドプロンプト – Qiita

管理者権限でバッチを起動後、自身のバッチ処理のみを終了

起動中のコマンドプロンプトで、管理者権限でバッチを起動した後、このバッチ処理のプロセスを終了します。
/b をつけることで、上位からの呼び出しで、上位を巻き込んで終了することを防ぎます。
/b をつけない場合は、たとえば、このバッチファイルが上位から呼び出された場合、その上位のプロセスも含めて終了してしまいます。

exit /b

コマンド インタープリターまたは現在のバッチ スクリプトを終了します。

/b
Cmd.exe を終了するのではなく、現在のバッチ スクリプトを終了します。 バッチ スクリプトの外部から実行された場合は、Cmd.exe を終了します。

終了する | Microsoft Learn

/B オプションを付けるとバッチファイルだけが終了してコマンドプロンプトへ制御が戻ります。

コマンドプロンプト | コマンドプロンプトまたはバッチファイルを終了(EXIT)

実行結果

バッチファイルをダブルクリックして、管理者権限なしで実行すると、判定が行われて管理者権限ありで実行する PowerShell の処理が行われました。
これにより、 UAC(ユーザーアカウント制御)の画面が表示され、そこで同意して進むと、今度は、管理者権限があることで、管理者権限ありの場合の処理に進み、echo のメッセージが表示されました。

バッチファイルを管理者権限で実行させるスクリプト例と文字コードによる文字化け2

まとめ

バッチファイル自体を管理者権限で実行させるための PowerShell コマンドレットを組み込んだスクリプト例を紹介します。
コマンドエコーを無効にする設定や、バッチが管理者権限で実行されているかどうかを判定する方法、コマンドプロンプトは終了せずに不要なバッチだけを終了させるコマンドオプションも紹介します。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました