2011-11-25 15 views
8

Windowsでは、昇格モード(管理者権限)でルビースクリプトを実行する必要があります。出来ますか?ルビースクリプトを昇格モードで実行する

+2

管理者権限で端末(cmd.exe)を開き、そこからrubyを実行しますか? – Casper

+0

はい、それは何かを上げる方法ではありませんか?スクリプトのルビーが自分自身を昇格させる方法が必要です。明らかに、ウィンドウズは管理者パスワードを要求するでしょう、それは私にとっては大丈夫です。 –

答えて

10

ここでその方法を説明します。最も簡単な方法は、ShellExecuteを使用して昇格された(管理者)権限で実行可能ファイルを再起動することです。ルビー付き

あなたはこのようにそれを行う:あなたはWindowsのUACはこれが使い慣れたWindowsの管理者権限を要求し、ダイアログをポップアップあなたを与えるだろう有効にしている場合

require 'win32ole' 

shell = WIN32OLE.new('Shell.Application') 
shell.ShellExecute('path_to_ruby_program', nil, nil, 'runas') 

。 [はい]をクリックすると、プロセスは管理者権限で実行されます。

ここでの秘密の秘訣は、文書化されていないShellExecute操作パラメータrunasを使用して、要求された操作を昇格させることです。また、関連

http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx

手動で(場合によっては十分に良い解決策になるかもしれません)昇格したコマンドプロンプトのショートカットを作成する方法についての議論:

http://www.sevenforums.com/tutorials/3718-elevated-command-prompt-shortcut.html

1

もう一つの方法は、あなたを確保することです管理者以外のモードでスクリプトを実行しないでください。私はこの解決策が私の経験で満足できるものであることを発見しました。

スクリプトはそうのような管理者モードで実行されているかどうかを判断することができる

-

def running_in_admin_mode? 
    query_admin_mode_cmd = 'reg query "HKU\S-1-5-19"' 
    output, exit_status = execute_command(query_admin_mode_cmd) 
    exit_status == 0 
end 

クレジットが彼の答えのためのピーターMcEvoyさんに行くhere

2

私は、この変更のためキャスパーとthegreendroidに感謝したいと思います溶液。

私はこのように一緒に置くより多くの研究をタッチで実行するための例を得ることができませんでした。私はexecute_commandの検索を少し行いました。なぜなら、Ruby 1.9.3のインストールは何をするのか分からず、何も見つけられなかったので、私はバックティックを使いました。 \をエスケープする必要がありました。 2>&1ビットはrubyが実際には空文字列の代わりに出力を受け取るので、その出力がRegexp /ERROR/と一致する場合は管理者権限がないので、nilを返すようにします。

これは管理者権限で再起動し、requireに入力した内容をその後ろのコメントとともに読み込みます。

require 'win32ole' 
def running_in_admin_mode? 
    (`reg query HKU\\S-1-5-19 2>&1` =~ /ERROR/).nil? 
end 

if running_in_admin_mode? 
    require './main.rb' # load the actual program here. 
else 
    path = 'rubyw.exe ' + File.expand_path(__FILE__) # optionally 'ruby.exe ' 
    shell = WIN32OLE.new('Shell.Application') 
    shell.ShellExecute(path, nil, nil, 'runas') 
end 

あなたはdefブロックをドロップすると、簡潔にするために

if (`reg query HKU\\S-1-5-19 2>&1` =~ /ERROR/).nil? 

if文を変更することができます。

WIN32OLE.new('Shell.Application').ShellExecute(path, nil, nil, 'runas') 

可能ガッチャ:また、あなたはshell変数を失う可能性がrunning_in_admin_mode?が繰り返し失敗した場合、これはループを無限可能性がありますが、それは私のために完全に働きました。

+1

'ShellExecute'の構文は以下のようになります。 ' shell.ShellExecute( "rubyw.exe"、path、 "runas") ' 詳細はこちらhttp://rubyonwindows.blogspot.com.es/ 2007/05/launching-apps-and-printing-docs-with.html –

2

他の著者のおかげで、私はこれで動作するようになった(Windows上でテストした8):

は、Rubyスクリプトの先頭にこれを追加します。

def running_in_admin_mode? 
    (`reg query HKU\\S-1-5-19 2>&1` =~ /ERROR/).nil? 
end 

unless running_in_admin_mode? 
    require 'win32ole' 
    shell = WIN32OLE.new('Shell.Application') 
    shell.ShellExecute("ruby", File.expand_path(__FILE__), nil, 'runas') 
    exit 
end 

# admin rights ensured 
do_something() 

それとも、ただ持っている可能性があり

cd full\path 
ruby myscript.rb 

とを含むlauncher.cmdは、管理者権限を持つこのCMDファイルを起動

Oあなたはrubyで試したことがありますか?

関連する問題