解決pyinstaller在單一文件時無法正確添加權限清單問題,(UAC,uac_admin,manifest,asInvoker,python,requireAdministrator)


做了3天的win10的兼容性測試,大部分時間都卡權限獲取這了。

以下廢話很多,想直接找解決方法,請跳至紅字

首先,簡單說下uac,自vista后windows再次加嚴了權限管理,uac (賬戶控制) ,就是程序對訪問一些敏感資源時的限制,當程序需要訪問限制資源時會彈窗讓用戶選擇。現在系統主要分兩種權限管理員權限和標准權限,當你點擊一個程序時只會調用標准權限,這時對windows文件夾,Program文件夾和部分關鍵的注冊表的修改都會報錯,訪問應該還可以。當你需要安裝驅動或者程序時可以使用右鍵后點選管理員身份運行,那程序在系統幾乎就能暢行無阻了,這樣的確很安全但體驗不好,程序員需要提醒用戶右鍵點開以確保程序正常進行,所以有了權限清單,一個xml格式的文件,它可以在程序加載前告訴系統需要怎樣的權限,如果需要管理員權限,系統會彈窗警告,讓用戶選擇。這個權限清單在微軟的vs工具集中還是很好實現的,畢竟是本家的東西,但在python中就有問題了。

以下權限方面的官方說明

https://docs.microsoft.com/en-us/windows/win32/dxtecharts/user-account-control-for-game-developers

------------------------------------------------------------------------------------------------

其實pyinstaller是有權限清單功能的,但一直都有bug,在生成多文件時正常,在生成單一exe時無法正確嵌入清單。

多文件正常是因為權限清單就放在exe旁邊,文件名和exe一樣,后綴為manifest 那么系統就可以獲取到。

單文件時pyinstaller會先解壓將資源丟在臨時目錄里,清單也在其內,而系統必須先獲得權限清單,了解需要怎樣的權限才能正確執行程序,否則一律按標准權限執行,且中途不得更改。

這個bug差不多存在4年了,直到最近19年7月出的最新3.5版,明確表示,該bug修復啦~~ 

然而並沒有修(小聲說:麻蛋你不說修復,我也不會花這么長時間去讀文檔,換py和pyinstaller的各種版本,總覺得自己操作有誤)

以下pyinstaller版本說明

https://pyinstaller.readthedocs.io/en/stable/CHANGES.html#id1

----------------------------------------------------------------------------------------------

經過在網頁和實驗的海洋里顛鸞倒鳳了1天之后我決定解決問題還是要去改代碼的

先說下pycharm調試怎么加命令行參數,

菜單欄的run>edit configuration...>選擇你要執行的py>parameters 添加就好

注意:如果沒有找到py,請先debug執行下。

 

在改源碼時我參照了國外的這位大神

https://stackoverflow.com/questions/13964909/setting-uac-to-requireadministrator-using-pyinstaller-onefile-option-and-manifes

實際上我幾乎就是原版搬過來的

注意:這里未細測,該代碼是否會對pyinstaller的其他功能造成影響並不清楚,強烈建議去官網下個3.5版本的pyinstaller對其修改后執行,但請勿安裝。
執行方法:解壓后直接將pyinstaller.py拖進cmd 后面跟參數即可。

在pyinstaller的api.py內搜索

logger.info("Appending archive to EXE %s", self.name)

在其上部添加

       import sys
            manifest_filename_ = str(sys.argv[1]).split('.py')[0] + ".exe.manifest"
            if os.path.exists(manifest_filename_):
                print "Overriding default manifest"
                tmpnm = tempfile.mktemp()
                shutil.copy2(exe, tmpnm)
                os.chmod(tmpnm, 0755)

                winmanifest.UpdateManifestResourcesFromXMLFile(tmpnm, manifest_filename_, names=[1],
                                                               languages=[1033])
                exe = tmpnm
                trash.append(tmpnm)
            # i am too difficult le
            # Fall back to just append on end of file
使用方法:將manifest文件和py文件放在一起,執行 pyinstaller py文件路徑 -F --uac-admin 即可
maifest的命名規則和其內容:先用pyinstaller對py進行一次多文件打包,也就是 pyinstaller py文件路徑 --uac-admin 在文件夾內可以獲取到*.exe.maifest,將其拷貝到py目錄下
再執行單文件打包。
在win10企業版和win7旗艦版測試均能獲得管理員權限,但並沒有警告彈窗。。why? 可能是跟UAC的配置有關。sure? 管他呢。。。能用就得了
以下為測試代碼
import os
admin_dir = os.path.join(os.environ.get('SystemRoot','C:\\windows'), 'temp')
os.listdir(admin_dir)
sys.stdin.readline()

將其打包單一文件並執行,不報錯即為管理員權限。

注意:首先登陸的用戶為管理員才能成功獲得管理員權限。

-------------------------------------------------------------------------

源碼改的一般,對pyinstaller理解不深,歡迎大家修正,

另附:pyinstaller3.5.rar修改完成版 

 

 https://download.csdn.net/download/du26548/12033204

 
 
        
 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM