2017-01-25 23 views
1

Я хочу скопировать список файлов в системный каталог Windows (C:\Windows) с использованием функции Python.Запросить доступ администратора для функции Python в Windows

У меня есть функция:

import shutil 

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

И я хочу, чтобы назвать это так:

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

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

Как я могу добиться этого? PS: Я использую Python3, я попытался решения в этой теме, How to run python script with elevated privilege on windows но эти решения для Python версии 2.

+0

Возможный дубликат [Как запустить питон скрипт с повышенными привилегиями на окнах] (http://stackoverflow.com/questions/19672352/how-to-run-python-script-with-elevated-privilege- on-windows) – SiHa

+0

Это решение для python version2. И он не работает в python 3. – lpsandaruwan

+1

Хорошо, тогда, возможно, стоит упомянуть об этом в вашем вопросе. – SiHa

ответ

1

Следующий пример основан на отличную работу Cyrbil в. В частности, вводятся два перечисления. Первый позволяет легко определить, как открывается открытая программа, а вторая помогает, когда ошибки нужно легко идентифицировать. Обратите внимание: если вы хотите, чтобы все аргументы командной строки передавались новому процессу, sys.argv[0], вероятно, следует заменить вызовом функции: 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

Большое спасибо. Это работало как магия. :-) – lpsandaruwan

0

Вы не можете изменить привилегии во время выполнения на окнах.

Приложение должно иметь манифест (не подходит для python) или запускаться как привилегированный пользователь.

Когда приложение запускается и привилегии слишком низки, вы можете попросить пользователя запустить его как администратора или позволить приложению перезапускаться с повышенными привилегиями, вызывая 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

Я думаю, что 'runas' должен быть проинформирован о том, какой пользователь/уровень разрешений вам нужен. Это будет работать только как пользователь по умолчанию, не так ли? – SiHa

+1

runas.exe (то есть услуга «seclogon») не может поднять на неограниченный токен администратора, когда включен UAC. Для этого требуется глагол 'ShellExecute [Ex]' «runas» (т. Е. Сервис «appinfo»), который вы можете вызвать с помощью ctypes или PyWin32. В лучшем случае runas.exe может войти в учетную запись администратора (RID 500), если вы включили эту учетную запись и сохранили пароль в своем хранилище учетных данных. Политика UAC по умолчанию освобождает учетную запись администратора, поэтому по умолчанию эта учетная запись отключена, начиная с Windows Vista. – eryksun