在Go中检测Windows版本以找出启动文件夹

k5ifujac  于 2023-01-14  发布在  Windows
关注(0)|答案(4)|浏览(152)

有没有办法检测主机操作系统是XP、Vista、7、8还是10?runtime.GOOS只返回“Windows”。
原因是因为我试图操作启动文件夹中的文件。
在windows vista、7、8、10上,它位于:
%appdata%\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
在Windows XP上,它位于:
Documents and Settings\%username%\Start Menu\Programs\Startup

ffvjumwh

ffvjumwh1#

为什么不使用windows注册表?
https://godoc.org/golang.org/x/sys/windows/registry
How to return a default value from windows/registry with golang

package main

import (
    "golang.org/x/sys/windows/registry"
    "log"
    "fmt"
)

func main() {

    k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE)
    if err != nil {
        log.Fatal(err)
    }
    defer k.Close()

    cv, _, err := k.GetStringValue("CurrentVersion")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("CurrentVersion: %s\n", cv)

    pn , _, err := k.GetStringValue("ProductName")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("ProductName: %s\n", pn)

    maj, _, err := k.GetIntegerValue("CurrentMajorVersionNumber")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("CurrentMajorVersionNumber: %d\n", maj)

    min, _, err := k.GetIntegerValue("CurrentMinorVersionNumber")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("CurrentMinorVersionNumber: %d\n", min)

    cb, _, err := k.GetStringValue("CurrentBuild")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("CurrentVersion: %s\n", cb)    
}

这将返回:

PS C:\Users\Adamar\Desktop> .\WindowsVersion.exe
CurrentVersion: 6.3
ProductName: Windows Server 2016 Standard Evaluation
CurrentMajorVersionNumber: 10
CurrentMinorVersionNumber: 0
CurrentVersion: 14393

虽然在最新版本的windows中,你必须阅读以下键才能获得版本:当前主版本号和当前次版本号

roejwanj

roejwanj2#

如果您想获得Windows版本,请使用w32 library,这是一个纯粹的Go Win32 API Package 器。
它有w32.RtlGetVersion()返回一个包含(除其他内容外)MajorVersion和MinorVersion的结构体。这些将报告程序运行的正确Windows版本。
你不能依赖函数w32.GetVersion()。理论上你可以使用this Windows version table来知道你在哪里,但是GetVersion只适用于有正确清单文件的应用程序,清单文件表明该程序适用于Windows 10。如果你只是用go build编译而没有清单文件,GetVersion仍然会报告Windows 8(Windows版本6.2)。

package main

import (
    "fmt"
    "github.com/gonutz/w32/v2"
)

func main() {
    v := w32.RtlGetVersion()
    fmt.Println(v.MajorVersion, v.MinorVersion)
}

但是请注意,正如其他人正确指出的那样,您实际上应该使用适当的Win32 API函数来获取您的特殊文件夹。

9avjhtql

9avjhtql3#

我知道这已经很老了,但是在写这篇文章的时候(2023年1月),你可以使用RtlGetNtVersionNumbers,它是由Go语言正式维护的。

package main

import (
    "fmt"

    "golang.org/x/sys/windows"
)

func main() {
    maj, min, patch := windows.RtlGetNtVersionNumbers()
    fmt.Println(maj, min, patch)
}

对我来说就是10 0 22621

ngynwnxp

ngynwnxp4#

基于Jörg W Mittag的精彩评论,这应该让你开始:

//go:build windows

package main

import (
    "fmt"

    "golang.org/x/sys/windows"
)

func main() {
    path, err := windows.KnownFolderPath(windows.FOLDERID_Startup, 0)
    fmt.Println(err, path)
}

有关详细信息,请参见https://cs.opensource.google/go/x/sys/+/master:windows上的syscall_windows.gozknownfolderids_windows.go
注意the last version of Go to support WinXP was 1.10,当前版本是1.19,并且为最后两个版本提供了支持,因此截至目前(2023年1月10日),最后一个受支持的版本是1.18。
我的意思是,让它在WinXP上工作的必要性是没有实际意义的:使用Go1.14+为Windows构建的程序甚至无法在该平台上启动。

相关问题