[英]Run ruby script in elevated mode
我需要在 Windows 下以提升模式(管理員權限)運行 ruby 腳本。 是否可以?
這是如何做到的。 最簡單的方法是使用ShellExecute
以提升的(管理員)權限重新啟動可執行文件。
使用 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
我要感謝 Casper 和 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?
這可能會無限循環running_in_admin_mode?
反復失敗,但它對我來說非常有效。
感謝其他作者,我開始處理這個問題(在 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
並以管理員權限啟動此 cmd 文件
一旦你用 ruby 測試過,你就可以試試 rubyw
另一種方法是確保您不在非管理員模式下運行您的腳本。 根據我的經驗,我發現這個解決方案是令人滿意的。
可以像這樣確定腳本是否在管理員模式下運行 -
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
歸功於 Peter McEvoy 在此處的回答
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.