func getWindowsVersion()

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
}