2011-11-25 16 views
8

se necesita para ejecutar una secuencia de comandos de rubí en modo elevado (privilegios de administrador) en Windows. ¿Es posible?Ejecutar script de rubí en modo elevado

+2

Abra una terminal (cmd.exe) con privilegios de administrador y ejecute ruby ​​desde allí? – Casper

+0

Sí, esa es una forma de elevar cualquier cosa ¿no? Necesito una forma en que mi guión ruby ​​se eleve a sí mismo. Obviamente, Windows le pedirá una contraseña de administrador, eso está bien para mí. –

Respuesta

10

Aquí es cómo hacerlo. La forma más fácil es reiniciar su ejecutable con privilegios elevados (Admin) usando ShellExecute.

con Ruby que hacerlo de esta manera:

require 'win32ole' 

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

Si tiene Windows UAC activado esto le dará los familiares de Windows pop-up de diálogo que solicita privilegios de administrador. Una vez que haga clic en Sí, su proceso se ejecutará con derechos de administrador.

El truco secreto aquí es utilizar el parámetro de operación ShellExecute no documentado runas, que elevará la operación solicitada.

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

También relacionado discusión sobre cómo crear manualmente un acceso directo símbolo del sistema elevado (que podría ser una buena solución en algunos casos):

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

1

Otro método consiste en asegurarse de que no ejecute su script en modo no administrador. He encontrado que esta solución es satisfactoria en mi experiencia.

Se puede determinar si una secuencia de comandos se ejecuta en modo de administración como tal -

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 

crédito va a Peter McEvoy por su respuesta here

2

me gustaría dar las gracias a Casper y thegreendroid para este modificado solución.

no pude conseguir sus ejemplos se ejecuten como es así que con un toque más investigación pongo esto juntos. Hice un poco de una búsqueda de execute_command, ya que mi instalación de ruby ​​1.9.3 no sabía qué hacer con ella, y no pude encontrar nada, así que utilicé los backticks. El \ tuvo que ser escapado. El bit 2>&1 es tan rubí en realidad recibe la salida en lugar de una cadena en blanco, y si esa salida coincide con la expresión regular /ERROR/ entonces usted no tiene privilegios de administrador, por lo que queremos que vuelva nil.

Esto relanzar sí con privilegios administrativos a continuación, cargar lo que pones en el require con el comentario después de ella.

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 

que podría caer el bloque def y cambiar el estado de if a

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

en aras de la brevedad. También podría perder la variable shell:

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

Posible Gotcha: Esto podría bucle infinito si running_in_admin_mode? falla en repetidas ocasiones, pero funcionó perfectamente para mí.

+1

La sintaxis 'ShellExecute' debe ser: ' shell.ShellExecute ("rubyw.exe", ruta, "", 'runas') ' más información se puede encontrar aquí: http://rubyonwindows.blogspot.com.es/ 2007/05/launching-apps-and-printing-docs-with.html –

2

Gracias a otros autores, que han venido a trabajar con este (probado en Windows 8):

Añadir esta en la parte superior de un guión de rubí:

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

O simplemente podrían tener un launcher.cmd contiene

cd full\path 
ruby myscript.rb 

y lanzar este archivo cmd con derechos de administrador

O Una vez que haya probado con ruby, puede probar rubyw

Cuestiones relacionadas