2011-11-25 193 views
8

運行Ruby腳本,我需要在Windows下運行在提升模式(管理員權限的)的Ruby腳本。可能嗎?提升模式

+2

用管理員權限打開終端(cmd.exe)並從那裏運行ruby? – Casper

+0

是的,這是一種提升任何事情的方式不是嗎?我需要一種腳本紅寶石升級的方式。很明顯,Windows會要求輸入管理員密碼,這對我來說可以。 –

回答

10

這裏是如何做到這一點。最簡單的方法是使用ShellExecute以elevaded(管理員)權限重新啓動可執行文件。

隨着Ruby中,你做這樣的:

require 'win32ole' 

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

如果你啓用了Windows UAC這會給你熟悉的Windows彈出對話框,請求管理員權限。一旦你點擊是,你的進程將以管理員權限運行。

這裏的祕密技巧是使用未公開的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 

幸得彼得·麥克沃伊他的回答here

2

我要感謝卡斯帕和thegreendroid此修改解。

我無法讓他們的例子運行,所以通過觸摸更多的研究,我把它放在一起。我做了一些搜索execute_command,因爲我安裝的ruby 1.9.3不知道如何處理它,我找不到任何東西,所以我用反引號。 \必須逃脫。該2>&1位是如此ruby實際上得到輸出,而不是一個空白字符串,如果該輸出匹配正則表達式/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聲明

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

爲簡潔起見。你也可以失去shell變量:

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

可能的疑難雜症:如果running_in_admin_mode?反覆失敗,這可以無限循環,但它完美地爲我工作。

+1

'ShellExecute'語法應該是: 'shell.ShellExecute(「rubyw.exe」,path,「」,'runas')' 更多信息可以在這裏找到:http://rubyonwindows.blogspot.com.es/ 2007/05 /啓動,應用程序和打印,文檔,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文件

Ø你已經用紅寶石測試過,你可以試試rubyw