IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Python Discussion :

Obtenir les droits administrateur avec Python sous Windows


Sujet :

Contribuez Python

  1. #1
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 480
    Points : 9 280
    Points
    9 280
    Billets dans le blog
    6
    Par défaut 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 : 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")
    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!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 362
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 362
    Points : 36 894
    Points
    36 894
    Par défaut
    Salut,

    Citation Envoyé par tyrtamos Voir le message
    Chez moi, ça marche très bien.
    Un peu de recherche sur Internet et on trouve le projet pyuac disponible sur PyPI. Après une lecture en diagonale, il semble utiliser la même logique et les mêmes primitives système. Il est, par contre, un peu plus avancé/documenté.

    - W

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 880
    Points
    1 880
    Par défaut
    Comment l'application est-elle packagée ? Peut-être que la création des symlinks pourrait se faire une fois, au moment de l'install. Et ensuite les exécutions successives se feraient avec les privilèges ordinaires de l'utilisateur.

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 480
    Points : 9 280
    Points
    9 280
    Billets dans le blog
    6
    Par défaut
    Bonjour

    Citation Envoyé par binarygirl Voir le message
    Comment l'application est-elle packagée ? Peut-être que la création des symlinks pourrait se faire une fois, au moment de l'install. Et ensuite les exécutions successives se feraient avec les privilèges ordinaires de l'utilisateur.
    Merci pour la suggestion, mais non. Le programme que je développe est fait pour trouver des photos dans un gros répertoire 'images" (plus de 30.000 fichiers) selon plusieurs critères, et particulièrement selon la date de prise de vue (issue des exifs des jpg). Mais une fois que j'ai trouvé 50 photos, par exemple, il faut que je les vois pour choisir celle que je veux. Mais ces photos se trouvent dans des sous-répertoires très différents, et je perdrais trop de temps à sauter d'un répertoire à l'autre.

    Ma solution est donc de créer des liens symboliques dans un répertoire temporaire pendant l'exécution, et un logiciel de visualisation comme "FastStone" me permet d'afficher parfaitement ces photos. Et ça marche très bien. J'ai donc besoin des droits administrateur pendant l'exécution.

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 480
    Points : 9 280
    Points
    9 280
    Billets dans le blog
    6
    Par défaut
    Bonjour wiztricks

    Citation Envoyé par wiztricks Voir le message
    Un peu de recherche sur Internet et on trouve le projet pyuac disponible sur PyPI. Après une lecture en diagonale, il semble utiliser la même logique et les mêmes primitives système. Il est, par contre, un peu plus avancé/documenté.
    Oui, et je me rappelle aussi l'avoir déjà utilisé. Mais j'ai préféré une solution qui ne nécessite pas d'installer un module externe.

Discussions similaires

  1. Comment obtenir les droits administrateur complet sur Windows 7
    Par Gr@nd@x dans le forum Vos contributions
    Réponses: 8
    Dernier message: 22/12/2014, 19h57
  2. modifier les droits d'un dossier sous Windows Vista
    Par ririrourou dans le forum Windows Vista
    Réponses: 0
    Dernier message: 05/02/2010, 15h32
  3. utiliser glade avec python sous windows
    Par sakura.sou dans le forum EDI/RAD
    Réponses: 1
    Dernier message: 25/07/2009, 09h31
  4. Changer les droits d'un fichier sous windows
    Par lnikolanta dans le forum Général Conception Web
    Réponses: 6
    Dernier message: 26/09/2005, 17h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo