在Windows中请求Python函数的管理员访问权限

在Windows中请求Python函数的管理员访问权限,python,windows,python-3.x,pywin32,win32com,Python,Windows,Python 3.x,Pywin32,Win32com,我想使用Python函数将文件列表复制到Windows系统目录(C:\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(fi

我想使用Python函数将文件列表复制到Windows系统目录
(C:\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,我在这个线程中尝试了解决方案,
但这些解决方案适用于Python版本2。

您不能在windows上的运行时更改特权

应用程序需要有清单(不适用于python)或作为特权用户运行

当应用程序启动且权限过低时,您可以要求用户以管理员身份运行,或者通过调用以提升权限重新启动应用程序


下面的示例建立在Cyrbil的出色工作的基础上。特别介绍了两种枚举。第一种方法允许轻松指定如何打开提升的程序,第二种方法在需要轻松识别错误时提供帮助。请注意,如果希望将所有命令行参数传递给新进程,
sys.argv[0]
可能应替换为函数调用:
subprocess.list2cmdline(sys.argv)

#/usr/bin/env蟒蛇3
导入ctypes
导入枚举
导入系统
#参考:
#msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx
SW类(内部枚举):
隐藏=0
最大化=3
最小化=6
恢复=9
SHOW=5
SHOWDEFAULT=10
显示最大化=3
SHOWMINIMIZED=2
showminoactive=7
SHOWNA=8
SHOWNOACTIVATE=4
SHOWNORMAL=1
类错误(enum.IntEnum):
零=0
文件未找到=2
未找到路径=3
错误的_格式=11
访问被拒绝=5
ASSOC_不完整=27
DDE_BUSY=30
DDE_FAIL=29
DDE_超时=28
DLL_未找到=32
无关联=31
OOM=8
份额=26
def bootstrap():
如果ctypes.windell.shell32.IsUserAnAdmin():
main()
其他:
hinstance=ctypes.windell.shell32.ShellExecuteW(
无,'runas',sys.executable,sys.argv[0],无,SW.SHOWNORMAL
)

如果可能,该解决方案的副本适用于python版本2。它在python 3中不起作用。好的,那么也许你应该在你的问题中提到这一点。谢谢。我更新了问题::-)实际上,我想做的是使用python将一些字体文件复制到系统字体目录。尽管这是一种糟糕的做法,但我对学习很感兴趣。:-)我可以通过授予管理员权限来运行整个脚本,但我想做的是在运行程序时授予函数权限。我认为
runas
需要被告知您需要的用户/权限级别。这将作为默认用户运行,不是吗?启用UAC时,runas.exe(即“seclogon”服务)无法提升为用户的无限制管理员令牌。这需要
ShellExecute[Ex]
“runas”动词(即“appinfo”服务),您可以使用ctypes或PyWin32调用该动词。如果您已启用此帐户并将密码存储在凭据vault中,runas.exe最多只能登录管理员帐户(RID 500)。默认UAC策略豁免管理员帐户,这就是为什么从Windows Vista开始默认禁用此帐户的原因。
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')
#! /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()