【发布时间】:2022-01-14 21:48:47
【问题描述】:
我正在尝试通过 Python 3.x 为 Windows 10 命令行创建实用工具。由于它可以更好地将通用命令行命令格式化为更用户友好的菜单,因此我希望它在运行时需要通过 UAC 提升权限。
我正在使用here 描述的ctypes 方法,它确实具有Python 的可执行请求UAC 提升。
但是,由于我将要编写菜单等的很多东西都需要(或在没有这些提升权限的情况下受到严重限制),我希望脚本退出(最好通过sys.exit)如果它不需要没有找到。
在我提到的ctypes方法中,它应该运行如下;
-
它定义了一个函数
is_admin(),获取ctypes.windll.shell32.IsUserAnAdmin()的值,如果为0,则返回false。 -
is_admin()在条件下被调用,如果它为 false,它会尝试执行命令行命令以使用ShellExecuteW和来自sys的一些变量将脚本作为可执行文件重新运行;ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv[0]), None, 1)
在我的代码中,我添加了一个变量elevReq,并将其设置为true;
if is_admin():
success("Already running as administrator!") # "success" and "warn" are defined earlier
elevReq = True
else:
warn("Requesting administrative permissions...", False)
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv[0]), None, 1)
elevReq = True
我用另一个条件来跟进它,检查elevReq 是否为真,is_admin() 是否为假,看看用户是否在 UAC 的弹出窗口中选择了“否”——如果是,它 应该抛出一个关于缺乏提升权限的错误,然后退出;
if elevReq and is_admin() == False:
error("[FATAL] Elevation was not given! Stopping...", True)
sys.exit(1)
我遇到的问题是给定的方法似乎实际上并没有提升 Python 的权限。 UAC确实弹出,但选择任何选项时,似乎似乎并不重要,因此上述条件无论如何。从一开始就在提升的命令提示符下手动运行脚本没有这个问题。
这是脚本没有重新加载的问题吗?如果没有,为什么它仍然退出?
【问题讨论】:
标签: python python-3.x permissions windows-10 user-account-control