Python給exe新增以管理員執行的屬性

Python成長路發表於2023-12-19

需求

有些應用每次啟動都需要用管理員許可權執行,比如Python注入dll時,編輯器或cmd就需要以管理員許可權執行,不然注入就會失敗。

這篇文章用程式設計怎麼修改配置實現開啟某個軟體都是使用管理員執行,就不用每次都右鍵點選以管理員身份執行此程式。主要是給小白配置,防止他忘了以管理員許可權執行,又跑過來問我為啥Hook失敗了

非程式設計方式

如果是自己想修改的話:右鍵軟體或桌面快捷方式,相容性->然後勾選以管理身份執行此程式

程式設計方式

有程式碼的軟體

如果你需要執行的軟體是自己寫的,想在執行時申請管理員許可權,可以在清單檔案裡增加一行:
<requestedExecutionLevel level='requireAdministrator' uiAccess='true' />

在visual studio中,可以右鍵專案屬性,連結器->清單檔案,UAC執行級別改成requireAdministrator

其他軟體

軟體本身沒有申請管理員許可權,而你又想讓他以管理員許可權執行。那就得知道非程式設計方式勾選的那個配置實際儲存在哪裡,你可以直接修改它儲存的位置也能達到一樣的效果

經過搜尋發現,這個配置是儲存在登錄檔中。

當前使用者對應的登錄檔路徑
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
所有使用者統一的配置路徑
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

當你在右鍵勾選這個選項時,當前使用者的登錄檔路徑下就會多出一個鍵來,鍵名是軟體的絕對路徑,值則是~ RUNASADMIN

如果你刪除掉這個鍵,則在右鍵看的時候,選項是沒有被勾選上的

另外,其他幾個選項也是在這個路徑下,分別對應不同的值,這裡我就不演示了。

這裡以Python為例修改登錄檔,讓Python每次都以管理員許可權啟動,這種其實屬於危險行為,因為Python也可以在你電腦上做任何事

import ctypes 
import sys
from winreg import *


def add_runas():
    exe_path = sys.executable
    # 判斷當前執行的Python是否具有管理員許可權,沒有則申請
    if not ctypes.windll.shell32.IsUserAnAdmin():
        ctypes.windll.shell32.ShellExecuteW(None, "runas", exe_path, __file__, None, 1)
    reg_path = r"Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"
    reg_key = OpenKey(HKEY_CURRENT_USER, reg_path, access=KEY_SET_VALUE | KEY_READ)
    runas_value = "~ RUNASADMIN"
    try:
        value = QueryValueEx(reg_key, exe_path)
    except FileNotFoundError:
        SetValueEx(reg_key, exe_path, 0, REG_SZ, runas_value)
    else:
        if runas_value[2:] not in value[0]:
            SetValueEx(reg_key, exe_path, 0, REG_SZ, value[0] + ' ' + runas_value[2:])

if __name__ == "__main__":
    add_runas() 

其他方式

搜尋的時候還看到可以透過修改快捷方式來達到這樣的效果,不過我測試並不行,可能在最新的系統這個屬於bug被修復了。如果有人測試成功的話,可以私聊我下原因

相關文章