Einstellen von UAC auf requireAdministrator mit PyInstaller onefile Option und Manifest

Okay, ich habe mich herumgemacht und herum versucht, dieses herauszufinden. Ich GraphicScriptWizard.exe eine Anwendung namens GraphicScriptWizard.exe mit PyInstaller Version 2.0 mit den Optionen -i -F -w und -m.

Die Manifest-Datei, die ich mit der Option -m definiert habe, heißt GraphicScriptWizard.exe.manifest und hat folgenden Inhalt:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="x86" name="GraphicScriptWizard" type="win32"/> <!-- Identify the application security requirements. --> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges> <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> </requestedPrivileges> </security> </trustInfo> </assembly> 

Mit diesem Manifest und den Befehlszeilenoptionen bekomme ich keine ausführbare Datei, die zur Erhöhung aufgefordert wird.

Aus Gründen der Vollständigkeit ist die von Pyinstaller generierte Spec-Datei:

 # -*- mode: python -*- a = Analysis(['GraphicScriptWizard.py'], pathex=[<Full Development Path>], hiddenimports=[], hookspath=None) pyz = PYZ(a.pure) exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, name=os.path.join('dist', 'GraphicScriptWizard.exe'), debug=False, strip=None, upx=True, console=False , icon='SP.ico', manifest='GraphicScriptWizard.exe.manifest') app = BUNDLE(exe, name=os.path.join('dist', 'GraphicScriptWizard.exe.app')) 

Ich habe versucht, Kompilieren mit pyinstaller ohne die Option -m und Einbettung mit mt mit dem Befehl:

 mt.exe -manifest GraphicScriptWizard.exe.manifest -outputresource:GraphicScriptWizard.exe;#1 

Und wenn ich das mache, fordert mich die Anwendung zur Erhebung, aber ich bekomme einen Fehler, wenn das Programm läuft:

"Cannot open self <Full path to exe>\GraphicScriptWizard.exe or archive..."

Ich bin wirklich am Ende meines Witzes und hoffe, dass jemand mit mehr Vertrautheit mit Windows-Ressourcen und Manifesten etwas mehr Licht auf mich für mich werfen kann. Ist mein Manifest XML falsch? Ist meine Methodik mit Pyinstaller falsch?

2 Solutions collect form web for “Einstellen von UAC auf requireAdministrator mit PyInstaller onefile Option und Manifest”

Ich bin gerade diesen Weg gegangen, und hier sind meine Beobachtungen und Erfahrungen.

Das erste, was zu wissen ist, dass es zwei gültige Orte für das Manifest gibt:

  1. Eingebettet in die ausführbare Datei (oder DLL) als Ressource

  2. Neben der ausführbaren (oder dll), wie du gerade tust.

Lesen Sie hier über Manifestationen: http://msdn.microsoft.com/en-us/library/windows/desktop/aa374191(v=vs.85).aspx

In meiner Erfahrung kannst du beide gleichzeitig benutzen, aber wenn es irgendwelche Überschneidungen gibt, hat das eingebettete Manifest Vorrang. Das ist es, was dich anzieht. Die von Pyinstaller erstellte ausführbare Datei hat ein eingebettetes Manifest, das die angeforderte Ausführungsstufe auf "asInvoker" setzt, das die Ebene in dem Manifest überschreibt, das du benutzt hast.

Der – Manifest (oder Manifest-Parameter zu EXE ()) modifiziert lediglich das Manifest, das Pyinstaller neben der ausführbaren / dll statt des eingebetteten Manifests platziert.

Also können wir uns an mt.exe wenden, um das eingebettete Manifest zu ändern, aber wie Sie gefunden haben, ergibt sich eine Anwendung, die nicht ausgeführt wird. Dies ist, weil die Anwendung von Pyinstaller erstellt sind wirklich zwei Teile; Eine kleine ausführbare Datei, die ein Archiv extrahiert, dann einrichten und startet Ihren Code in seiner gebündelten Pythonumgebung und das Archiv, auf dem die ausführbare Datei arbeitet. Dies funktioniert, weil die Spezifikation für eine ausführbare Datei erlaubt es, beliebige Daten an das Ende der ausführbaren Datei angehängt, aber außerhalb der ausführbaren Datei selbst, wie durch die Größe definiert in der ausführbaren Kopfzeile angefügt werden. Wenn wir mt.exe auf dem von der Pyinstaller erstellten ausführbaren Datei ausführen, schaut es auf den Header, um die Größe zu erhalten, und ignoriert etwas darüber hinaus und verweigert so die Archivdaten, wenn es deine ausführbare Datei mit dem neuen Manifest speichert, was zu dem Fehler führt, den du hast gesehen.

Die Lösung, die ich verwende, ist, das Manifest zu ändern, bevor die Archivdaten an die ausführbare Datei angehängt werden, was eine Modifikation des Pyinstaller-Quellcodes erfordert. Die Pyinstaller-Quelle verfügt über Dienstprogramme, um die Ressourcen in einer ausführbaren Datei zu aktualisieren, die sie als Teil ihres Buildprozesses verwendet. Du wirst auf build.py , winmanifest.py und vielleicht winresource.py in deinem Pyinstaller-Standort sehen. Ich habe einen Parameter für die EXE-Klasse hinzugefügt und dann einen Schritt in der Assembles-Methode dieser Klasse, um das Manifest zu aktualisieren, mache ich das direkt, bevor es das Archiv anhängt. Das Fleisch von dem, was ich hinzugefügt habe, ist so:

 if self.manifest_override != None: print "Overriding default manifest" tmpnm = tempfile.mktemp() shutil.copy2(exe, tmpnm) os.chmod(tmpnm, 0755) winmanifest.UpdateManifestResourcesFromXMLFile(tmpnm, self.manifest_override, names=[1], languages=[1033]) exe = tmpnm trash.append(tmpnm) 

Ich habe das direkt vor der Zeile, die liest: exe = checkCache(exe, ... und es sollte oben sein, aber in der Nähe eines print "Appending archive to EXE"...

Diese Lösung hat für mich gearbeitet, aber ich bin nicht super glücklich damit. Ich würde lieber das Standard-Manifest überschreiben, das eingebettet wird, anstatt es zu aktualisieren, aber meine Bemühungen waren bis jetzt fruchtlos.

Tut mir leid für die Wand des Textes, aber da ist viel los.

Nicht eine komplette Lösung, aber vielleicht ein hilfreicher Hinweis.

Python 2.7.5 AMD64 funktioniert nicht mit der Manifest-Datei von oben Python 2.7.5 32-Bit funktioniert ganz gut.

Vielleicht ist das nur eine Einschränkung wegen der Python-Version.

  • Telnet Automatisierung / Scripting
  • Listing serielle (COM) Ports unter Windows?
  • Programmierung von Screenshots in Windows ohne die Anwendung bemerken
  • Fehler bei der Installation von pywin32-216 unter Windows XP
  • Wie benutzt man SHGetFileInfo mit SHGFI_PIDL in python
  • IOError 22 in python Ungültig auf windows
  • Tkinter.TclError: image "pyimage3" existiert nicht
  • Kissen installiert, aber "kein Modul namens Kissen" - python2.7 - Windows 7 - python -m installieren Kissen
  • Python 2.7 - ImportError: Kein Modul namens Image
  • Wie finde ich über Python das Symbol mit einer Windows-Datei verbunden?
  • Wie kann ich einen Windows-Dienst-Abhängigkeiten mit Python sehen?
  • Python ist die beste Programmiersprache der Welt.