2012年5月2日水曜日

Elevation Powertoysで64bit Windows/UAC環境下のファイラーやランチャーを強化

2012.07.02 64bit版Console2に関する記述を修正しました。
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を右クリックし、「インストール」を選択する

なお、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 私のあふはこんな感じ
※スクリプト動作の前提条件: 私の環境では環境変数%APP%にアプリのインストール先パスを指定している(例:"D:\App")。 Console2のパスは %APP%\Console\Console.exe
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 コメント:

コメントを投稿