Correndo python compilado (py2exe) como administrador no Vista
-
10-07-2019 - |
Pergunta
É possível programaticly executar compilado Python (comiled via py2exe) como administrador no Vista?
Alguns mais esclarecimentos:
Eu escrevi um programa que modifica o arquivo hosts do Windows (C: \ Windows \ System32 \ drivers \ etc \ hosts) em Vista o programa não será executado e irá falhar com uma exceção a menos que você clique com o botão direito e executar como administrador, mesmo quando a usuário tem privilégios de administrador, ao contrário do XP, onde ele será executado se o usuário tem direitos de administração, então eu preciso de uma maneira para elevá-lo para os privilégios corretos programaticly.
Solução
Você quer dizer que você deseja que o Windows para o prompt de elevação quando o programa é executado? Isto é controlado pela adição de um manifesto UAC aos recursos do EXE. Este blog explica como criar o manifesto e como compilá-lo em um arquivo .RES.
Eu não sei o que instalações py2exe tem para a incorporação de arquivos .RES personalizados, assim você pode precisar usar a ferramenta MT.exe do Platform SDK para incorporar o manifesto em seu programa. não MT.exe não precisa de arquivos .RES; ele pode mesclar o arquivo manifest diretamente.
Outras dicas
Seguindo os exemplos de Python2x\Lib\site-packages\py2exe\samples\user_access_control
basta adicionar uac_info="requireAdministrator"
para console ou janelas dict:
windows = [{
'script': "admin.py",
'uac_info': "requireAdministrator",
},]
Na sequência comentário de Roger Lipscombe, eu usei um arquivo de manifesto em py2exe sem qualquer conhecimento real do que eu estava fazendo. Portanto, este pode trabalho:
# 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)],
}]
)
Você pode precisar fazer alguma mexer embora ..