簡體   English   中英

在Go中檢測windows版本找出啟動文件夾

[英]Detect windows version in Go to figure out the starup folder

有沒有辦法檢測主機操作系統是 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

為什么不使用 Windows 注冊表?

https://godoc.org/golang.org/x/sys/windows/registry

如何使用 golang 從 windows/registry 返回默認值

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 中,您必須閱讀以下鍵才能獲取版本:CurrentMajorVersionNumber & CurrentMinorVersionNumber

如果您想獲得 Windows 版本,請使用w32 庫,這是一個純 Go Win32 API 包裝器。

它有 w32.RtlGetVersion(),它返回一個包含(除其他外)MajorVersion 和 MinorVersion 的結構。 這些將報告運行程序的正確 Windows 版本。

您不能依賴函數 w32.GetVersion()。 從理論上講,您可以使用此 Windows 版本表來了解您的位置,但 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 函數來獲取您的案例中的特殊文件夾。

我知道這是舊的,但在撰寫本文時(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

基於 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:windowssyscall_windows.gozknownfolderids_windows.go


請注意, Go 支持 WinXP 的最后一個版本是 1.10 ,當前版本是 1.19,並且為最后兩個版本提供了支持,因此截至目前,2023-01-10 的最后一個支持版本是 1.18。
我的意思是,讓它在 WinXP 上運行的必要性沒有實際意義:使用 Go 1.14+ 為 Windows 構建的程序甚至無法在該平台上啟動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM