moby--moby/pkg/parsers/operatingsystem/operatingsystem_windows.go

71 lines
2.1 KiB
Go

package operatingsystem // import "github.com/docker/docker/pkg/parsers/operatingsystem"
import (
"errors"
"github.com/Microsoft/hcsshim/osversion"
"golang.org/x/sys/windows"
"golang.org/x/sys/windows/registry"
)
// VER_NT_WORKSTATION, see https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-osversioninfoexa
const verNTWorkstation = 0x00000001 // VER_NT_WORKSTATION
// GetOperatingSystem gets the name of the current operating system.
func GetOperatingSystem() (string, error) {
osversion := windows.RtlGetVersion() // Always succeeds.
rel := windowsOSRelease{
IsServer: osversion.ProductType != verNTWorkstation,
Build: osversion.BuildNumber,
}
// Make a best-effort attempt to retrieve the display version and
// Update Build Revision by querying undocumented registry values.
key, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE)
if err == nil {
defer key.Close()
if ver, err := getFirstStringValue(key,
"DisplayVersion", /* Windows 20H2 and above */
"ReleaseId", /* Windows 2009 and below */
); err == nil {
rel.DisplayVersion = ver
}
if ubr, _, err := key.GetIntegerValue("UBR"); err == nil {
rel.UBR = ubr
}
}
return rel.String(), nil
}
func getFirstStringValue(key registry.Key, names ...string) (string, error) {
for _, n := range names {
val, _, err := key.GetStringValue(n)
if err != nil {
if !errors.Is(err, registry.ErrNotExist) {
return "", err
}
continue
}
return val, nil
}
return "", registry.ErrNotExist
}
// GetOperatingSystemVersion gets the version of the current operating system, as a string.
func GetOperatingSystemVersion() (string, error) {
return osversion.Get().ToString(), nil
}
// IsContainerized returns true if we are running inside a container.
// No-op on Windows, always returns false.
func IsContainerized() (bool, error) {
return false, nil
}
// IsWindowsClient returns true if the SKU is client. It returns false on
// Windows server.
func IsWindowsClient() bool {
return windows.RtlGetVersion().ProductType == verNTWorkstation
}