treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

バッチファイルをダブルクリックするだけで管理者で実行する

PowerShellには簡単に管理者で実行を実現するコマンドがありました。以前は複雑だったのでこれは助かります。その方法をご報告です。

PowerShellの「start-process」コマンドレット

そのコマンドレットは「start-process」です。本来はコンピュータのローカル環境でプロセスを開始するために使うコマンドレットです。コマンドプロンプトでは「start」コマンドに近いのかも。

しかしstartコマンドにない"管理者としてプロセスを起動する"という機能がオプションとして用意されています。ステキ。

書式は

start-process %実行する処理% -verb runas

start-processコマンドレットに"-verb"と"runas"オプションを付けて実行したい処理を記述します。

参考URL:<https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/start-process?view=powershell-7.4>

ここのページの「例5:管理者として PowerShell を起動する」に例としてPowerShellを「管理者として実行」オプション付きで実行するコマンドラインが記載されています。

Start-Process -FilePath "powershell" -Verb RunAs

前述の"%実行する処理%"の部分には実行ファイルを指定する場合には「-FilePath」を付けてから実行ファイルを記述する、という書式になるようです。

コマンドプロンプトから実行してみる

コマンドプロンプトで実行するには、以前<バッチファイルでPowerShellコマンド実行 - treedown’s Report>でやったように「-command」オプションを付与してPowerShellを実行する。

powershell -command start-process cmd -verb runas

これで可能。

実行すると、管理者起動ではないコマンドプロンプト画面から実行されたcmd.exeは、ユーザアカウント制御を要求してくるものの、そこを操作するだけで、

このように「管理者:」となったコマンドプロンプトを開くことが出来ます。

バッチで再帰的に実行できるかどうかを確認

ここまで試したことをバッチファイルにて使ってみようと思います。前々からバッチファイルで管理者実行じゃなかった場合に自動で管理者実行になるような仕組みを入れてみたいと思っていました。

簡単なサンプルバッチを作成してみました。

--------------------------------------------------------------
test_Echo.bat
--------------------------------------------------------------
@echo off
rem 管理者権限で実行されているかどうかを確認して実行
whoami /priv | find "SeSystemtimePrivilege" > nul
if %errorlevel% neq 0 (
 powershell -command start-process %~0 -verb runas
 exit
)

echo %~dp0
set BATCDIR=%~dp0
rem call %~dp0\test\test2co.bat

echo バッチファイルの実行ディレクトリは %~dp0
echo 管理者実行前に変数BATCDIRに入れた値は %BATCDIR%
net session
pause
--------------------------------------------------------------

最初の「whoami」コマンドの行で管理者実行されているかどうかを判断しています。管理者実行じゃないと表示されない文字列をfind指定してます。
この実行結果により、次のif文で判断して、管理者じゃないコマンドプロンプトで実行されていることが検出されたら、「powershell -command start-process %~0 -verb runas」を実行します。
実行するのは"%~0"と自分自身を指定しています。自分自身という意味の変数なので、別のバッチファイルでも書式を変えなくて使えそうです。

あとは、適当にパスを画面表示したり、管理者として実行されたコマンドプロンプトじゃないと「システム エラー 5 が発生しました。アクセスが拒否されました。」とエラーになる"net session"コマンドを実行してちゃんと管理者として実行がされているかどうかを確認しています。

実行結果

このサンプルのバッチファイルを適当な場所に保存して、

ここから実行した結果が以下です。

まずユーザアカウント制御が動作します。(これは避けようがない。)

ここを「はい」で抜けたら、自分自身を管理者として実行するコマンドが実行されて、新しいウインドウでバッチファイルの実行結果が開きます。

実行している処理はなんでもないパスを画面表示するだけなので特に重要ではないのですが、ちゃんとダブルクリックしたバッチファイルに入れておいた"管理者実行かどうか判別してコマンドプロンプトを管理者として実行する"という処理が動作していることが確認出来ます。

この検証、キッティングとかWindowsローカルユーザ作成などをバッチファイル化するのに結構役に立ってくれそうな気がしました。