在Windows中请求Python函数的管理员访问权限
我想使用Python函数将文件列表复制到Windows系统目录在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
(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()