Запустить скрипт ruby ​​в режиме с повышенными правами - PullRequest
8 голосов
/ 25 ноября 2011

Мне нужно запустить скрипт ruby ​​в режиме повышенных прав (привилегии администратора) под Windows.Возможно ли это?

Ответы [ 4 ]

10 голосов
/ 01 декабря 2011

Вот как это сделать. Самый простой способ - перезапустить ваш исполняемый файл с привилегиями elevaded (Admin), используя 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

2 голосов
/ 15 января 2015

Спасибо другим авторам, я пришел с этим поработать (проверено на 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()

Или у вас может быть файл launcher.cmd, содержащий

cd full\path
ruby myscript.rb

и запустите этот cmd-файл с правами администратора

Как только вы проверили с помощью ruby, вы можете попробовать rubyw

2 голосов
/ 22 августа 2013

Я хотел бы поблагодарить Каспера и 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? многократно не удался, но у меня он работал отлично.

1 голос
/ 24 октября 2012

Другой способ - убедиться, что вы не запускаете скрипт в режиме без прав администратора. Я нашел это решение удовлетворительным в моем опыте.

Можно определить, работает ли скрипт в режиме администратора, например:

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

Благодарность идет за Питера МакЭвоя за его ответ здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...