Pregunta

¿Es posible ejecutar programáticamente Python compilado (comiled via py2exe) como administrador en Vista?

Algunas aclaraciones más:
He escrito un programa que modifica el archivo de hosts de Windows (c: \ Windows \ system32 \ drivers \ etc \ hosts) en Vista, el programa no se ejecutará y fallará con una excepción a menos que haga clic derecho y se ejecute como administrador, incluso cuando el el usuario tiene privilegios de administrador, a diferencia de XP donde se ejecutará si el usuario tiene derechos de administración, por lo que necesito una forma de elevarlo a los privilegios correctos programáticamente.

¿Fue útil?

Solución

¿Quiere decir que desea que Windows solicite elevación cuando se ejecuta su programa? Esto se controla agregando un manifiesto UAC a los recursos del EXE. Esta entrada de blog explica cómo crear el manifiesto y cómo para compilarlo en un archivo .RES.

No sé qué funciones tiene py2exe para incrustar archivos .RES personalizados, por lo que es posible que deba usar la herramienta MT.EXE del SDK de la plataforma para incrustar el manifiesto en su programa. MT.EXE no necesita archivos .RES; puede fusionar el archivo .manifest directamente.

Otros consejos

Siguiendo los ejemplos de Python2x \ Lib \ site-packages \ py2exe \ samples \ user_access_control simplemente agregue uac_info = " requireAdministrator " a la consola o Windows dict:

windows = [{
    'script': "admin.py",
    'uac_info': "requireAdministrator",
},]

Siguiendo el comentario de Roger Lipscombe, he usado un archivo de manifiesto en py2exe sin ningún conocimiento real de lo que estaba haciendo. Entonces este podría funcionar:

# in setup.py
# manifest copied from http://blogs.msdn.com/shawnfa/archive/2006/04/06/568563.aspx
manifest = '''
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
       <asmv3:trustInfo xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
         <asmv3:security>
           <asmv3:requestedPrivileges>
             <asmv3:requestedExecutionLevel
               level="asInvoker"
               uiAccess="false" />
           </asmv3:requestedPrivileges>
         </asmv3:security>
       </asmv3:trustInfo>
     </assembly>
'''

setup(name='MyApp',
      #...
      windows=[ { #...
                  'other_resources':[(24, 1, manifest)],
                 }]
     )

Sin embargo, es posible que tengas que tocar el violín ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top