2017-01-25 2 views
1

Je souhaite copier une liste de fichiers dans le répertoire système Windows (C:\Windows) à l'aide d'une fonction Python.Demander un accès administrateur pour une fonction Python dans Windows

J'ai une fonction:

import shutil 

def copy_list(src_list, dst): 
    for file in src_list: 
     shutil.copy(file, dst) 

Et je veux l'appeler comme ceci:

def copy_as_admin(): 
    #... some code to obtain user elevation ... 

    copy_list(files_list, "C:\\Windows\") 

Comment puis-je y parvenir? PS: J'utilise python3, j'ai essayé des solutions dans ce fil, How to run python script with elevated privilege on windows mais ces solutions sont pour la version Python 2.

+0

double possible de [Comment exécuter un script python avec des privilèges élevés sur les fenêtres] (http://stackoverflow.com/questions/19672352/how-to-run-python-script-with-elevated-privilege- on-windows) – SiHa

+0

Cette solution est pour python version2. Et ça ne marche pas en python 3. – lpsandaruwan

+1

OK, alors peut-être que vous devriez le mentionner dans votre question. – SiHa

Répondre

1

L'exemple suivant se base sur excellent travail de Cyrbil. En particulier, deux énumérations sont introduites. Le premier permet de spécifier facilement comment un programme élevé doit être ouvert, et le second aide lorsque les erreurs doivent être facilement identifiées. Veuillez noter que si vous voulez que tous les arguments de ligne de commande soient passés au nouveau processus, sys.argv[0] devrait probablement être remplacé par un appel de fonction: subprocess.list2cmdline(sys.argv).

#! /usr/bin/env python3 
import ctypes 
import enum 
import sys 


# Reference: 
# msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx 


class SW(enum.IntEnum): 

    HIDE = 0 
    MAXIMIZE = 3 
    MINIMIZE = 6 
    RESTORE = 9 
    SHOW = 5 
    SHOWDEFAULT = 10 
    SHOWMAXIMIZED = 3 
    SHOWMINIMIZED = 2 
    SHOWMINNOACTIVE = 7 
    SHOWNA = 8 
    SHOWNOACTIVATE = 4 
    SHOWNORMAL = 1 


class ERROR(enum.IntEnum): 

    ZERO = 0 
    FILE_NOT_FOUND = 2 
    PATH_NOT_FOUND = 3 
    BAD_FORMAT = 11 
    ACCESS_DENIED = 5 
    ASSOC_INCOMPLETE = 27 
    DDE_BUSY = 30 
    DDE_FAIL = 29 
    DDE_TIMEOUT = 28 
    DLL_NOT_FOUND = 32 
    NO_ASSOC = 31 
    OOM = 8 
    SHARE = 26 


def bootstrap(): 
    if ctypes.windll.shell32.IsUserAnAdmin(): 
     main() 
    else: 
     hinstance = ctypes.windll.shell32.ShellExecuteW(
      None, 'runas', sys.executable, sys.argv[0], None, SW.SHOWNORMAL 
     ) 
     if hinstance <= 32: 
      raise RuntimeError(ERROR(hinstance)) 


def main(): 
    # Your Code Here 
    print(input('Echo: ')) 


if __name__ == '__main__': 
    bootstrap() 
+0

Merci beaucoup. Cela a fonctionné comme par magie. :-) – lpsandaruwan

0

Vous ne pouvez pas modifier le privilège lors de l'exécution sur Windows.

Une application doit avoir un manifeste (ne convient pas à python) ou être exécutée en tant qu'utilisateur privilégié. Lorsque l'application démarre et que les privilèges sont trop faibles, vous pouvez demander à l'utilisateur de s'exécuter en tant qu'administrateur ou de laisser l'application se relancer avec des privilèges élevés en appelant runas.

import ctypes 

if not ctypes.windll.shell32.IsUserAnAdmin(): 
    print('Not enough priviledge, restarting...') 
    import sys 
    ctypes.windll.shell32.ShellExecuteW(
     None, 'runas', sys.executable, ' '.join(sys.argv), None, None) 
    exit(0) 
else: 
    print('Elevated privilege acquired') 
+0

Je pense que 'runas' doit être dit quel niveau d'utilisateur/permission vous avez besoin. Cela fonctionnera simplement en tant qu'utilisateur par défaut, n'est-ce pas? – SiHa

+1

runas.exe (c'est-à-dire le service "seclogon") ne peut pas être porté au jeton d'administrateur non restreint d'un utilisateur lorsque le contrôle de compte d'utilisateur est activé. Cela nécessite le verbe 'runas 'ShellExecute [Ex]' (c'est-à-dire le service "appinfo"), que vous pouvez appeler en utilisant ctypes ou PyWin32. Au mieux, runas.exe peut se connecter au compte Administrateur (RID 500) si vous avez activé ce compte et stocké le mot de passe dans votre coffre. La stratégie UAC par défaut exempte le compte Administrateur, ce qui explique pourquoi ce compte est désactivé par défaut à partir de Windows Vista. – eryksun