Maison >développement back-end >Tutoriel Python >Comment puis-je exécuter des scripts Python avec des privilèges élevés sous Windows ?

Comment puis-je exécuter des scripts Python avec des privilèges élevés sous Windows ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-03 12:08:39295parcourir

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

Exécuter des scripts avec des privilèges élevés sous Windows

De nombreuses tâches de développement d'applications nécessitent des privilèges élevés, en particulier lors de l'interaction avec les ressources système ou de l'exécution d'opérations administratives. Cet article aborde le problème spécifique de l'exécution de scripts en Python qui nécessitent un accès administratif.

Le défi

L'exemple de code fourni tente de lancer un script avec des autorisations élevées. Cependant, le script ne dépasse jamais l'invite d'autorisation. Le problème semble résider dans une idée fausse courante concernant l'exécution du script.

La solution

Le code fourni est basé sur l'hypothèse qu'il peut s'auto-élever en se redémarrant avec des droits d'administrateur. . Toutefois, cette approche n'est pas réalisable en raison de la nature des opérations privilégiées dans Windows. Au lieu de cela, nous devons utiliser des mécanismes externes pour demander l'élévation.

Une solution très efficace est un script complet créé par Preston Landers en 2010. Ce script permet aux utilisateurs de vérifier facilement si l'utilisateur actuel dispose de privilèges administratifs et, sinon , demandez l'élévation de l'UAC. Le script fournit un retour visuel dans des fenêtres séparées, indiquant les actions du système.

Utilisation du script Preston Landers

Le script peut être intégré à votre application principale à l'aide de l'extrait suivant :

import admin

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

Le code complet du script se trouve ci-dessous :

#!/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())

Alternativement, vous pouvez maintenant installer et utiliser ce script en tant que package Python de PyPi. Suivez ces étapes :

  1. Installez le package à l'aide de pip install pyuac et pip install pypiwin32.
  2. Utilisez le package comme ceci :
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.

Ou , utilisez le décorateur :

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()

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Modèle industriel PythonArticle suivant:Modèle industriel Python