相対パスを指定して、コマンドやアプリケーションを管理者権限で実行するような、ショートカットを作成したい。
管理者としてでなければ、ショートカットのプロパティで「作業フォルダ」を空白にしておくと、エクスプローラからショートカットを起動したときに、ショートカットの場所がカレントディレクトリ(作業フォルダ)になることを利用して、
"%ComSpec%" /C START "" "<相対パス>" [引数...]
としたショートカットを作成することで実現できる。
(一瞬コマンドプロンプトが立ち上がる問題は、「実行時の大きさ」を最小化にしておくことである程度回避可能)
ところが、ショートカットの詳細設定から「管理者として実行」を選んでしまうと、カレントディレクトリが %SystemRoot%\system32 へ勝手に変更されてしまう。
こうなると、上記のショートカットでは %SystemRoot%\system32 からの相対パスを開こうとするため、意図した動作にならない。
このため、 UAC を起動させる ものと、カレントディレクトリの情報を渡す ものの 2つのショートカットを作成することで実現させる。
START コマンドを使うので、内容を理解する場合はこのコマンドのヘルプをよく読み込んでおくと良いかも知れない。
START ["タイトル"] [/D パス] (中略) [コマンド/プログラム] [パラメーター] "タイトル" ウィンドウのタイトル バーに表示するタイトル。 パス 開始するディレクトリ。 コマンド/プログラム 内部コマンドまたはバッチ ファイルの場合、コマンド プロセッサ は cmd.exe の /K オプションを使用して実行されます。 これは コマンドの後でもウィンドウが残ることを意味 します。 内部コマンドまたはバッチ ファイルではない場合、そのプログラム はウィンドウ モードのアプリケーションまたはコンソール アプリケーションとして動作します。 パラメーター コマンド/プログラムに渡すパラメーターです。
UAC を起動させるショートカット
まずは、指定した プログラム/コマンド を パラメータ付きで 管理者として実行するショートカットを作成する。
以下の様にプロパティを設定したショートカットを作成しよう。
ファイル名:
RunAsAdmin.lnk (お好きな名前でどうぞ)
リンク先:
%ComSpec% /C START ""
実行時の大きさ:
最小化
詳細設定→管理者として実行:
☑
これ単体でも、ファイルを 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
作業フォルダ:
(空)
実行時の大きさ:
通常のウィンドウ
実行時の大きさを最小にしてしまうと、 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