in plugins/cmd/query-hcs-capabilities/main.go [83:126]
func getWindowsVersion() (string, error) {
// Use `RtlGetVersion()` to query the Windows version number, so manifest semantics are ignored
versionInfo := windows.RtlGetVersion()
// Use PowerShell to query WMI for the system caption, since `ProductName` in the registry is no longer reliable
productName, err := exec.Command("powershell", "-Command", "(Get-WmiObject -Class Win32_OperatingSystem).Caption").Output()
if err != nil {
return "", fmt.Errorf("failed to query WMI for the product version string: %s", err.Error())
}
// Open the registry key for the Windows version information
key, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE)
if err != nil {
return "", fmt.Errorf("failed to open the registry key \"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\": %s", err.Error())
}
defer key.Close()
// Attempt to retrieve the display version on newer systems, falling back to the old release ID value on older systems
displayVersion, _, err := key.GetStringValue("DisplayVersion")
if err != nil {
displayVersion, _, err = key.GetStringValue("ReleaseId")
if err != nil {
return "", fmt.Errorf("failed to retrieve either the \"DisplayVersion\" or \"ReleaseId\" registry value: %s", err.Error())
}
}
// Retrieve the revision number, since this isn't included in the `RtlGetVersion()` output
revisionNumber, _, err := key.GetIntegerValue("UBR")
if err != nil {
return "", fmt.Errorf("failed to retrieve the \"UBR\" registry value: %s", err.Error())
}
// Build an aggregated version string from the retrieved values
return fmt.Sprintf(
"%s, version %s (OS build %d.%d.%d.%d)",
strings.TrimSpace(string(productName)),
displayVersion,
versionInfo.MajorVersion,
versionInfo.MinorVersion,
versionInfo.BuildNumber,
revisionNumber,
), nil
}