2011-11-25 10 views
8

Muszę uruchomić skrypt ruby ​​w trybie podwyższonym (uprawnienia administratora) w systemie Windows. Czy to możliwe?Uruchom skrypt ruby ​​w trybie podwyższonym

+2

Otwórz terminal (cmd.exe) z uprawnieniami administratora i uruchom stamtąd ruby? – Casper

+0

Tak, to sposób na podniesienie czegokolwiek, prawda? Potrzebuję sposobu, w jaki mój rubinowy skrypt podnosi się. Oczywiście Windows poprosi o hasło administratora, to jest dla mnie ok. –

Odpowiedz

10

Oto jak to zrobić. Najprostszym sposobem jest ponowne uruchomienie pliku wykonywalnego z uprawnieniami wyższymi (Admin) przy użyciu ShellExecute.

z Ruby to zrobić tak:

require 'win32ole' 

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

Jeśli masz włączone UAC w systemie Windows to daje znajome systemu Windows pojawi się okno dialogowe, które żąda uprawnienia administratora. Po kliknięciu "Tak" proces zostanie uruchomiony z uprawnieniami administratora.

Ta tajemna sztuczka polega na użyciu nieudokumentowanego parametru ShellExecute, który podniesie żądaną operację.

http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx

związane także dyskusję na temat ręcznego tworzenia podwyższonej wiersza polecenia skrótu (który może być na tyle dobrym rozwiązaniem w niektórych przypadkach):

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

1

Inną metodą jest zapewnienie Państwu nie uruchamiaj skryptu w trybie nieadministracyjnym. Z mojego doświadczenia wynika, że ​​to rozwiązanie jest satysfakcjonujące.

Można określić, czy skrypt jest uruchomiony w trybie administratora jak tak -

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 

zasługa Peter McEvoy na jego odpowiedź here

2

Chciałbym podziękować Casper i thegreendroid za to zmodyfikowana rozwiązanie.

Nie mogłem uruchomić ich przykładów tak, jak jest, więc przy odrobinie więcej badań poskładałem to razem. Zrobiłem trochę wyszukiwania dla execute_command, ponieważ moja instalacja Ruby 1.9.3 nie wiedziała, co z tym zrobić i nie mogłem nic znaleźć, więc użyłem backtików. \ trzeba było uciec. Bit 2>&1 jest tak, że ruby ​​faktycznie pobiera dane wyjściowe zamiast pustego łańcucha, a jeśli to wyjście jest zgodne z Regexpem /ERROR/, to nie masz uprawnień administratora, więc chcemy, aby powrócił on nil.

To ponownie uruchomi się z uprawnieniami administracyjnymi, a następnie załaduje wszystko, co umieścisz w require z komentarzem po nim.

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 

Ty może spaść blok def i zmienić oświadczenie if do

if (`reg query HKU\\S-1-5-19 2>&1` =~ /ERROR/).nil? 

dla zwięzłości. Również można stracić shell zmiennej:

WIN32OLE.new('Shell.Application').ShellExecute(path, nil, nil, 'runas') 

Możliwa Gotcha: To może nieskończoną pętlę jeśli running_in_admin_mode? nie wielokrotnie, ale to działało idealnie dla mnie.

+1

Składnia 'ShellExecute' powinna być: ' shell.ShellExecute ("rubyw.exe", ścieżka, "", "runas") ' więcej informacji można znaleźć tutaj: http://rubyonwindows.blogspot.com.es/ 2007/05/launching-apps-and-printing-docs-with.html –

2

Dzięki innych autorów, mam przyjść do pracy z tym (testowane na Windows 8):

Dodaj ten na górze skryptu 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() 

Lub może po prostu trzeba launcher.cmd zawierający

cd full\path 
ruby myscript.rb 

i uruchomić ten plik cmd z prawami administratora

O nce przetestowałeś z ruby ​​możesz spróbować rubyw

Powiązane problemy