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

kx5bkwkv  于 2023-02-21  发布在  Python
关注(0)|答案(2)|浏览(191)

我想使用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,我在这个线程中尝试了解决方案,How to run python script with elevated privilege on windows,但是那些解决方案是针对Python版本2的。

wljmcqd8

wljmcqd81#

下面的例子建立在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()
envsm3lx

envsm3lx2#

不能在运行时在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)
else:
    print('Elevated privilege acquired')

相关问题