2017-02-10 4 views
0

Ich möchte ein Zip-Archiv zu "C: \\" (nur für Testzwecke) extrahieren. Daher benötige ich Administratorrechte, also versuche ich den aktuellen Benutzer zu erhöhen, um Administratorrechte zu erhalten.Benutzer durch Python erhöhen

if __name__ == "__main__": 
    ASADMIN = 'asadmin' 

    if sys.argv[-1] != ASADMIN: 
     script = os.path.abspath(sys.argv[0]) 
     params = ' '.join([script] + sys.argv[1:] + [ASADMIN]) 
     shell.ShellExecuteEx(lpVerb='runas', lpFile=sys.executable, lpParameters=params) 
     main() 

Die Aufrufnachricht von UAC ist comming, wie es sollte, aber wenn ich die Zip ich extrahieren möchten noch immer bin „IOError: verweigert [Errno 13] Permission“.

Was mache ich hier falsch?

Antwort

2

Ihr Ziel ist es, das gleiche Skript mit neuen Berechtigungen erneut auszuführen.

Die Art, wie Sie es tun, führt jetzt das Skript in einem neuen Prozess erneut aus, der dann prüft, dass es das Flag "asadmin" hat und sofort beendet, da dort nichts anderes zu tun ist. Dann führt der ursprüngliche Prozess (ohne erhöhte Berechtigungen) main aus.

Sie wollen wahrscheinlich den Anruf zu main in einem else Block setzen, so dass es nur dann ausgeführt wird, wenn asadmin gesetzt:

if __name__ == "__main__": 
    ASADMIN = 'asadmin' 

    if sys.argv[-1] != ASADMIN: 
     script = os.path.abspath(sys.argv[0]) 
     params = ' '.join([script] + sys.argv[1:] + [ASADMIN]) 
     shell.ShellExecuteEx(lpVerb='runas', lpFile=sys.executable, lpParameters=params) 
    else: 
     main() 

Auch möchten Sie vielleicht einen besseren Weg finden, die Berechtigungen zu tun überprüfen. Wenn Sie dieses Skript als admin ausführen, wird es immer noch müssen sich erneut ausführen, um die "asadmin" -Flag zu setzen. Und wenn Sie als normaler Benutzer ausführen und "asadmin" manuell festlegen, funktioniert das Skript nicht. Wahrscheinlich gibt es dafür irgendwo eine API.

+0

Hmm Ich habe den Code wie Sie geändert, aber jetzt beendet mein Programm direkt nach der UAC mit Exit-Code 0? –

+0

Nun, ich weiß nicht, ob Shell.ShellExecuteEx ein blockierender Aufruf ist. Wenn es nicht blockierend ist, würde der ursprüngliche Lauf des Skripts sofort beendet und ein neuer Prozess mit dem gleichen Skript würde separat ausgeführt werden, was auch immer im Hauptprogramm ausgeführt wird. Siehe auch diese Frage: http://stackoverflow.com/questions/130763 – zstewart

Verwandte Themen