運行Ruby腳本,我需要在Windows下運行在提升模式(管理員權限的)的Ruby腳本。可能嗎?提升模式
提升模式
回答
這裏是如何做到這一點。最簡單的方法是使用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
另一種方法是,以確保您不要以非管理員模式運行你的腳本。我發現這個解決方案在我的經驗中是令人滿意的。
它可以腳本是否在管理員模式下運行,像這樣被確定 -
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
我要感謝卡斯帕和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?
反覆失敗,這可以無限循環,但它完美地爲我工作。
'ShellExecute'語法應該是: 'shell.ShellExecute(「rubyw.exe」,path,「」,'runas')' 更多信息可以在這裏找到:http://rubyonwindows.blogspot.com.es/ 2007/05 /啓動,應用程序和打印,文檔,with.html –
由於其他作者,我來這個工作(在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
- 1. 在鬆弛模式下提升SyntaxError
- 2. 啓動一個過程與升高的或非提升模式
- 3. 隱式提升scala
- 4. JS「升級」模式
- 5. greenDao模式升級
- 6. 提升Web框架模塊
- 7. 函數表達式提升?
- 8. 提升正則表達式
- 9. 怎麼看的提升值:在調試模式下unordered_map與VS2010
- 10. 多個控件的單事件提升模式
- 11. 如何在powershell的提升模式下執行一組命令
- 12. 將模板傳遞給提升函數
- 13. C++提升模板參數性狀
- 14. 如何模擬提升拋出異常?
- 15. C++提升功能重載模板
- 16. 提升make_shared沒有模板參數
- 17. 鏈接提升正則表達式
- 18. 顯式實例提升multi_index容器
- 19. 提升級別
- 20. 提升make_zip_range嗎?
- 21. 變量提升
- 22. 提升權限
- 23. 提升高度
- 24. 提升Intellij IDEA?
- 25. CRITICAL_SECTION在提升?
- 26. 從提升會話開始非提升提示
- 27. 從現有模式提供新模式
- 28. XML(de)序列化和模式升級
- 29. SqlServer處於腳本升級模式
- 30. SQL Server:緩解模式更改/升級
用管理員權限打開終端(cmd.exe)並從那裏運行ruby? – Casper
是的,這是一種提升任何事情的方式不是嗎?我需要一種腳本紅寶石升級的方式。很明顯,Windows會要求輸入管理員密碼,這對我來說可以。 –