Python中使用win32api获取Windows可执行文件版本号的正确方法
发布时间 - 2026-01-22 00:00:00 点击率:次本文介绍如何在python中

Scripting.FileSystemObject.GetFileVersion 在现代Windows系统(尤其是64位环境或UAC启用时)中存在严重兼容性问题:它依赖于已过时的COM组件,对非系统签名文件、无版本资源的PE文件或受保护路径下的文件常返回-2147024894(即ERROR_FILE_NOT_FOUND的HRESULT等效值),即使文件真实存在且可读。该错误与路径编码、权限或文件类型无关,本质是COM接口本身对新版PE结构和UAC沙箱的支持缺失。
推荐改用 win32api.GetFileVersionInfo —— 它直接调用Windows原生API GetFileVersionInfo(),绕过COM层,稳定性高、兼容性强,且能正确解析嵌入在PE文件资源段中的版本信息(VS_VERSIONINFO)。
以下是完整、健壮的实现示例:
from win32api import GetFileVersionInfo, LOWORD, HIWORD
def get_version_number(filename):
"""
获取Windows可执行文件(.exe/.dll等)的文件版本号,格式为 a.b.c.d
返回元组 (major, minor, build, revision),失败时返回 (0, 0, 0, 0)
"""
try:
# 获取版本信息块(根块"\\"表示主版本资源)
info = GetFileVersionInfo(filename, "\\")
# 解析FileVersion字段(MS: Most Significant, LS: Least Significant)
ms = info['FileVersionMS']
ls = info['FileVersionLS']
return (
HIWORD(ms), # 主版本号(高位字)
LOWORD(ms), # 次版本号(低位字)
HIWORD(ls), # 构建号(高位字)
LOWORD(ls) # 修订号(低位字)
)
except Exception as e:
print(f"获取版本信息失败: {e}")
return 0, 0, 0, 0
# 使用示例
file_path = r'C:\Users\Alex\Downloads\ChromeSetup.exe'
version_tuple = get_version_number(file_path)
version_str = ".".join(map(str, version_tuple)) # 更简洁的拼接方式
print(f"文件版本: {version_str}") # 输出如:125.0.6422.142✅ 关键说明与注意事项:
- ✅ 必须安装 pywin32(pip install pywin32),无需额外注册COM组件;
- ✅ 支持 .exe、.dll、.sys 等含版本资源的PE文件;若文件无版本信息(如某些便携版工具),将返回 (0,0,0,0);
- ⚠️ 路径必须为绝对路径,且确保Python进程有读取权限(避免UAC虚拟化路径干扰,建议避开C:\Program Files\等受保护目录进行测试);
- ⚠️ GetFileVersionInfo 不支持网络路径(UNC)或重定向符号链接,需传入本地物理路径;
- ? 如需获取产品版本(ProductVersion)、公司名(CompanyName)等其他属性,可进一步解析 info['StringFileInfo'] 字典(需配合win32api的VerQueryValue扩展使用)。
该方法已在Windows 10/11 + Python 3.8–3.12 + pywin32 306+ 环境中验证通过,是生产环境中获取Windows二进制文件版本号的首选方案。
# word
# python
# windows
# 编码
# 工具
# win
# windows系统
# 虚拟化
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
java ZXing生成二维码及条码实例分享
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
如何快速选择适合个人网站的云服务器配置?
Laravel怎么判断请求类型_Laravel Request isMethod用法
PHP正则匹配日期和时间(时间戳转换)的实例代码
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
Laravel如何使用Gate和Policy进行授权?(权限控制)
如何快速查询网址的建站时间与历史轨迹?
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
zabbix利用python脚本发送报警邮件的方法
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
如何在万网开始建站?分步指南解析
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
如何在阿里云购买域名并搭建网站?
深圳网站制作培训,深圳哪些招聘网站比较好?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】
如何在Windows环境下新建FTP站点并设置权限?
长沙做网站要多少钱,长沙国安网络怎么样?
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
个人摄影网站制作流程,摄影爱好者都去什么网站?
Android GridView 滑动条设置一直显示状态(推荐)
公司网站制作价格怎么算,公司办个官网需要多少钱?
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
如何用AI帮你把自己的生活经历写成一个有趣的故事?
Laravel如何创建自定义中间件?(Middleware代码示例)
Laravel如何实现事件和监听器?(Event & Listener实战)
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
Laravel如何使用模型观察者?(Observer代码示例)
Linux系统命令中tree命令详解
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Python制作简易注册登录系统
JS经典正则表达式笔试题汇总
python中快速进行多个字符替换的方法小结
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
Laravel如何处理文件下载请求?(Response示例)
智能起名网站制作软件有哪些,制作logo的软件?
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
奇安信“盘古石”团队突破 iOS 26.1 提权
Laravel如何实现用户密码重置功能?(完整流程代码)
如何确保西部建站助手FTP传输的安全性?
如何用VPS主机快速搭建个人网站?
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?

