为了账号安全,请及时绑定邮箱和手机立即绑定

从Python脚本中请求UAC提升?

从Python脚本中请求UAC提升?

胡说叔叔 2019-07-03 15:36:55
从Python脚本中请求UAC提升?我希望我的Python脚本在Vista上复制文件。当我从正常人那里运行时cmd.exe窗口中,不会生成错误,但文件不会被复制。如果我跑cmd.exe“作为管理员”,然后运行我的脚本,它工作得很好。这是有意义的,因为用户帐户控制(UAC)通常会阻止许多文件系统操作。有没有办法,从Python脚本中调用UAC提升请求(那些对话框中写着“这样的应用程序需要管理访问,这可以吗?”)如果这是不可能的,那么我的脚本是否至少可以检测到它没有被提升,这样它就可以优雅地失败?
查看完整描述

3 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

实现这一目标的简单方法如下:

import ctypes, sysdef is_admin():
    try:
        return ctypes.windll.shell32.IsUserAnAdmin()
    except:
        return Falseif is_admin():
    # Code of your program hereelse:
    # Re-run the program with admin rights
    ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)

如果您使用的是Python2.x,那么您应该将最后一行替换为:

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

还请注意,如果您将python脚本转换为可执行文件(使用以下工具)py2execx_freezepyinstaller)然后,应该将第四个参数替换为空字符串("").

这里的一些优点是:

  • 不需要外部库(Windows扩展也不需要Python)。它只使用

    ctypes

    从标准图书馆。
  • 同时工作在Python 2和Python 3上。
  • 不需要修改文件资源,也不需要创建清单文件。
  • 如果不在if/etc语句下面添加代码,则代码将不会执行两次。
  • 如果用户拒绝UAC提示,您可以很容易地将其修改为具有特殊行为。
  • 您可以指定修改第四个参数的参数。
  • 您可以指定修改第六个参数的显示方法。

基础ShellExecute调用的文档是这里.


查看完整回答
反对 回复 2019-07-03
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

在一段时间内,您似乎无法提高应用程序特权来执行特定的任务。Windows需要在程序开始时知道应用程序是否需要某些特权,并将要求用户在应用程序执行以下任务时确认需要那些特权。有两种方法可以做到这一点:

  1. 编写一个清单文件,告诉Windows应用程序可能需要一些特权
  2. 在另一个程序中以提升的权限运行应用程序

这,这个 文章更详细地解释这是如何工作的。

如果您不想为Create11-Process API编写一个讨厌的ctype包装器,我会做的是使用代码项目文章中解释的ShellExecuteEx技巧(Pywin 32附带了一个ShellExecute的包装器)。多么,怎样?就像这样:

当程序启动时,它会检查它是否具有管理员权限,如果没有,它使用ShellExecute技巧运行自己,并立即退出,如果有,它将执行手头的任务。

当您将您的程序描述为“脚本”时,我想这足以满足您的需要。

干杯。


查看完整回答
反对 回复 2019-07-03
  • 3 回答
  • 0 关注
  • 1412 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信