相対パスを指定して、UAC が働く「管理者として」、バッチを起動するショートカットを作る


相対パスを指定して、コマンドやアプリケーションを管理者権限で実行するような、ショートカットを作成したい。

管理者としてでなければ、ショートカットのプロパティで「作業フォルダ」を空白にしておくと、エクスプローラからショートカットを起動したときに、ショートカットの場所がカレントディレクトリ(作業フォルダ)になることを利用して、

"%ComSpec%" /C START "" "<相対パス>" [引数...]

としたショートカットを作成することで実現できる。
(一瞬コマンドプロンプトが立ち上がる問題は、「実行時の大きさ」を最小化にしておくことである程度回避可能)

ところが、ショートカットの詳細設定から「管理者として実行」を選んでしまうと、カレントディレクトリが %SystemRoot%\system32 へ勝手に変更されてしまう。
こうなると、上記のショートカットでは %SystemRoot%\system32 からの相対パスを開こうとするため、意図した動作にならない。

このため、 UAC を起動させる ものと、カレントディレクトリの情報を渡す ものの 2つのショートカットを作成することで実現させる。

START コマンドを使うので、内容を理解する場合はこのコマンドのヘルプをよく読み込んでおくと良いかも知れない。

START ["タイトル"] [/D パス] (中略) [コマンド/プログラム] [パラメーター]

    "タイトル"  ウィンドウのタイトル バーに表示するタイトル。
    パス        開始するディレクトリ。

    コマンド/プログラム
                内部コマンドまたはバッチ ファイルの場合、コマンド プロセッサ
                は cmd.exe の /K オプションを使用して実行されます。
                これは コマンドの後でもウィンドウが残ることを意味
                します。

                内部コマンドまたはバッチ ファイルではない場合、そのプログラム
                はウィンドウ モードのアプリケーションまたはコンソール
                アプリケーションとして動作します。

   パラメーター
               コマンド/プログラムに渡すパラメーターです。

UAC を起動させるショートカット

まずは、指定した プログラム/コマンド を パラメータ付きで 管理者として実行するショートカットを作成する。

以下の様にプロパティを設定したショートカットを作成しよう。

ファイル名:
  RunAsAdmin.lnk (お好きな名前でどうぞ)
リンク先:

%ComSpec% /C START ""

実行時の大きさ:
  最小化
詳細設定→管理者として実行:
  ☑

RunAsAdmin.lnk の設定

これ単体でも、ファイルを RunAsAdmin.lnk のショートカットに D&D するだけで、そのファイル(またはプログラム)を管理者として開くことができる。

また、上記の START コマンドのヘルプの通り、/D オプションで開くプログラムのカレントディレクトリを指定できるのがミソで、たとえばコマンドプロンプトから、

RunAsAdmin.lnk /D "C:\Program Files" dir

とすれば、 Program Files をカレントディレクトリとした dir コマンドを実行できる。

相対パスでコマンドを立ち上げる

お次は、相対パスで特定のファイルやプログラムを開くショートカットを作成する。

ファイル名:
  test.cmd – Call.lnk (これまたお好きな名前でどうぞ)
リンク先:

%ComSpec% /C RunAsAdmin.lnk /D "%CD%" test.cmd hoge

作業フォルダ:
  (空)
実行時の大きさ:
  通常のウィンドウ

test.cmd - Call.lnk の設定

実行時の大きさを最小にしてしまうと、 UAC のダイアログも最小化してしまい便が悪いので、一瞬 コマンドプロンプトが立ち上がるため若干見栄えは悪いが、通常のウィンドウとして置いた方が良いだろう。

実行

これで、エクスプローラから test.cmd - Call.lnk をダブルクリックで起動しよう。
たとえば、test.cmd - Call.lnk, RunAsAdmin.lnk, test.cmd いずれも C:\ に置いてある場合、以下の様な動きになる。

まずは C:\ がカレントディレクトリとなり、

%ComSpec% /C RunAsAdmin.lnk /D "C:\" test.cmd hoge

が実行される。

次に、RunAsAdmin.lnk は管理者として起動するオプションが選択されているため、UAC の確認ダイアログが表示され、%SystemRoot%\system32 がカレントディレクトリとなり、

%ComSpec% /C START "" /D "C:\" test.cmd hoge

が実行される。

最後に、START コマンドの機能により、C:\ がカレントディレクトリとなり、

test.cmd hoge

が実行される。

参考

ショートカットに相対パスを指定する。: Windows Script Programming
http://scripting.cocolog-nifty.com/blog/2008/01/post_4a6a.html

コマンドラインから、UACダイアログを出して「管理者として実行」する。: Windows Script Programming
http://scripting.cocolog-nifty.com/blog/2009/12/uac-b9c9.html

コメントを残す

メールアドレスが公開されることはありません。