Ich möchte, dass mein Python-Skript Dateien unter Vista kopiert. Wenn ich es in einem normalen cmd.exe
Fenster ausführe , werden keine Fehler generiert, die Dateien werden jedoch NICHT kopiert. Wenn ich cmd.exe
"als Administrator" ausführe und dann mein Skript ausführe, funktioniert es einwandfrei.
Dies ist sinnvoll, da die Benutzerkontensteuerung (User Account Control, UAC) normalerweise viele Dateisystemaktionen verhindert.
Gibt es eine Möglichkeit, wie ich innerhalb eines Python-Skripts eine UAC-Erhöhungsanforderung aufrufen kann (diese Dialoge, die so etwas wie "Diese und jene App benötigen Administratorzugriff, ist das in Ordnung?" Sagen)
Wenn dies nicht möglich ist, kann mein Skript zumindest feststellen, dass es nicht erhöht ist, sodass es ordnungsgemäß fehlschlagen kann?
quelle
Antworten:
Ab 2017 ist dies eine einfache Methode, um dies zu erreichen:
Wenn Sie Python 2.x verwenden, sollten Sie die letzte Zeile ersetzen für:
Beachten Sie, dass , wenn Sie Sie Python - Skript in eine ausführbare Datei umgewandelt (mit Tools wie
py2exe
,cx_freeze
,pyinstaller
) , dann sollten Siesys.argv[1:]
stattsys.argv
im vierten Parameter.Einige der Vorteile hier sind:
ctypes
undsys
von Standard - Bibliothek.Die Dokumentation für den zugrunde liegenden ShellExecute-Aufruf finden Sie hier .
quelle
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, "", None, 1)
sys.executable
nur der Python-Interpreter aufgelöst (z. B.C:\Python27\Python.exe
). Die Lösung besteht darin, das laufende Skript als Argument hinzuzufügen (Replacting""
).ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
Beachten Sie auch, für diese Arbeit in Python 2.x, alle String - Argumente müssen Unicode sein (dhu"runas"
,unicode(sys.executable)
undunicode(__file__)
)ShellExecuteW
undShellExecuteA
sind Aufrufe derShellExecute
Funktion in der Windows-API. Ersteres verpflichtet die Zeichenfolgen im Unicode-Format und letzteres wird im ANSI-Format verwendetEs hat eine Weile gedauert, bis die Antwort von dguaraglia funktioniert hat. Um anderen Zeit zu sparen, habe ich Folgendes getan, um diese Idee umzusetzen:
quelle
subprocess.list2cmdline
es richtig machen.Es scheint, dass es für eine Weile keine Möglichkeit gibt, die Anwendungsberechtigungen zu erhöhen, damit Sie eine bestimmte Aufgabe ausführen können. Windows muss zu Beginn des Programms wissen, ob für die Anwendung bestimmte Berechtigungen erforderlich sind, und den Benutzer auffordern, zu bestätigen, wann die Anwendung Aufgaben ausführt, für die diese Berechtigungen erforderlich sind . Es gibt zwei Möglichkeiten, dies zu tun:
Diese beiden Artikel erklären viel detaillierter, wie dies funktioniert.
Wenn Sie keinen bösen ctypes-Wrapper für die CreateElevatedProcess-API schreiben möchten, verwenden Sie den im Code Project-Artikel erläuterten ShellExecuteEx-Trick (Pywin32 wird mit einem Wrapper für ShellExecute geliefert). Wie? Etwas wie das:
Wenn Ihr Programm gestartet wird, prüft es, ob es über Administratorrechte verfügt. Wenn es dies nicht tut, führt es sich selbst mit dem ShellExecute-Trick aus und wird sofort beendet. Wenn dies der Fall ist, führt es die vorliegende Aufgabe aus.
Wenn Sie Ihr Programm als "Skript" beschreiben, reicht das wahrscheinlich für Ihre Anforderungen aus.
Prost.
quelle
runas
bringt aber eine neue Eingabeaufforderung. Und Startdatei akzeptiert keine Befehlszeilenargumente für$EXECUTABLE.
.chm
Datei verfügbar .Fügen Sie einfach diese Antwort hinzu, falls andere wie ich von der Google-Suche hierher geleitet werden. Ich habe das
elevate
Modul in meinem Python-Skript verwendet und das Skript mit Administratorrechten in Windows 10 ausgeführt.https://pypi.org/project/elevate/
quelle
elevate
Modul zu verwenden, und es wird der Fehler "Auf die Datei kann vom System nicht zugegriffen werden" angezeigt. Gibt es Ideen, warum dies passieren würde?Das folgende Beispiel baut auf der hervorragenden Arbeit und der akzeptierten Antwort von MARTIN DE LA FUENTE SAAVEDRA auf. Insbesondere werden zwei Aufzählungen eingeführt. Das erste ermöglicht eine einfache Angabe, wie ein Programm mit erhöhten Rechten geöffnet werden soll, und das zweite hilft, wenn Fehler leicht identifiziert werden müssen. Bitte beachten Sie, dass, wenn alle Befehlszeilenargumente an den neuen Prozess übergeben werden
sys.argv[0]
sollen, diese wahrscheinlich durch einen Funktionsaufruf ersetzt werden sollten :subprocess.list2cmdline(sys.argv)
.quelle
Angesichts der Tatsache, dass diese Frage vor Jahren gestellt wurde, denke ich, dass auf Github eine elegantere Lösung angeboten wird frmdstryr mit seinem Modul pywinutils anbietet:
Auszug:
Dies verwendet die COM-Schnittstelle und zeigt automatisch an, dass Administratorrechte erforderlich sind, und zwar mit der bekannten Eingabeaufforderung, die Sie sehen würden, wenn Sie in ein Verzeichnis kopieren würden, in dem Administratorrechte erforderlich sind, und bietet auch den typischen Dialog zum Dateifortschritt während des Kopiervorgangs.
quelle
Dies beantwortet Ihre Frage möglicherweise nicht vollständig, aber Sie können auch versuchen, das Elevate Command Powertoy zu verwenden, um das Skript mit erhöhten UAC-Berechtigungen auszuführen.
http://technet.microsoft.com/en-us/magazine/2008.06.elevation.aspx
Ich denke, wenn Sie es verwenden, würde es so aussehen, als ob Sie "Python yourcript.py erhöhen".
quelle
Sie können irgendwo eine Verknüpfung erstellen und als Ziel verwenden: python yourscript.py, dann unter Eigenschaften und erweiterte Auswahl als Administrator ausführen.
Wenn der Benutzer die Verknüpfung ausführt, wird er aufgefordert, die Anwendung zu erhöhen.
quelle
Wenn für Ihr Skript immer Administratorrechte erforderlich sind, gehen Sie wie folgt vor:
quelle
your_script.py
als Administrator ausgeführt. Stellen Sie sicher, dass Sie den Kommentar von @ Kugel verstehen .Eine Variation von Jorenkos Arbeit oben ermöglicht es dem erhöhten Prozess, dieselbe Konsole zu verwenden (siehe jedoch meinen Kommentar unten):
quelle
Dies ist meistens ein Upgrade von Jorenkos Antwort, das die Verwendung von Parametern mit Leerzeichen in Windows ermöglicht, aber auch unter Linux ziemlich gut funktionieren sollte :) Funktioniert auch mit cx_freeze oder py2exe, da wir es nicht verwenden,
__file__
sondernsys.argv[0]
als ausführbare Dateiquelle
Ich verwende die Elevate-Bibliothek in meinem Python für Administratorrechte, aber wenn ich eine Exe-Datei daraus mache, ist die generierte Exe-Größe sehr groß
quelle