You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 03:05:18