Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion tests/test_system.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ def test_version(self):

def test_version_name(self):
assert is_unicode(windows.system.version_name)
assert u"unknown" not in windows.system.version_name.lower()

def test_version_product_type(self):
assert windows.system.product_type
Expand All @@ -26,7 +27,6 @@ def test_version_windir(self):
def test_version_versionstr(self):
assert is_unicode(windows.system.windir)


def test_computer_name(self):
computer_name = windows.system.computer_name
assert computer_name
Expand Down
80 changes: 73 additions & 7 deletions windows/winobject/system.py
Original file line number Diff line number Diff line change
Expand Up @@ -260,12 +260,77 @@ def version(self):
result = tuple(result_tup[:2])
return result

# Based on:
# https://jrsoftware.org/ishelp/index.php?topic=winvernotes
# https://en.wikipedia.org/wiki/List_of_Microsoft_Windows_versions

WINDOWS_10_BUILD_NUMBER_VERSION = {
# (build_number, is_workstation): "version_name"
(10240, True): u"Windows 10 Version 1507",
(10586, True): u"Windows 10 Version 1511",
(14393, True): u"Windows 10 Version 1607",
(15063, True): u"Windows 10 Version 1703",
(16299, True): u"Windows 10 Version 1709",
(17134, True): u"Windows 10 Version 1803",
(17763, True): u"Windows 10 Version 1809",
(18362, True): u"Windows 10 Version 1903",
(18363, True): u"Windows 10 Version 1909",
(19041, True): u"Windows 10 Version 2004",
(19042, True): u"Windows 10 Version 20H2",
(19043, True): u"Windows 10 Version 21H1",
(19044, True): u"Windows 10 Version 21H2",
(19045, True): u"Windows 10 Version 22H2",
(22000, True): u"Windows 11 Version 21H2",
(22621, True): u"Windows 11 Version 22H2",
(22631, True): u"Windows 11 Version 23H2",
(26100, True): u"Windows 11 Version 24H2",

(14393, False): u"Windows Server 2016",
# 16299 : Windows Server, version 1709 ?
# 17134 : Windows Server, version 1803 ?
# 17134 : Windows Server, version 1803 ?
(17763, False): u"Windows Server 2019",
# 18362 : Windows Server, version 1903 ?
# 18363 : Windows Server, version 1909 ?
# 19041 : Windows Server, version 2004 ?
# 19042 : Windows Server, version 20H2 ?
(20348, False): u"Windows Server 2022",
# 25398 : Windows Server, version 23H2 ?
(26100, False): u"Windows Server 2025",
}

def _get_version_name_for_10_build(self, build_number, is_workstation):
try:
return self.WINDOWS_10_BUILD_NUMBER_VERSION[(build_number, is_workstation)]
except KeyError as e:
return u"Unknown Windows 10+ <versionstr={0} | is_workstation={1}>".format(self.versionstr, is_workstation)

@utils.fixedpropety
def version_name(self):
"""The name of the system version, values are:

* Windows Server 2025
* Windows 11 Version 24H2
* Windows 11 Version 23H2
* Windows 11 Version 22H2
* Windows 11 Version 21H2
* Windows 10 Version 22H2
* Windows 10 Version 21H2
* Windows Server 2022
* Windows 10 Version 21H1
* Windows 10 Version 20H2
* Windows 10 Version 2004
* Windows 10 Version 1909
* Windows 10 Version 1903
* Windows Server 2019
* Windows 10 Version 1809
* Windows 10 Version 1803
* Windows 10 Version 1709
* Windows 10 Version 1703
* Windows 10 Version 1607
* Windows 10 Version 1511
* Windows 10 Version 1507
* Windows Server 2016
* Windows 10
* Windows Server 2012 R2
* Windows 8.1
* Windows Server 2012
Expand All @@ -275,19 +340,20 @@ def version_name(self):
* Windows Server 2008
* Windows Vista
* Windows XP Professional x64 Edition
* TODO: version (5.2) + is_workstation + bitness == 32 (don't even know if possible..)
* Unknown: version (5.2) + is_workstation + bitness == 32 (don't even know if possible..)
* Windows Server 2003 R2
* Windows Server 2003
* Windows XP
* Windows 2000
* "Unknow Windows <version={0} | is_workstation={1}>".format(version, is_workstation)
* "Unknown Windows 10+ <versionstr={0} | is_workstation={1}>".format(self.versionstr, is_workstation)
* "Unknown Windows <version={0} | is_workstation={1}>".format(version, is_workstation)

:type: :class:`str`
:type: :class:`unicode`
"""
version = self.version
is_workstation = self.product_type == gdef.VER_NT_WORKSTATION
if version == (10, 0):
return [u"Windows Server 2016", u"Windows 10"][is_workstation]
return self._get_version_name_for_10_build(self.build_number, is_workstation)
elif version == (6, 3):
return [u"Windows Server 2012 R2", u"Windows 8.1"][is_workstation]
elif version == (6, 2):
Expand All @@ -302,7 +368,7 @@ def version_name(self):
if self.bitness == 64:
return u"Windows XP Professional x64 Edition"
else:
return u"TODO: version (5.2) + is_workstation + bitness == 32"
return u"Unknown: version (5.2) + is_workstation + bitness == 32"
elif metric != 0:
return u"Windows Server 2003 R2"
else:
Expand All @@ -312,7 +378,7 @@ def version_name(self):
elif version == (5, 0):
return u"Windows 2000"
else:
return u"Unknow Windows <version={0} | is_workstation={1}>".format(version, is_workstation)
return u"Unknown Windows <version={0} | is_workstation={1}>".format(version, is_workstation)

VERSION_MAPPER = gdef.FlagMapper(gdef.VER_NT_WORKSTATION, gdef.VER_NT_DOMAIN_CONTROLLER, gdef.VER_NT_SERVER)
@utils.fixedpropety
Expand Down