一尘不染

在Python脚本中请求UAC高程?

python

我希望我的Python脚本在Vista上复制文件。当我从普通cmd.exe窗口运行它时,不会生成任何错误,但不会复制文件。如果我以cmd.exe“管理员身份”运行,然后运行我的脚本,则可以正常运行。

这是有道理的,因为用户帐户控制(UAC)通常会阻止许多文件系统操作。

我有没有办法从Python脚本中调用UAC提升请求(这些对话框中会说“诸如此类应用需要管理员访问权限,这样可以吗?”)

如果这不可能,那么我的脚本是否可以至少检测到未提升的脚本,从而可以正常地失败?


阅读 672

收藏
2020-02-16

共1个答案

一尘不染

import ctypes, sys

def is_admin():
    try:
        return ctypes.windll.shell32.IsUserAnAdmin()
    except:
        return False

if is_admin():
    # Code of your program here
else:
    # Re-run the program with admin rights
    ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)

如果你使用的是Python 2.x,则应将最后一行替换为:

ctypes.windll.shell32.ShellExecuteW(None, u"runas", unicode(sys.executable), unicode(__file__), None, 1)

还要注意的是,如果你转换你的Python脚本到一个可执行文件(使用工具,如py2exe,cx_freeze,pyinstaller),那么你应该更换第四个参数为空字符串(”“)。

这里的一些优点是:

  • 不需要外部库(也不需要Python用于Windows扩展)。它仅从ctypes标准库使用。
  • 适用于Python 2和Python 3。
  • 无需修改文件资源或创建清单文件。
  • 如果你不在if / else语句下添加代码,则该代码将永远不会执行两次。
  • 如果用户拒绝UAC提示,则可以轻松地将其修改为特殊行为。
  • 你可以指定参数来修改第四个参数。
  • 你可以指定修改第六个参数的显示方法
2020-02-16