//go:build windows // machineid_windows.go — Windows machineID 取得。 // // 來源:Registry `HKLM\SOFTWARE\Microsoft\Cryptography` 的 `MachineGuid`。 // 此值於 Windows 安裝時產生,綁定當前 OS 安裝,使用者空間可讀。 // 參考 ADR-009。 package tunnel import ( "fmt" "os/exec" "strings" ) // readMachineID 回傳 Windows 的 MachineGuid。 // 失敗時回 ("", error)——呼叫端應 fallback 到 salt file。 // // 不用 golang.org/x/sys/windows/registry(會增加依賴);改用 reg.exe CLI,三種 // Windows 版本都內建。 func readMachineID() (string, error) { cmd := exec.Command( "reg", "query", `HKLM\SOFTWARE\Microsoft\Cryptography`, "/v", "MachineGuid", ) out, err := cmd.Output() if err != nil { return "", fmt.Errorf("reg query failed: %w", err) } // 輸出格式: // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography // MachineGuid REG_SZ 12345678-90ab-cdef-1234-567890abcdef for _, line := range strings.Split(string(out), "\n") { line = strings.TrimSpace(line) if !strings.HasPrefix(line, "MachineGuid") { continue } fields := strings.Fields(line) // 預期 [MachineGuid, REG_SZ, ] if len(fields) >= 3 { return fields[len(fields)-1], nil } } return "", fmt.Errorf("MachineGuid not found in reg query output") }