著作一覧 |
ふと考えて、gem.batにge.bat.manifestを作って、その中で <requestedExecutionLevel level="requireAdministrator"/>とかすると、簡単にUACダイアログとか出せるかと試してみたが、できなかった。
exeとdllにしか、本当に使えないのか。当然か。しかし、それはなんか中途半端だな(というか、本来サイドバイサイド設定のファイル(もちろんバッチファイルには意味ないだろう)に、信頼性情報(もちろんバッチファイルにも意味がある)とかも一緒に入れてしまったところが、間違いのような気もしないでもない)。
というか、Administratorが隠されたために、runasの意味がなくなっている点が面倒なところなのかも。(汎用性がなくなっちゃったってことだ)
もしかして、Windowsの開発者はバッチを使わないのかな?
sudoして実行したシェルスクリプトが起動するプログラムが権限を継承しなかったら、それは意味ない。例)sudo /etc/init.d/apache reload
と、もう消えちゃったが、runasとかvistaとかで検索していたら、昇格したプログラムからの別のプログラムを起動する場合の継承について問題視している記事を見て思った。
| ジェズイットを見習え |
>バッチはバッチ
「Process.Start メソッドでバッチファイルを実行するにはどうしたらいいですか?」って質問を思い出しました.
http://msdn2.microsoft.com/ja-jp/library/system.diagnostics.process.start.aspx
ヒント: cmd.exe /?
昨日はありがとうございました。
……今度のは難しいですね(まだわかっていない)。
うわ,ややこしくしちゃってすみません.
Windows のバッチファイルというのは以前から cmd.exe の解釈するテキストファイルという点は変わっていなくて基本は cmd /c gem.bat だよね,みたいなことを考えてました.
つまり,sudo (runas) して実行したシェル (cmd.exe) が実行するシェルスクリプトから起動するプログラム (ややこしい) は,Vista でも変わらず sudo した権限を継承するので,本質的には「というか〜」以降の問題のみじゃなかろうかなと.
んで,本題というか Vista 対策ですが,ShellExecute の verb を runas にするという手があるそうです.以下のような myrunas.bat を作って,
myrunas gem.bat hoge fuga
みたいなのはできるようですね.
================myrunas.bat================
@if(0)==(0) ECHO OFF
CScript.exe //NoLogo //E:JScript "%~f0" %*
GOTO :EOF
@end
var args = [];
for(var i=1;i<WScript.Arguments.Length;i++){
args[i-1] = WScript.Arguments.Item(i);
}
var command = WScript.Arguments.Item(0);
new ActiveXObject("Shell.Application").ShellExecute(command, args.join(" "), null, "runas");
================================
このバッチファイルと JScript の混載テクニックは以下のページから拝借しています.(源流はどこだろう?)
http://scripting.cocolog-nifty.com/blog/
そういう意味でしたか。どうもありがとうございます。
ただ、そのやり方は、Ruby自身にやらされる(同じ方法を利用してバッチファイルへ埋め込んだJScriptではなくRubyで実行)ので、それほど嬉しくはないわけです。
つまり、元のバッチファイルには手を一切触れずに、しかもエクスプローラからの右クリック−管理者として実行、もせずに、マニフェストを追加するだけで管理者権限で動かせられるといいなぁ、ということで(元のバッチを変えずに、コマンドラインだけで可能という意味ではRunAsもそうだと、以前は言えたわけですが)。