解决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://www.cnblogs.com/moshuixiong/p/12041527.html

时间: 2024-10-10 14:19:15

解决pyinstaller在单一文件时无法正确添加权限清单问题,(UAC,uac_admin,manifest,asInvoker,python,requireAdministrator)的相关文章

删除文件时,提示没权限删除文件怎么办

做了个东西老提示删除文件没权限,郁闷 if (File.Exists("D://phone//headImages//" + this.txtNumber.Text.Trim() + ".jpg")) { File.Delete("D://phone//headImages//" + this.txtNumber.Text.Trim() + ".jpg"); } 当文件存在之后,无法删除,而是告诉我 另一个进程正在使用该文件什

C#使用读写锁三句代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题

在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三方日志插件,也可以选择使用数据库,还可以自己写个简单的方法把错误信息记录到日志文件. 选择最后一种方法实现的时候,若对文件操作与线程同步不熟悉,问题就有可能出现了,因为同一个文件并不允许多个线程同时写入,否则会提示“文件正在由另一进程使用,因此该进程无法访问此文件”. 这是文件的并发写入问题,就需要用到线程同步.而微软也给进程同步提供了一些相关的类可以达到这样的目的,本文使用到的 System.Threadin

【解决】挂载img文件时mount: you must specify the filesystem type

gem5 full systerm时,经常需要在文件系统中,添加文件.但是mount过程经常遇到错误:mount: you must specify the filesystem type 以下是正常挂载流程: 1. # sudo fdisk -lu BigDataBench-gem5.img You must set cylinders.You can do this from the extra functions menu. Disk BigDataBench-gem5.img: 0 MB

C#使用读写锁解决多线程并发写入文件时线程同步的问题

读写锁是以 ReaderWriterLockSlim 对象作为锁管理资源的,不同的 ReaderWriterLockSlim 对象中锁定同一个文件也会被视为不同的锁进行管理,这种差异可能会再次导致文件的并发写入问题,所以 ReaderWriterLockSlim 应尽量定义为只读的静态对象. 多线程同时写入文件 class Program { static int writeCount = 0; static int wrongCount = 0; static void Main(string

解决datax处理csv文件时总是提示脏数据问题

此处为csv至mysql代码 { "job": { "content": [ { "reader": { "name": "txtfilereader", "parameter": { "path": ["D:/file/test.csv"], "encoding":"gbk", "column&q

Pycharm在创建py文件时,如何自动添加文件头注释(类似于钩子特性)?

File->settings->Editor->File and Code Templates->Python Script 添加以下代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : ${DATE} ${TIME} # @Author : Aries # @Site : ${SITE} # @File : ${NAME}.py # @Software: ${PRODUCT_NAME} https://segmen

利用formdata对象上传文件时,需要添加的参数

function doUpload() { var formData = new FormData($( "#uploadForm" )[0]); $.ajax({ url: 'http://localhost:8080/cfJAX_RS/rest/file/upload' , type: 'POST', data: formData, async: false, cache: false, contentType: false, processData: false, success

pycharm在创建py文件时,自动添加文件头注释

File -> settings -> Editor-> File and Code Templates -> Python Script 添加内容: #!/usr/bin/env python # -*- coding: utf-8 -*- """ Time : ${DATE} ${TIME} Author : x File : ${NAME}.py Software: ${PRODUCT_NAME} """

【转】C#读取文件时的共享方式

string sFileName = @"C:\Exchange.dat";System.IO.StreamReader file = new System.IO.StreamReader(sFileName);string sTxt = file.ReadLine();file.Close();在这个代码中,C#读取文件时,默认是Read模式,即它打开文件后,别的应用程序只能读取该文件而不能修改文件. 如果要别的应用程序在它打开该文件的时候也能修改该文件,则需要指定模式为ReadWr