在Python脚本中请求UAC高程?

发布于 2021-02-02 23:18:25

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

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

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

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

关注者
0
被浏览
75
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。
    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提示,则可以轻松地将其修改为特殊行为。
    • 你可以指定参数来修改第四个参数。
    • 你可以指定修改第六个参数的显示方法


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看