Я хотел бы поблагодарить Каспера и thegreendroid за это модифицированное решение.
Я не смог заставить их примеры работать как есть, поэтому с помощью дополнительных исследований я собрал их вместе.Я немного искал execute_command
, так как моя установка ruby 1.9.3 не знала, что с ним делать, и я не мог ничего найти, поэтому использовал обратные ссылки.\
должен был сбежать.Бит 2>&1
такой, что ruby фактически получает вывод вместо пустой строки, и если этот вывод соответствует Regexp /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?
многократно не удался, но у меня он работал отлично.