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?
Respuestas
¿Demasiados anuncios?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)
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:
- Escribir un archivo de manifiesto que indica a Windows que la aplicación puede requerir algunos privilegios
- 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.
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'