Je veux que mon script Python copie les fichiers sous Vista. Lorsque je l'exécute à partir d'une cmd.exe
fenêtre normale , aucune erreur n'est générée, mais les fichiers ne sont PAS copiés. Si je lance cmd.exe
"en tant qu'administrateur" puis que j'exécute mon script, cela fonctionne très bien.
Cela a du sens car le contrôle de compte d'utilisateur (UAC) empêche normalement de nombreuses actions du système de fichiers.
Existe-t-il un moyen, à partir d'un script Python, d'appeler une demande d'élévation UAC (ces boîtes de dialogue qui disent quelque chose comme "telle ou telle application a besoin d'un accès administrateur, est-ce correct?")
Si ce n'est pas possible, y a-t-il un moyen pour mon script de détecter au moins qu'il n'est pas élevé pour qu'il puisse échouer correctement?
la source
Réponses:
Depuis 2017, une méthode simple pour y parvenir est la suivante:
Si vous utilisez Python 2.x, vous devez remplacer la dernière ligne pour:
Notez également que si vous vous avez converti script python dans un fichier exécutable ( en utilisant des outils tels que
py2exe
,cx_freeze
,pyinstaller
) alors vous devriez utiliser ausys.argv[1:]
lieu desys.argv
la quatrième paramètre.Certains des avantages ici sont:
ctypes
etsys
de la bibliothèque standard.La documentation de l'appel ShellExecute sous-jacent est disponible ici .
la source
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, "", None, 1)
sys.executable
résout uniquement l'interpréteur python (par exempleC:\Python27\Python.exe
) La solution est d'ajouter le script en cours d'exécution en tant qu'argument (replacting""
).ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
Notez également que pour que cela fonctionne en python 2.x, tous les arguments de chaîne doivent être unicode (c'estu"runas"
-à- direunicode(sys.executable)
etunicode(__file__)
)ShellExecuteW
etShellExecuteA
sont des appels à laShellExecute
fonction dans l'API Windows. Le premier oblige les chaînes à être au format unicode et le second est utilisé avec le format ANSIIl m'a fallu un peu de temps pour que la réponse de dguaraglia fonctionne, donc dans l'intérêt de gagner du temps aux autres, voici ce que j'ai fait pour mettre en œuvre cette idée:
la source
subprocess.list2cmdline
pour le faire correctement.Il semble qu'il n'y ait aucun moyen d'élever les privilèges de l'application pendant un certain temps pour que vous puissiez effectuer une tâche particulière. Windows a besoin de savoir au démarrage du programme si l'application nécessite certains privilèges et demandera à l'utilisateur de confirmer quand l'application exécute des tâches nécessitant ces privilèges. Il y a deux façons de faire ça:
Ces deux articles expliquent plus en détail comment cela fonctionne.
Ce que je ferais, si vous ne voulez pas écrire un wrapper ctypes méchant pour l'API CreateElevatedProcess, c'est utiliser l'astuce ShellExecuteEx expliquée dans l'article Code Project (Pywin32 est livré avec un wrapper pour ShellExecute). Comment? Quelque chose comme ça:
Lorsque votre programme démarre, il vérifie s'il dispose des privilèges d'administrateur, s'il ne le fait pas, il s'exécute à l'aide de l'astuce ShellExecute et quitte immédiatement, s'il le fait, il exécute la tâche en cours.
Comme vous décrivez votre programme comme un "script", je suppose que cela suffit à vos besoins.
À votre santé.
la source
runas
affiche une nouvelle invite cependant. Et startfile n'accepte pas les arguments de ligne de commande pour$EXECUTABLE.
.chm
fichier.Il suffit d'ajouter cette réponse au cas où d'autres seraient dirigés ici par la recherche Google comme je l'étais. J'ai utilisé le
elevate
module dans mon script Python et le script exécuté avec les privilèges d'administrateur sous Windows 10.https://pypi.org/project/elevate/
la source
elevate
module et j'obtiens l'erreur "Le fichier n'est pas accessible par le système", des idées pourquoi cela se produirait-il?L'exemple suivant s'appuie sur l' excellent travail et la réponse acceptée de MARTIN DE LA FUENTE SAAVEDRA . En particulier, deux énumérations sont introduites. Le premier permet de spécifier facilement la manière dont un programme surélevé doit être ouvert, et le second aide lorsque les erreurs doivent être facilement identifiées. S'il vous plaît noter que si vous voulez que tous les arguments de ligne de commande passée au nouveau processus,
sys.argv[0]
devrait probablement être remplacé par un appel de fonction:subprocess.list2cmdline(sys.argv)
.la source
Reconnaissant que cette question a été posée il y a des années, je pense qu'une solution plus élégante est proposée sur github par frmdstryr en utilisant son module pywinutils:
Extrait:
Cela utilise l'interface COM et indique automatiquement que les privilèges d'administrateur sont nécessaires avec l'invite de dialogue familière que vous verriez si vous copiez dans un répertoire où les privilèges d'administrateur sont requis et fournit également la boîte de dialogue de progression de fichier typique pendant l'opération de copie.
la source
Cela peut ne pas répondre complètement à votre question, mais vous pouvez également essayer d'utiliser la commande Elevate Powertoy afin d'exécuter le script avec des privilèges UAC élevés.
http://technet.microsoft.com/en-us/magazine/2008.06.elevation.aspx
Je pense que si vous l'utilisez, cela ressemblerait à `` élever python yourscript.py ''
la source
Vous pouvez créer un raccourci quelque part et utiliser comme cible: python yourscript.py puis sous propriétés et sélectionnez avancé en tant qu'administrateur.
Lorsque l'utilisateur exécute le raccourci, il lui demandera d'élever l'application.
la source
Si votre script nécessite toujours les privilèges d'un administrateur, alors:
la source
your_script.py
tant qu'utilisateur administrateur. Assurez-vous de comprendre le commentaire de @ Kugel .Une variante du travail de Jorenko ci-dessus permet au processus élevé d'utiliser la même console (mais voir mon commentaire ci-dessous):
la source
Il s'agit principalement d'une mise à jour de la réponse de Jorenko, qui permet d'utiliser des paramètres avec des espaces dans Windows, mais devrait également fonctionner assez bien sous Linux :) De plus, fonctionnera avec cx_freeze ou py2exe puisque nous n'utilisons pas
__file__
maissys.argv[0]
comme exécutablela source