LoginSignup
7
8

More than 5 years have passed since last update.

管理者権限がなかったらUAC昇格してから実行するバッチファイル(引数指定可能)

Last updated at Posted at 2017-04-04

管理者権限があったらそのまま実行するけれど、管理者権限がなかったら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 FILEERRORLEVEL = %ERRORLEVEL%
) else (
  echo 管理者権限実行失敗... NET FILEERRORLEVEL = %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を取得する

これらが必要な場合は、ロックファイルを作る、ファイルを経由してデータを引き継ぐ等の処理を追加することになると思います。

参考ページ

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8