做了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