Obtenir les droits administrateur avec Python sous Windows
Pour exécuter un programme Python avec les droits administrateur c'est facile: il suffit de le lancer dans une console cmd.exe déjà ouverte avec les droits administrateur. Pour cela, on accède au programme "Terminal" dans le menu Windows, on clique à droite, et on trouve la ligne "Exécuter en tant qu'administrateur". Il faut ensuite trouver le bon répertoire dans cette console pour exécuter (enfin) le programme Python. Mais il faut à chaque fois faire la manipulation correspondante, et on ne peut pas faire ça simplement en double-cliquant sur le fichier "xxx.py" dans l'explorateur de fichiers.
Je suis en train de développer un programme de recherche et de visualisation de photos, et pour la visualisation, il me faut créer des liens symboliques (os.symlink(...)). Mais cette opération demande des droits administrateur.
Voilà la solution que j'utilise. Elle ne nécessite pas d'importer des modules externes. Grâce à ctypes, on appelle directement les fonctions nécessaires des bibliothèques "système" de Windows (Windows 11 pour moi).
L'exemple choisi ici consiste à créer un nouveau sous-répertoire dans le répertoire d'installation des programmes (corrigez le chemin si nécessaire en fonction de votre configuration)
Ce programme possède une logique inhabituelle: il se lance normalement, obtient les droits administrateur auprès de Windows, et après se relance lui-même pour s'exécuter avec ces droits.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| # -*- coding: utf-8 -*-
"""
Obtenir les droits administrateur sous Windows avec Python
(nécessite que l'utilisateur ait un statut d'administrateur)
"""
import sys
import os
#############################################################################
def administrateur():
"""permet d'obtenir les droits administrateur sous Windows
nb: compatible avec un exécutable "exe" (PyInstaller, cx_freeze)
"""
# vérifie qu'on est bien sous Windows
if sys.platform != "win32":
return False
else:
import ctypes
# vérifie si on a déjà les droits administrateur
if ctypes.windll.shell32.IsUserAnAdmin():
return True
# calcule la liste des arguments selon le traitement "exe" ou non
if getattr(sys, 'frozen', False):
listargs = sys.argv[1:] # programme exe (pyinstaller ou cx_freeze)
else:
listargs = sys.argv # programme normal .py
# relance le programme avec les droits administrateur
ret = ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(listargs), None, 1)
if ret <= 32:
# droits admin non obtenus
return False
else:
# les droits admin sont obtenus mais il faut relancer le programme
sys.exit(0)
#############################################################################
if __name__ == '__main__':
if administrateur():
print("J'ai les droits administrateur")
# suite normale du programme qui s'exécute avec les droits administrateur
# exemple
try:
# sous-répertoire à créer dans le répertoire d'installation de programmes
reptest = r"C:\Program Files\reptest"
# efface ce répertoire s'il existe déjà
if os.path.exists(reptest):
os.rmdir(reptest)
# crée ce répertoire avec les droits administrateur
os.mkdir(reptest)
# vérifie la réussite de l'opération
if os.path.exists(reptest):
print("opération réussie")
else:
print("opération échouée")
except Exception as msgerr:
print("Erreur:", msgerr)
else:
print("Erreur: je n'ai pas pu obtenir les droits administrateur")
x = input("Faites 'entrée' pour sortir") |
Au lancement, la fenêtre habituelle de Windows demandant l'autorisation à l'utilisateur s'affiche. Il faut, bien sûr, que l'utilisateur ait un statut d'administrateur: ce n'est pas un programme de piratage!
L'exécution se fait comme si le programme avait été lancé dans une console ouverte avec les droits administrateur. Les affichages (print(...)) se font d'ailleurs dans cette console, d'où le "input" qui permet d'éviter la fermeture trop rapide de cette console une fois le programme terminé.
Chez moi, ça marche très bien. Mais dites-moi si ça pose des problèmes chez vous!