使用 Pyinstaller 打包為 windows exe程式 新增管理員許可權的多種方式

星尘的博客發表於2024-11-27

使用 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主頁

相關文章