如何在Golang应用中获取含修订号的完整Windows版本信息?
在Golang中获取Windows完整版本号(含Revision)
如果需要获取包含major、minor、build number及revision的完整Windows版本(如10.0.22000.1455),可以采用以下两种可靠方案,解决WMI和ver命令的局限性:
方法一:调用Windows原生API(RtlGetVersion)
这是最权威的方案,直接调用系统底层API,支持全系列Windows系统,能完整获取所有版本信息。
首先安装依赖包:
go get golang.org/x/sys/windows
代码示例:
package main import ( "fmt" "golang.org/x/sys/windows" "unsafe" ) type OSVERSIONINFOEXW struct { OSVersionInfoSize uint32 MajorVersion uint32 MinorVersion uint32 BuildNumber uint32 PlatformId uint32 CSDVersion [128]uint16 ServicePackMajor uint16 ServicePackMinor uint16 SuiteMask uint16 ProductType byte Reserved byte } func main() { var osvi OSVERSIONINFOEXW osvi.OSVersionInfoSize = uint32(unsafe.Sizeof(osvi)) err := windows.RtlGetVersion((*windows.OSVERSIONINFOEX)(unsafe.Pointer(&osvi))) if err != nil { fmt.Printf("调用API失败: %v\n", err) return } // 拆分BuildNumber:低16位为build号,高16位为revision(UBR) build := osvi.BuildNumber & 0xFFFF revision := osvi.BuildNumber >> 16 fullVersion := fmt.Sprintf("%d.%d.%d.%d", osvi.MajorVersion, osvi.MinorVersion, build, revision) fmt.Println("完整Windows版本号:", fullVersion) }
方法二:读取Windows注册表
Windows将完整版本信息存储在固定注册表路径中,直接读取对应键值即可,无需依赖额外系统API,权限要求低。
首先安装依赖包:
go get golang.org/x/sys/windows/registry
代码示例:
package main import ( "fmt" "golang.org/x/sys/windows/registry" "strconv" ) func main() { key, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE) if err != nil { fmt.Printf("打开注册表失败: %v\n", err) return } defer key.Close() // 读取主版本.次版本 currentVersion, _, err := key.GetStringValue("CurrentVersion") if err != nil { fmt.Printf("读取CurrentVersion失败: %v\n", err) return } // 读取build号 currentBuildStr, _, err := key.GetStringValue("CurrentBuildNumber") if err != nil { fmt.Printf("读取CurrentBuildNumber失败: %v\n", err) return } currentBuild, err := strconv.Atoi(currentBuildStr) if err != nil { fmt.Printf("转换build号失败: %v\n", err) return } // 读取revision号(UBR) ubrStr, _, err := key.GetStringValue("UBR") if err != nil { fmt.Printf("读取UBR失败: %v\n", err) return } ubr, err := strconv.Atoi(ubrStr) if err != nil { fmt.Printf("转换UBR失败: %v\n", err) return } fullVersion := fmt.Sprintf("%s.%d.%d", currentVersion, currentBuild, ubr) fmt.Println("完整Windows版本号:", fullVersion) }
原方案局限性说明
- WMI Win32_OperatingSystem类:该类的
Version字段仅返回major.minor.build格式,未暴露revision(UBR)信息,无法满足需求。 - ver命令:Windows Server 2016及更低版本中,
ver命令输出不含revision部分,仅显示major.minor.build,存在版本覆盖不全的问题。
内容的提问来源于stack exchange,提问作者JakubSliwinski
相关产品推荐
相关产品推荐

