Maison >développement back-end >Tutoriel Python >Comment puis-je exécuter des scripts Python 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.
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.
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.
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 :
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!