解决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
解决pyinstaller在单一文件时无法正确添加权限清单问题,(UAC,uac_admin,manifest,asInvoker,python,requireAdministrator)的更多相关文章
- 解决Protege打开owl文件时程序卡死问题
Protege在打开本地owl文件时,程序卡死,而且在终端或是命令行中也没有报错.这是因为存放该本体的文件夹下面有很多其他的文件,只需要创建一个新的文件夹并把owl文件放入其中就可以解决该问题.
- 解决 VS2019 打开 edmx 文件时没有 Diagram 视图的 Bug
问题描述 安装 VS 2019 (版本:16.0.2)后,发现更新选项中已经没有 “Entity Framework 6.X 工具” 了,打开 .edmx 文件时,呈现的视图是 xml 视图. 解决方 ...
- Pycharm在创建py文件时,如何自动添加默认文件头注释?
PyCharm是一款很好用的编写Python工程的IDE,用PyCharm创建一个Python文件或者向工程添加一个.py文件时,为了更好的使所编写的代码在各操作环境更好的运行,我们往往需要在.py文 ...
- C#使用读写锁三行代码简单解决多线程并发写入文件时线程同步的问题
(补充:初始化FileStream时使用包含文件共享属性(System.IO.FileShare)的构造函数比使用自定义线程锁更为安全和高效,更多内容可点击参阅) 在开发程序的过程中,难免少不了写入错 ...
- 轻松解决U盘拷贝文件时提示文件过大问题
现在的高科技时代生活中,u盘的使用已经是许多从事电脑it行业的人每天都必须要用到的用具.可以在一台电脑上使用u盘拷贝文件到另外一台电脑上进行使用,加上它的身材小巧,非常方便我们随身携带到任何地方进行使 ...
- Fedora 20中解决zip解压文件时中文文件名的乱码问题[已解决]
该方法的原文地址: http://wangqige.com/the-solution-of-unzip-files-which-zip-under-windows/(链接已失效) 解决方法:保存如下P ...
- C#使用读写锁解决多线程并发写入文件时线程同步的问题
读写锁是以 ReaderWriterLockSlim 对象作为锁管理资源的,不同的 ReaderWriterLockSlim 对象中锁定同一个文件也会被视为不同的锁进行管理,这种差异可能会再次导致文件 ...
- 解决Gephi导入csv文件时提示“边表格需要一个包含节点标号‘源’和‘目标’列” 问题的两个方案
1.将csv文件在Excel中打开,并重新保存为csv. 2.将csv文件导入到sqlite,使用sqlite作为数据来源. 标准格式如下
- 解决pycharm运行py文件时只有unittest选项的方法
有时候在编完脚本开始运行时,发现某个py脚本右键运行的选项不是run,二是run in unittest,试过很多方法都不能很好的去除,主要是因为脚本中含有test字符串,一种解决方法是将脚本中所有的 ...
随机推荐
- 多线程-等待(Wait)和通知(notify)
1.为了支撑多线程之间的协作,JDK提供了两个非常重要的线程接口:等待wait()方法和通知notify()方法. 这两个方法并不是在Thread类中的,而是输出在Object类.这意味着任何对象都可 ...
- C++中对C的扩展学习新增语法——强枚举
枚举类型 C++中对枚举的加强: 1.C++不允许非枚举值赋值给枚举类型,不允许其他枚举类型的值赋值给当前枚举类型,而C语言中是允许的. 2.枚举值具有外层作用域,容易造成名字冲突. 3.不同类型的枚 ...
- Graphviz 画图的一些总结
Graphviz Graphviz 是一个自动排版的作图软件,可以生成 png pdf 等格式. 一切以官方文档为准,博客只是参考.这里做一个自己学习的记录. dot 语法介绍 部分图形属性介绍 示例 ...
- hdu 1251 统计难题 (字典树(Trie)<PS:C++提交不得爆内存>)
统计难题Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submis ...
- 你真的会用JavaScript中的sort方法吗
在平时的业务开发中,数组(Array) 是我们经常用到的数据类型,那么对数组的排序也很常见,除去使用循环遍历数组的方法来排列数据,使用JS数组中原生的方法 sort 来排列(没错,比较崇尚JS原生 ...
- MySQL通过自定义函数实现递归查询父级ID或者子级ID
背 景: 在MySQL中如果是有限的层次,比如我们事先如果可以确定这个树的最大深度, 那么所有节点为根的树的深度均不会超过树的最大深度,则我们可以直接通过left join来实现. 但很多时候我们是无 ...
- 扛把子组2018092609-2 选题 Scrum立会报告+燃尽图 04
此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/8682] 一.小组情况组长:迟俊文组员:宋晓丽 梁梦瑶 韩昊 刘信鹏队名 ...
- 【集训Day1 测试】装饰
装饰(decorate) [题目描述] 一个图有 N 个结点,编号 1 至 N,有 M 条无向边,第 i 条边连接的两个结点是 Ai 和Bi,其中 Ai 和 Bi 是不同的结点.可能有多条边连接的是同 ...
- linux网络配置(ifcfg)
将linux主机接入到网络需要配置哪些配置项? IP/NETMASK:本地通信. 路由(网管):跨网络通信. DNS服务器地址:基于主机名通信. DNS服务器有三种:主/备用DNS服务器/第三备份dn ...
- css三大特效之优先级
1.什么是优先级作用:当多个选择器选中同一个标签,并且给同一个标签设置相同的属性时,如何层叠就由优先级来确定