Domanda

È possibile eseguire programmaticamente Python compilato (compilato tramite py2exe) come amministratore in Vista?

Qualche ulteriore chiarimento:
Ho scritto un programma che modifica il file hosts di Windows (c: \ Windows \ system32 \ drivers \ etc \ hosts) in Vista il programma non funzionerà e fallirà con un'eccezione a meno che tu non faccia clic con il tasto destro ed esegua come amministratore anche quando il l'utente ha i privilegi di amministratore, a differenza di XP dove verrà eseguito se l'utente ha i diritti di amministrazione, quindi ho bisogno di un modo per elevarlo programmaticamente ai privilegi corretti.

È stato utile?

Soluzione

Vuoi dire che vuoi che Windows richieda l'elevazione quando il tuo programma è in esecuzione? Questo è controllato aggiungendo un manifest UAC alle risorse di EXE. Questa voce di blog spiega come creare il manifest e come per compilarlo in un file .RES.

Non so quali servizi ha py2exe per incorporare file .RES personalizzati, quindi potrebbe essere necessario utilizzare lo strumento MT.EXE da Platform SDK per incorporare il manifest nel programma. MT.EXE non ha bisogno di file .RES; può unire direttamente il file .manifest.

Altri suggerimenti

Seguendo gli esempi da Python2x \ Lib \ site-pacchetti \ py2exe \ samples \ user_access_control basta aggiungere uac_info = " requestAdministrator " per console o windows dict:

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

In seguito al commento di Roger Lipscombe, ho usato un file manifest in py2exe senza alcuna reale conoscenza di ciò che stavo facendo. Quindi questo potrebbe funzionare:

# 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)],
                 }]
     )

Potrebbe essere necessario fare un po 'di giocherellando però ..

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top