Add durable HostID generation for Windows.

https://github.com/shirou/gopsutil/pull/312
This commit is contained in:
Sean Chittenden 2017-02-02 16:11:54 -08:00
parent 04d4bc9ea2
commit ee8705f549
No known key found for this signature in database
GPG Key ID: 4EBC9DC16C2E5E16
1 changed files with 62 additions and 18 deletions

View File

@ -7,7 +7,9 @@ import (
"os" "os"
"runtime" "runtime"
"strings" "strings"
"syscall"
"time" "time"
"unsafe"
"github.com/StackExchange/wmi" "github.com/StackExchange/wmi"
@ -33,11 +35,14 @@ func Info() (*InfoStat, error) {
OS: runtime.GOOS, OS: runtime.GOOS,
} }
{
hostname, err := os.Hostname() hostname, err := os.Hostname()
if err == nil { if err == nil {
ret.Hostname = hostname ret.Hostname = hostname
} }
}
{
platform, family, version, err := PlatformInformation() platform, family, version, err := PlatformInformation()
if err == nil { if err == nil {
ret.Platform = platform ret.Platform = platform
@ -46,21 +51,61 @@ func Info() (*InfoStat, error) {
} else { } else {
return ret, err return ret, err
} }
}
{
boot, err := BootTime() boot, err := BootTime()
if err == nil { if err == nil {
ret.BootTime = boot ret.BootTime = boot
ret.Uptime, _ = Uptime() ret.Uptime, _ = Uptime()
} }
}
{
hostID, err := getMachineGuid()
if err == nil {
ret.HostID = hostID
}
}
{
procs, err := process.Pids() procs, err := process.Pids()
if err == nil { if err == nil {
ret.Procs = uint64(len(procs)) ret.Procs = uint64(len(procs))
} }
}
return ret, nil return ret, nil
} }
func getMachineGuid() (string, error) {
var h syscall.Handle
err := syscall.RegOpenKeyEx(syscall.HKEY_LOCAL_MACHINE, syscall.StringToUTF16Ptr(`SOFTWARE\Microsoft\Cryptography`), 0, syscall.KEY_READ, &h)
if err != nil {
return "", err
}
defer syscall.RegCloseKey(h)
const windowsRegBufLen = 74 // len(`{`) + len(`abcdefgh-1234-456789012-123345456671` * 2) + len(`}`) // 2 == bytes/UTF16
const uuidLen = 36
var regBuf [windowsRegBufLen]uint16
bufLen := uint32(windowsRegBufLen)
var valType uint32
err = syscall.RegQueryValueEx(h, syscall.StringToUTF16Ptr(`MachineGuid`), nil, &valType, (*byte)(unsafe.Pointer(&regBuf[0])), &bufLen)
if err != nil {
return "", err
}
hostID := syscall.UTF16ToString(regBuf[:])
hostIDLen := len(hostID)
if hostIDLen != uuidLen {
return "", fmt.Errorf("HostID incorrect: %q\n", hostID)
}
return hostID, nil
}
func GetOSInfo() (Win32_OperatingSystem, error) { func GetOSInfo() (Win32_OperatingSystem, error) {
var dst []Win32_OperatingSystem var dst []Win32_OperatingSystem
q := wmi.CreateQuery(&dst, "") q := wmi.CreateQuery(&dst, "")
@ -130,7 +175,6 @@ func PlatformInformation() (platform string, family string, version string, err
} }
func Users() ([]UserStat, error) { func Users() ([]UserStat, error) {
var ret []UserStat var ret []UserStat
return ret, nil return ret, nil