昇格モードでrubyスクリプトを実行する

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

8
はい、それは何かを上げる方法ではありませんか?スクリプトのルビーが自分自身を昇格させる方法が必要です。明らかに、ウィンドウズは管理者パスワードを要求するでしょう、それは私にとっては大丈夫です。
追加された 著者 Ricardo Acras,
管理者権限を持つ端末(cmd.exe)を開き、そこからrubyを実行しますか?
追加された 著者 Casper,

4 答え

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

Rubyではこれを次のように行います:

require 'win32ole'

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

Windows UACを有効にすると、管理者権限を要求する使い慣れたWindowsのポップアップダイアログが表示されます。 [はい]をクリックすると、プロセスは管理者権限で実行されます。

この秘密の秘訣は、文書化されていない ShellExecute 操作パラメータ runas を使用して、要求された操作を呼び出すことです。

http://hdc.co.jp /library/windows/desktop/bb762153(v=vs.85).aspx

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

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

10
追加された

他の著者のおかげで、私はこれを使って作業しました(Windows 8でテスト済み):

これをルビスクリプトの先頭に追加します:

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()

または、launcher.cmdを含むことができます

cd full\path
ruby myscript.rb

このcmdファイルを管理者権限で起動します

あなたがrubyでテストしたら、rubywを試すことができます

2
追加された

私はこの修正されたソリューションのCasperとthegreendroidに感謝したいと思います。

I couldn't get their examples to run as is so with a touch more research I put this together. I did a bit of a search for execute_command, as my installation of ruby 1.9.3 didn't know what to do with it, and I couldn't find anything so I used backticks. The \ had to be escaped. The 2>&1 bit is so ruby actually gets the output instead of a blank string, and if that output matches the Regexp /ERROR/ then you don't have admin privileges, so we want it to return 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')

Possible Gotcha: running_in_admin_mode?が繰り返し失敗した場合、これは無限ループになる可能性がありますが、完璧に機能しました。

2
追加された
shell.ShellExecute( "rubyw.exe"、path、 ""、runas ') ShellExecute の構文は次のとおりです。 ruby​​onwindows.blogspot.com.es/2007/05/&hellip ;
追加された 著者 Lluís,

もう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

Credit goes to Peter McEvoy for his answer here

1
追加された