管理者権限があったらそのまま実行するけれど、管理者権限がなかったらUACダイアログを出して別ウィンドウでcmd.exe
を起動してそっちで実行する、というバッチファイルです。
こちらの記事を参考にさせていただきました。
基本的にはこの通りでよかったのですが、こちらはバッチファイルに引数が渡せない仕様だったので、引数を渡せるようにしました。
加えて、管理者権限の有無の確認は(自分の使う範囲では)NET FILE
で十分だったので、簡略化してしまいました。
ev.cmd
@set @dummy=0/*
@echo off
NET FILE 1>NUL 2>NUL
if "%ERRORLEVEL%" neq "0" (
cscript //nologo //E:JScript "%~f0" %*
exit /b %ERRORLEVEL%
)
REM 管理者権限で実行したい処理 ここから
echo 引数1 %~1
echo 引数2 %~2
echo 引数3 %~3
NET FILE 1>NUL 2>NUL
if "%ERRORLEVEL%" == "0" (
echo 管理者権限実行成功! NET FILE の ERRORLEVEL = %ERRORLEVEL%
) else (
echo 管理者権限実行失敗... NET FILE の ERRORLEVEL = %ERRORLEVEL%
)
pause
REM 管理者権限で実行したい処理 ここまで
goto :EOF
*/
var cmd = '"/c ""' + WScript.ScriptFullName + '" ';
for (var i = 0; i < WScript.Arguments.Length; i++) cmd += '"' + WScript.Arguments(i) + '" ';
(new ActiveXObject('Shell.Application')).ShellExecute('cmd.exe', cmd + ' "', '', 'runas', 1);
コマンドプロンプトから引数を指定して呼び出すと、以下のように引数が受け渡されるのが確認できます。
呼び出しコマンド
ev.cmd a b "c D"
引数1 a
引数2 b
引数3 c D
管理者権限実行成功! NET FILE の ERRORLEVEL = 0
続行するには何かキーを押してください . . .
制限
以下の機能はありません。
- 元ウィンドウの処理の中で、別ウィンドウの
cmd.exe
が終了するのを待つ - 別ウィンドウの
cmd.exe
から変数を引き継ぐ - 別ウィンドウの
cmd.exe
の終了時ERRORLEVEL
を取得する
これらが必要な場合は、ロックファイルを作る、ファイルを経由してデータを引き継ぐ等の処理を追加することになると思います。