2017-01-25 35 views
1

我想使用Python函数将文件列表复制到Windows系统目录(C:\Windows)要求管理员访问Windows中的Python函数

我有一个函数:

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- [如何使用提升的权限在Windows上运行Python脚本] on-windows) – SiHa

+0

该解决方案适用于python版本2。而且它不能在python 3中工作。 – lpsandaruwan

+1

好的,那么也许你应该在你的问题中提到这一点。 – SiHa

回答

1

下面的例子建立在Cyrbil的出色的工作。特别介绍了两个枚举。第一个功能允许轻松指定升级程序如何打开,第二个功能可以帮助识别错误。请注意,如果您希望将所有命令行参数传递给新进程,则应该使用subprocess.list2cmdline(sys.argv)函数替换sys.argv[0]

#! /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

您无法在Windows在运行时更改的权限。

应用程序需要一个清单(不适合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

启用UAC时,runas.exe(即“seclogon”服务)无法升级到用户的不受限制的管理员令牌。这需要使用ctypes或PyWin32调用ShellExecute [Ex]'“runas”动词(即“appinfo”服务)。如果您启用了此帐户并将密码存储在您的凭证保险库中,runas.exe至多可以登录管理员帐户(RID 500)。默认的UAC策略免除管理员帐户,这就是为什么从Windows Vista开始默认禁用此帐户的原因。 – eryksun

相关问题