Exécution de python compilé (py2exe) en tant qu'administrateur dans Vista
-
10-07-2019 - |
Question
Est-il possible d'exécuter par programmation Python compilé (compilé via py2exe) en tant qu'administrateur dans Vista?
Quelques précisions supplémentaires:
J'ai écrit un programme qui modifie le fichier hosts de Windows (c: \ Windows \ system32 \ drivers \ etc \ hosts) sous Vista. Le programme ne s'exécutera pas et échouera avec une exception, sauf si vous cliquez avec le bouton droit de la souris et vous exécutez en tant qu'administrateur, même si le L’utilisateur a des privilèges d’administrateur, contrairement à XP où il s’exécutera s’il possède des droits d’administrateur. Il me faut donc un moyen de l’élever au niveau des privilèges appropriés par programmation.
La solution
Voulez-vous dire que vous voulez que Windows demande une élévation lorsque votre programme est exécuté? Ceci est contrôlé en ajoutant un manifeste UAC aux ressources du fichier EXE. Cette entrée de blog explique comment créer le manifeste et comment pour le compiler dans un fichier .RES.
Je ne sais pas quelles sont les fonctionnalités disponibles dans py2exe pour incorporer des fichiers .RES personnalisés. Vous devrez donc peut-être utiliser l'outil MT.EXE à partir du Kit de développement Platform SDK pour intégrer le manifeste à votre programme. MT.EXE n'a pas besoin de fichiers .RES; il peut fusionner directement le fichier .manifest.
Autres conseils
En suivant les exemples de Python2x \ Lib \ site-packages \ py2exe \ samples \ user_access_control
ajoutez simplement uac_info = " requireAdministrator &
à la console ou à Windows dict:
windows = [{
'script': "admin.py",
'uac_info': "requireAdministrator",
},]
# 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)],
}]
)
Cependant, vous devrez peut-être jouer du violon.