截至 2017 年,实现这一目标的简单方法如下:
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, " ".join(sys.argv), None, 1)
如果您使用的是 Python 2.x,则应将最后一行替换为:
ctypes.windll.shell32.ShellExecuteW(None, u"runas", unicode(sys.executable), unicode(" ".join(sys.argv)), None, 1)
另请注意,如果您将 python 脚本转换为可执行文件(使用py2exe
, cx_freeze
,等工具pyinstaller
),那么您应该在第四个参数中使用sys.argv[1:]
而不是。sys.argv
这里的一些优点是:
- 不需要外部库。它只使用
ctypes
和sys
来自标准库。
- 适用于 Python 2 和 Python 3。
- 无需修改文件资源,也无需创建清单文件。
- 如果您不在 if/else 语句下面添加代码,则该代码将永远不会被执行两次。
- 您可以在最后一行获取 API 调用的返回值,并在失败时执行操作(代码 <= 32)。在此处检查可能的返回值。
- 您可以通过修改第六个参数来更改衍生进程的显示方法。
底层 ShellExecute 调用的文档在这里。