使用 Pyinstaller 打包为 windows exe程序 添加管理员权限的多种方式

使用 Pyinstaller 打包为 windows exe程序 添加管理员权限的多种方式

本文提供几种在使用 Pyinstaller打包后,为包体 exe提升管理员权限的方式。
注意事项:
管理员权限的必要性:确保程序确实需要管理员权限,否则用户可能会质疑程序的安全性。
数字签名:最好对生成的 .exe 文件进行数字签名,否则某些杀毒软件可能会误报。

准备测试脚本

准备一个测试用脚本,用于检查是否真的拥有管理员权限

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ File        : administrator_rights.py
@ Author      : yqbao
@ Version     : V1.0.0
@ Description : 测试用脚本
"""
import os
import time


def test_admin_privileges():
    try:
        with open(r"C:\Windows\System32\test_admin.txt", "w") as f:
            f.write("测试管理员权限")
        print("程序已以管理员权限运行")
        os.remove(r"C:\Windows\System32\test_admin.txt")  # 清理测试文件
    except PermissionError:
        print("程序未以管理员权限运行,请使用管理员权限启动")
    time.sleep(3)  # 休眠,方便查看


if __name__ == "__main__":
    test_admin_privileges()

方法一:使用 --uac-admin 参数(推荐)

直接在打包时,应用参数

# 举例:最简化的打包参数使用方法,
pyinstaller -F --uac-admin .\administrator_rights.py

pyinstaller -D --uac-admin .\administrator_rights.py

或者你也可以直接修改 .spec 文件

... # 省略
exe = EXE(
   ... # 省略
    uac_admin=True, # 在最后增加这句
)

打包后,在包体图标右下角,会有个 管理员权限 标识
image

运行后,不一定会弹出 UAC 权限确认,但是确实也是用的管理员权限运行
image

方法二:在代码中直接提升 UAC 权限

修改测试脚本,增加下面的内容

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ File        : administrator_rights.py
@ Author      : yqbao
@ Version     : V1.0.0
@ Description : 
"""
import ctypes
import os
import sys
import time


def test_admin_privileges():
    ... # 忽略,无变化


if __name__ == "__main__":
    if not ctypes.windll.shell32.IsUserAnAdmin():  # 检查是否拥有管理员权限
        # 如果不是管理员权限,则重新以管理员权限运行
        ctypes.windll.shell32.ShellExecuteW(
            None, "runas", sys.executable, " ".join(sys.argv), None, 1
        )
        sys.exit()
    test_admin_privileges()

举例:使用最简化的打包

pyinstaller -F .\administrator_rights.py

pyinstaller -D .\administrator_rights.py

打包后,在包体图标右下角,不会有管理员权限标识
image

运行后,不一定会弹出 UAC 权限确认,但是确实也是用的管理员权限运行
image

方法三:通过 manifest 文件指定(但是这种方式,并未成功,不过也记录在这里)

1.创建一个 manifest 文件

新建一个名为 your_script.manifest 的文件,内容如下

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

2. 通过 PyInstaller 添加 manifest 文件

pyinstaller --manifest your_script.manifest -F .\administrator_rights.py

本文章的原文地址
GitHub主页

posted @ 2024-11-27 20:41  星尘的博客  阅读(107)  评论(0编辑  收藏  举报