WSHでVBScriptなスクリプトを書いたときに、Vista環境ではUACの影響で管理者権限での操作が行えなかったので調べた際のメモ。他人のVista環境で実行してもらうので、インストールの関係上PowerShellではなくWSHで書く必要があったのです。また、UACを無効にするのはダメですし、アプリケーションを追加でインストールしてもらえるとは限らないでしょうし。ま、今さら感も強いのですが、システムのデフォルト環境で動かす必要がある場合には、レガシーなものが役に立ちますからねー。
Vista環境では、通常アプリケーションを管理者権限で実行したい場合は 右クリック→「管理者として実行」で実行したり、ファイルのプロパティの 互換性タブで管理者として実行するよう設定できる。 参考: @IT - Windows Vistaでプログラムを管理者モードで実行する しかしながら、悪意のあるスクリプトが安易に実行されるのを防ぐためか WSHスクリプトには、そのようなメニューやタブは存在しない。 そのため、下記のような方法を取る必要がある。 ---------------------------------------------------------------- 1.バッチファイルを介して、管理者権限で実行する 管理者権限で実行する際には、C:\Windows\System32などのパスで実行されるので WSHスクリプトのフルパスを記述したバッチファイルを作成する。 (テキストファイルの内容を修正し、拡張子を.batにする) バッチファイルを右クリック→「管理者として実行」で実行。 2.コマンドプロンプトを管理者権限で実行し、スクリプトを実行する スタートメニューから「すべてのプログラム」→「アクセサリ」を開き 「コマンドプロンプト」の項目の上で右クリック→「管理者として実行」 で実行する。コマンドプロンプトが管理者権限で実行されるので コマンドのフルパスを入力するなどして実行する。 面倒なようなら、スタートメニューを開き、下部にある検索エリアに 「cmd」と入力して、Ctrl+Shift+Enterキーを押して管理者として起動させる。 管理者として開いた場合は、タイトルバーに「管理者: ****」のように表示される。 3.PowerToysに含まれるelevateコマンドなどを利用し管理者権限に昇格して実行する VistaのUACはrunasコマンドでの権限の昇格ができないようなので 下記のサイトを参考にし、権限昇格のためのelevateコマンドをインストールし それを介して実行する。 http://technet.microsoft.com/ja-jp/magazine/cc510320.aspx 上記の方法はどれも、操作などの手間がかかるので 下記の権限昇格のためのコードを、WSHスクリプト自体に組み込むのが楽。 4.WSHスクリプトの先頭に下記のコードを組み込む方法 Vista環境かどうかチェック(WSHのバージョンが5.7/OSバージョンが6.0以上)して、 ShellExecuteをrunasで再実行させることで、管理者権限への昇格を試みます。 (下記のスクリプトで下から3,4行目) これなら、ダブルクリックしてもらい権限の昇格の確認ダイアログで 「続行」を押すだけなので、簡単です。 下のスクリプトでは、Vista環境かどうかのチェックを行っているので 組み込んだスクリプトを、XPなどの環境で実行しても影響はありません。 Chr(34)はダブルクォート「"」を表しています。 ========================================================= Dim objWMI, objShell, osInfo, os ' Vistaかどうかチェックし管理者権限に昇格させる do while WScript.Arguments.Count = 0 and WScript.Version >= 5.7 Set objWMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set osInfo = objWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem") For Each os in osInfo If left(os.Version, 3) < 6.0 Then exit do Next ' 引数付きでwscriptを管理者権限で再実行 Set objShell=CreateObject("Shell.Application") objShell.ShellExecute "wscript.exe", Chr(34) & WScript.ScriptFullName & Chr(34) & " uac","","runas",1 WScript.Quit loop ========================================================= 参考URL Jeans & Development - Vistaにおいて、VBScriptスクリプト中で管理者権限に移行する方法 http://kandk.cafe.coocan.jp/nucleus/index.php?itemid=639 Winhelponline.com - VBScripts and UAC elevation http://www.winhelponline.com/articles/185/1/VBScripts-and-UAC-elevation.html Microsoft TechNet - Tales from the Script (WSHのバージョンやOS判別の記事あり:ページ中ほど。少し古い) http://www.microsoft.com/japan/technet/community/columns/scripts/sg0903.mspx @IT- 第7回 管理者権限での実行を制限するユーザー・アカウント制御UAC(前編)(UACをわかりやすく解説) http://www.atmarkit.co.jp/fwin2k/vista_feature/07uac01/07uac01_01.html Microsoft TechNet - Windows Vista でのユーザー アカウント制御の理解と設定 (UACの深い理解向け) http://www.microsoft.com/japan/technet/windowsvista/evaluate/feat/uaprot.mspx