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.
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!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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")
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!
Partager