如何在NSIS中检测Windows 10与Windows Server 2019版本
NSIS 准确检测Windows 10、Windows Server 2019的实现方案
原有停更的第三方GetWindowsVersion插件、老旧社区教程的版本适配范围仅覆盖到Windows 8.1,加上Windows 10系统引入的版本兼容性欺骗机制,会导致传统检测方法返回错误的版本值,直接按照以下步骤实现即可获得准确的检测结果:
核心实现逻辑
- 放弃使用停更的第三方
GetWindowsVersion插件,优先使用NSIS官方持续维护的原生检测能力,避免第三方插件版本适配滞后的问题 - 绕开系统版本欺骗机制:Windows 10及之后的系统会对未嵌入兼容性manifest的应用,返回Windows 8.1的版本号,即使实际运行在Win10或Server2019环境下,原生检测模块通过调用不受版本欺骗限制的底层接口,可直接读取真实系统版本,不受该机制影响
- 区分客户端与服务器版本:Windows Server 2019的核心版本号与同期Windows 10 1809完全一致(10.0 Build 17763),检测时需要额外读取系统产品类型标识,避免将服务器版误判为普通Windows 10客户端
具体操作步骤
- 升级NSIS到3.02及以上稳定版本,该版本开始内置的
WinVer.nsh头文件已完整覆盖Windows 10、Windows Server 2016/2019/2022的版本映射逻辑,不需要额外安装任何第三方插件 - 在安装脚本头部引入该头文件,通过内置宏完成基础版本判断
- 针对Server 2019的专属判断,补充Build号与系统产品类型的校验逻辑
示例可运行代码
!include "WinVer.nsh" Section "系统版本强制校验" ; 读取真实系统版本信息:主版本号、次版本号、Build号 ${GetWindowsVersion} $R0 $R1 $R2 ${IfNot} $R0 == 10 DetailPrint "当前系统版本低于Windows 10最低要求" Abort "安装终止:系统版本不兼容" ${EndIf} DetailPrint "检测到10.0内核的Windows系统" ; 校验是否满足Server 2019版本要求:Build 17763为Server2019的初始版本号 ${If} $R2 >= 17763 ${If} ${IsServerOS} DetailPrint "确认检测到Windows Server 2019或更高版本服务器系统" ${Else} DetailPrint "检测到Windows 10客户端桌面版本" ${EndIf} ${Else} DetailPrint "检测到早期Windows 10版本(如1507/1607/1709)" ${EndIf} SectionEnd
常见踩坑提醒
- 不要沿用老旧教程中读取注册表
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion下CurrentVersion值的判断方法,该值在Windows 10及之后系统中固定返回6.3,完全无法区分Windows 8.1与Windows 10 - 不要硬编码单个固定Build号作为唯一判断依据,Windows 10与Server 2019的后续累积更新会持续抬升Build号,只要主版本为10.0、Build达到对应阈值、产品类型匹配,即可准确识别目标系统
- 不需要额外为安装包手动嵌入兼容性manifest,上述原生检测逻辑通过直接调用未受版本欺骗限制的底层接口完成检测,兼容性比手动嵌manifest的方案更好
内容的提问来源于stack exchange,提问作者Ravikiran R
相关产品推荐
相关产品推荐

