Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 630|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-19 03:52:00 | 显示全部楼层 |阅读模式

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

     
     
    
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-23 02:19 , Processed in 0.056482 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表