Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ich Python-Skripte mit erhöhten Rechten unter Windows ausführen?

Wie kann ich Python-Skripte mit erhöhten Rechten unter Windows ausführen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-03 12:08:39283Durchsuche

How can I run Python scripts with elevated privileges on Windows?

Ausführen von Skripten mit erhöhten Berechtigungen unter Windows

Viele Aufgaben in der Anwendungsentwicklung erfordern erhöhte Berechtigungen, insbesondere bei der Interaktion mit Systemressourcen oder der Ausführung administrativer Vorgänge. Dieser Artikel befasst sich mit dem spezifischen Problem der Ausführung von Skripten in Python, die Administratorzugriff erfordern.

Die Herausforderung

Das bereitgestellte Codebeispiel versucht, ein Skript mit erhöhten Berechtigungen zu initiieren. Das Skript fährt jedoch nie über die Berechtigungsaufforderung hinaus fort. Das Problem scheint in einem weit verbreiteten Missverständnis bezüglich der Ausführung des Skripts zu liegen.

Die Lösung

Der bereitgestellte Code basiert auf der Annahme, dass er sich selbst erhöhen kann, indem er sich selbst mit Administratorrechten neu startet . Dieser Ansatz ist jedoch aufgrund der Art privilegierter Vorgänge in Windows nicht durchführbar. Stattdessen müssen wir externe Mechanismen nutzen, um eine Erhöhung anzufordern.

Eine äußerst effektive Lösung ist ein umfassendes Skript, das 2010 von Preston Landers erstellt wurde. Dieses Skript ermöglicht es Benutzern, einfach zu überprüfen, ob der aktuelle Benutzer über Administratorrechte verfügt, und wenn nicht , UAC-Erhöhung anfordern. Das Skript bietet in separaten Fenstern visuelles Feedback und zeigt die Aktionen des Systems an.

Verwendung des Preston Landers-Skripts

Das Skript kann mithilfe des folgenden Snippets in Ihre Hauptanwendung integriert werden:

import admin

if not admin.isUserAdmin():
    admin.runAsAdmin()

Den vollständigen Skriptcode finden Sie unten:

#!/usr/bin/env python
# -*- coding: utf-8; mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*-
# vim: fileencoding=utf-8 tabstop=4 expandtab shiftwidth=4

# (C) COPYRIGHT © Preston Landers 2010
# Released under the same license as Python 2.6.5

import sys, os, traceback, types

def isUserAdmin():

    if os.name == 'nt':
        import ctypes
        # WARNING: requires Windows XP SP2 or higher!
        try:
            return ctypes.windll.shell32.IsUserAnAdmin()
        except:
            traceback.print_exc()
            print "Admin check failed, assuming not an admin."
            return False
    elif os.name == 'posix':
        # Check for root on Posix
        return os.getuid() == 0
    else:
        raise RuntimeError, "Unsupported operating system for this module: %s" % (os.name,)

def runAsAdmin(cmdLine=None, wait=True):

    if os.name != 'nt':
        raise RuntimeError, "This function is only implemented on Windows."

    import win32api, win32con, win32event, win32process
    from win32com.shell.shell import ShellExecuteEx
    from win32com.shell import shellcon

    python_exe = sys.executable

    if cmdLine is None:
        cmdLine = [python_exe] + sys.argv
    elif type(cmdLine) not in (types.TupleType,types.ListType):
        raise ValueError, "cmdLine is not a sequence."
    cmd = '"%s"' % (cmdLine[0],)
    # XXX TODO: isn't there a function or something we can call to massage command line params?
    params = " ".join(['"%s"' % (x,) for x in cmdLine[1:]])
    cmdDir = ''
    showCmd = win32con.SW_SHOWNORMAL
    #showCmd = win32con.SW_HIDE
    lpVerb = 'runas'  # causes UAC elevation prompt.

    # print "Running", cmd, params

    # ShellExecute() doesn't seem to allow us to fetch the PID or handle
    # of the process, so we can't get anything useful from it. Therefore
    # the more complex ShellExecuteEx() must be used.

    # procHandle = win32api.ShellExecute(0, lpVerb, cmd, params, cmdDir, showCmd)

    procInfo = ShellExecuteEx(nShow=showCmd,
                              fMask=shellcon.SEE_MASK_NOCLOSEPROCESS,
                              lpVerb=lpVerb,
                              lpFile=cmd,
                              lpParameters=params)

    if wait:
        procHandle = procInfo['hProcess']    
        obj = win32event.WaitForSingleObject(procHandle, win32event.INFINITE)
        rc = win32process.GetExitCodeProcess(procHandle)
        #print "Process handle %s returned code %s" % (procHandle, rc)
    else:
        rc = None

    return rc

def test():
    rc = 0
    if not isUserAdmin():
        print "You're not an admin.", os.getpid(), "params: ", sys.argv
        #rc = runAsAdmin(["c:\Windows\notepad.exe"])
        rc = runAsAdmin()
    else:
        print "You are an admin!", os.getpid(), "params: ", sys.argv
        rc = 0
    x = raw_input('Press Enter to exit.')
    return rc


if __name__ == "__main__":
    sys.exit(test())

Alternativ können Sie ihn jetzt installieren und verwenden dieses Skript als Python-Paket von PyPi. Befolgen Sie diese Schritte:

  1. Installieren Sie das Paket mit pip install pyuac und pip install pypiwin32.
  2. Verwenden Sie das Paket wie folgt:
import pyuac

def main():
    print("Do stuff here that requires being run as an admin.")
    # The window will disappear as soon as the program exits!
    input("Press enter to close the window. >")

if __name__ == "__main__":
    if not pyuac.isUserAdmin():
        print("Re-launching as admin!")
        pyuac.runAsAdmin()
    else:        
        main()  # Already an admin here.

Oder , verwenden Sie den Dekorator:

from pyuac import main_requires_admin

@main_requires_admin
def main():
    print("Do stuff here that requires being run as an admin.")
    # The window will disappear as soon as the program exits!
    input("Press enter to close the window. >")

if __name__ == "__main__":
    main()

Das obige ist der detaillierte Inhalt vonWie kann ich Python-Skripte mit erhöhten Rechten unter Windows ausführen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Python Industries-ModellNächster Artikel:Python Industries-Modell