簡體   English   中英

在提升模式下運行 ruby​​ 腳本

[英]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​​ 測試過,你就可以試試 ruby​​w

另一種方法是確保您不在非管理員模式下運行您的腳本。 根據我的經驗,我發現這個解決方案是令人滿意的。

可以像這樣確定腳本是否在管理員模式下運行 -

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM