2012.05.07 誤記など少し修正しました。
ファイラー派にとってUACは邪魔者!
私はランチャーにCraftLaunch(旧版2.x)を、ファイラーにあふwを使っている。Vista以降のWindowsにはUAC(User Access Control)というウザいセキュリティを強化する機能が搭載され、デフォルトで有効になっているわけだが、こいつとファイラーやランチャーとの相性があまりよくない。
通常、アプリケーションを昇格した権限で起動するには、アイコンを右クリックして「管理者として実行」を選択しなければならないが、この操作をコマンドラインから実行する方法が用意されていないためである。
("runas"で権限昇格できると勘違いしている人がたまにいるけど、できませんよ。)
Figure.1 ファイラで右クリックし「管理者として実行」を選ぶのはダサい |
また、タスクスケジューラを使う技(アプリをタスクとして登録し、"最上位の特権で実行する"を有効にし、schtasks /runで実行する)もあるが、あまりスマートな方法とは言い難い。
Elevation PowertoysでコマンドラインからUAC昇格を行う
この悩みを解消してくれるのが、Elevation Powertoys である。こいつをインストールすると"elevate"というコマンドが使えるようになり、"elevate <任意のexe>"とやることでアプリを昇格した権限で起動することができる。こいつをファイラーやランチャーに登録してやればよい。(なお、UACの確認ダイアログは表示される。これを回避することはできない。)
インストール手順は以下の通り。
1.
Utility Spotlight: Script Elevation PowerToys for Windows VistaからElevation2008_06.exeをダウンロードする。
このファイルは自己解凍書庫なので、実行して適当なフォルダに解凍する。
↑はVista用なので、Windows 7の場合は、上記に加えて
The Elevation PowerToys and Windows 7 - The Deployment Guys - Site Home - TechNet Blogs
からElevate_Win7beta_fixed.zipをダウンロードする。
中に入っているElevate.vbsを、上記で解凍したフォルダ内に上書きする。
2.
ElevateCommand.infを右クリックし、「インストール」を選択する
Utility Spotlight: Script Elevation PowerToys for Windows VistaからElevation2008_06.exeをダウンロードする。
このファイルは自己解凍書庫なので、実行して適当なフォルダに解凍する。
↑はVista用なので、Windows 7の場合は、上記に加えて
The Elevation PowerToys and Windows 7 - The Deployment Guys - Site Home - TechNet Blogs
からElevate_Win7beta_fixed.zipをダウンロードする。
中に入っているElevate.vbsを、上記で解凍したフォルダ内に上書きする。
2.
ElevateCommand.infを右クリックし、「インストール」を選択する
なお、Elevation Powertoysには他にも右クリックメニュー拡張などのオマケが入っているが、ファイラーを使う私にとっては無用の長物であるため、ここでは解説しない。
余談
KaoriYa版Gvim(64bit)やConsole2(64bit)って、gdippやezgdiでのアンチエイリアスが効かないのは何故なのだろうか。GVim(32bit)やConsole2(32bit)とgdi++(32bit)の組み合わせであればアンチエイリアスが効くんだけど。なんでかな。余談2:32Bitアプリケーションを昇格する時の注意点
上記の理由で、私はGVimやConsole2は32bit版を使い続けているのだが、64bit OS上の32bitアプリケーションで%windir%\System32にアクセスしようとすると、フォルダリダイレクションでSysWOW64に飛ばされて鬱陶しい。32bitアプリケーションからSystem32にアクセスするためには、%windir%\sysnativeというパスを使えばよいのだが、これが結構厄介だ。
elevateコマンドは%windir%\System32配下に配置されるが、これを32bitアプリケーションから呼び出す場合は%windir%\sysnative\elevate.cmdを、64bitアプリケーションから呼び出す場合は%windir%\System32\elevate.cmdを呼び出さなければならない。ランチャーやファイラーに設定する際にこの辺りを考慮してあげなければならない。
とりあえず私は、環境変数PROCESSOR_ARCHITECTURE、PROCESSOR_ARCHITEW6432あたりを見て、32bitアプリケーションからの呼び出しだったらsysnative、64bitアプリケーションからの呼び出しだったらSystem32にアクセスするスクリプトを書いて、それをランチャーとファイラーに登録している。
例として、32bit版Console2を昇格した権限で起動するVBScriptを下記に挙げる。
引数にフォルダパスを与えると、そのパスをカレントとしてConsole2が起動するようになっている。
このスクリプト1本で、32bitアプリケーションと64bitアプリケーションのどちらから32bit版Console2を呼び出してもうまく動作する。
(私の環境では、もう一工夫してgdi++経由で起動するようにしてある)
Figure.2 私のあふはこんな感じ |
Dim ws, cmdpath Dim arg Dim gdi cmdpath = "C:\Windows\System32" Set ws = CreateObject("WScript.Shell") arg = " -w ""管理者: Console2""" If WScript.arguments.length > 0 Then arg = arg & " -d """ & WScript.Arguments.item(0) & """" End If ' if this script is running on wow64, ' replace "system32" to "sysnative" ' because console.exe is a 32bit application. If ws.ExpandEnvironmentStrings("%PROCESSOR_ARCHITEW6432%") _ = "AMD64" Then cmdpath = "C:\Windows\sysnative" arg = Replace(arg, "C:\Windows\System32", _ "C:\Windows\sysnative") End If If ws.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%") _ = "AMD64" Then arg = Replace(arg, "C:\Windows\System32", _ "C:\Windows\sysnative") End If ws.Run cmdpath & _ "\cmd.exe /c elevate.cmd %APP%\Console\Console.exe" & _ arg, vbHide
0 コメント:
コメントを投稿