46 votos

Solicitud de elevación de UAC, desde dentro de una secuencia de comandos de Python?

Quiero que mi secuencia de comandos de Python para copiar los archivos en la Vista. Cuando lo ejecuto normal cmd.exe ventana, no se generan errores, sin embargo, los archivos NO se copian. Si me quedo cmd.exe "como administrador" y, a continuación, ejecutar mi script, funciona bien.

Esto tiene sentido desde el Control de Cuentas de Usuario (UAC) normalmente impide que muchas de archivos de sistema de acciones.

Hay una manera que puedo, desde dentro de una secuencia de comandos de Python, invocar una elevación de UAC (solicitud de aquellos diálogos que dicen algo así como "tal y tal aplicación necesita acceso de administrador, es correcto esto?")

Si eso no es posible, hay una manera de que mi script se puede, al menos, detectar que no es elevada por lo que puede fallar correctamente?

42voto

Jorenko Puntos 1174

Me tomó un poco de tiempo para conseguir dguaraglia la respuesta de trabajo, por lo que en aras de salvar a otros, aquí es lo que hice para la implementación de esta idea:

import os
import sys
import win32com.shell.shell as shell
ASADMIN = 'asadmin'

if sys.argv[-1] != ASADMIN:
    script = os.path.abspath(sys.argv[0])
    params = ' '.join([script] + sys.argv[1:] + [ASADMIN])
    shell.ShellExecuteEx(lpVerb='runas', lpFile=sys.executable, lpParameters=params)
    sys.exit(0)

26voto

dguaraglia Puntos 3113

Parece que no hay manera de elevar los privilegios de la aplicación por un tiempo para realizar una tarea determinada. Windows necesita saber en el inicio del programa si la aplicación requiere de ciertos privilegios, y le pedirá al usuario que confirme cuando la aplicación realiza todas las tareas que necesitan esos privilegios. Hay dos maneras de hacer esto:

  1. Escribir un archivo de manifiesto que indica a Windows que la aplicación puede requerir algunos privilegios
  2. Ejecutar la aplicación con privilegios elevados desde dentro de otro programa

Esta dos artículos explicar con mucho más detalle cómo funciona esto.

Lo que me gustaría hacer, si usted no desea escribir un desagradable ctypes contenedor para el CreateElevatedProcess API, es el uso de la ShellExecuteEx truco explicado en el Proyecto de Código de artículo (Pywin32 viene con un contenedor para ShellExecute). Cómo? Algo como esto:

Cuando el programa se inicia, comprueba si tiene privilegios de Administrador, si no se ejecuta por sí mismo utilizando el ShellExecute truco y se cierra inmediatamente, si lo hace, se realiza la tarea en mano.

Tal como la describe el programa como un "script", supongo que es suficiente para sus necesidades.

Saludos.

2voto

TinyGrasshopper Puntos 155

Esto puede no ser completamente responder a su pregunta, pero también se podría tratar de usar el Elevar Comando Powertoy con el fin de ejecutar la secuencia de comandos con privilegios elevados UAC privilegios.

http://technet.microsoft.com/en-us/magazine/2008.06.elevation.aspx

Creo que si el uso que se vería como "elevar python yourscript.py'

1voto

user2088050 Puntos 19

Usted puede hacer un acceso directo en algún lugar y como el destino de uso: python yourscript.py a continuación, en propiedades avanzadas y seleccione ejecutar como administrador.

Cuando el usuario ejecuta el acceso directo que habrá que pedirles a elevar la aplicación.

-1voto

J.F. Sebastian Puntos 102961

Si el script siempre requiere una privilegios de Administrador a continuación:

runas /user:Administrator "python your_script.py"

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X