Last active
April 17, 2025 08:57
-
-
Save dancing-groot/af52d6e2fea46704f67ffa324c58d2c2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<# | |
.SYNOPSIS | |
Test whether a Windows OS version is supported | |
.DESCRIPTION | |
Build a list based on the Windows OS, Edition and Build Number with a pre-defined 'end of life' date | |
to assess if the OS on this machine is still supported | |
.LINK | |
https://gist.github.com/dancing-groot/af52d6e2fea46704f67ffa324c58d2c2 | |
.NOTES | |
Version: 2025.04.17 | |
Author: @dancing-groot | |
Notes: Added Windows Server 2025 | |
References: | |
https://en.wikipedia.org/wiki/Windows_10_version_history#Channels | |
https://learn.microsoft.com/en-us/lifecycle/products/windows-10-enterprise-and-education | |
https://en.wikipedia.org/wiki/Windows_11_version_history#Channels | |
https://learn.microsoft.com/en-us/lifecycle/products/windows-11-enterprise-and-education | |
https://en.wikipedia.org/wiki/List_of_Microsoft_Windows_versions#Server_versions | |
#> | |
function Get-WindowsOSList { | |
[CmdletBinding()] | |
param() | |
$windowsOSList = @() | |
# Put in this format so it's easier to add new entries without relying on an external file | |
$rawData = @( | |
("Windows 10 Education", "1507", "10240", "2017.05.09"), | |
("Windows 10 Enterprise", "1507", "10240", "2017.05.09"), | |
("Windows 10 LTSC", "1507", "10240", "2025.10.14"), | |
("Windows 10 Pro", "1507", "10240", "2017.05.09"), | |
("Windows 10 Education", "1511", "10586", "2017.10.10"), | |
("Windows 10 Enterprise", "1511", "10586", "2017.10.10"), | |
("Windows 10 Pro", "1511", "10586", "2017.10.10"), | |
("Windows 10 Education", "1607", "14393", "2019.04.09"), | |
("Windows 10 Enterprise", "1607", "14393", "2019.04.09"), | |
("Windows 10 LTSC", "1607", "14393", "2026.10.13"), | |
("Windows 10 Pro", "1607", "14393", "2018.04.10"), | |
("Windows 10 Education", "1703", "15063", "2019.10.08"), | |
("Windows 10 Enterprise", "1703", "15063", "2019.10.08"), | |
("Windows 10 Pro", "1703", "15063", "2018.10.09"), | |
("Windows 10 Education", "1709", "16299", "2020.10.13"), | |
("Windows 10 Enterprise", "1709", "16299", "2020.10.13"), | |
("Windows 10 Pro", "1709", "16299", "2019.04.09"), | |
("Windows 10 Education", "1803", "17134", "2021.05.11"), | |
("Windows 10 Enterprise", "1803", "17134", "2021.05.11"), | |
("Windows 10 Pro", "1803", "17134", "2019.11.12"), | |
("Windows 10 Education", "1809", "17763", "2021.05.11"), | |
("Windows 10 Enterprise", "1809", "17763", "2021.05.11"), | |
("Windows 10 LTSC", "1809", "17763", "2029.01.09"), | |
("Windows 10 Pro", "1809", "17763", "2020.11.10"), | |
("Windows 10 Education", "1903", "18362", "2020.12.08"), | |
("Windows 10 Enterprise", "1903", "18362", "2020.12.08"), | |
("Windows 10 Pro", "1903", "18362", "2020.12.08"), | |
("Windows 10 Education", "1909", "18363", "2022.05.10"), | |
("Windows 10 Enterprise", "1909", "18363", "2022.05.10"), | |
("Windows 10 Pro", "1909", "18363", "2021.05.11"), | |
("Windows 10 Education", "2004", "19041", "2021.12.14"), | |
("Windows 10 Enterprise", "2004", "19041", "2021.12.14"), | |
("Windows 10 Pro", "2004", "19041", "2021.12.14"), | |
("Windows 10 Education", "20H2", "19042", "2023.05.09"), | |
("Windows 10 Enterprise", "20H2", "19042", "2023.05.09"), | |
("Windows 10 Pro", "20H2", "19042", "2022.05.10"), | |
("Windows 10 Education", "21H1", "19043", "2022.12.13"), | |
("Windows 10 Enterprise", "21H1", "19043", "2022.12.13"), | |
("Windows 10 Pro", "21H1", "19043", "2022.12.13"), | |
("Windows 10 Education", "21H2", "19044", "2024.06.11"), | |
("Windows 10 Enterprise", "21H2", "19044", "2024.06.11"), | |
("Windows 10 LTSC", "21H2", "19044", "2027.01.12"), | |
("Windows 10 Pro", "21H2", "19044", "2023.06.13"), | |
("Windows 10 Education", "22H2", "19045", "2025.10.14"), | |
("Windows 10 Enterprise", "22H2", "19045", "2025.10.14"), | |
("Windows 10 Pro", "22H2", "19045", "2025.10.14"), | |
("Windows 11 Education", "21H2", "22000", "2024.10.08"), | |
("Windows 11 Enterprise", "21H2", "22000", "2024.10.08"), | |
("Windows 11 Pro", "21H2", "22000", "2023.10.10"), | |
("Windows 11 Education", "22H2", "22621", "2025.10.14"), | |
("Windows 11 Enterprise", "22H2", "22621", "2025.10.14"), | |
("Windows 11 Pro", "22H2", "22621", "2024.10.08"), | |
("Windows 11 Education", "23H2", "22631", "2026.11.10"), | |
("Windows 11 Enterprise", "23H2", "22631", "2026.11.10"), | |
("Windows 11 Pro", "23H2", "22631", "2025.11.25"), | |
("Windows 11 Education", "24H2", "26100", "2027.10.12"), | |
("Windows 11 Enterprise", "24H2", "26100", "2027.10.12"), | |
("Windows 11 Pro", "24H2", "26100", "2026.10.13"), | |
("Windows Server", "2008 R2", "7601", "2020.01.14"), | |
("Windows Server", "2012 R2", "9600", "2020.01.14"), | |
("Windows Server", "2016", "14393", "2027.01.12"), | |
("Windows Server", "2019", "17763", "2029.01.09"), | |
("Windows Server", "2022", "20348", "2031.10.14"), | |
("Windows Server", "2025", "26100", "2034.10.10") | |
) | |
$rawData | ForEach-Object { $windowsOSList += [PSCustomObject]@{Type = $_[0]; Version = $_[1]; Build = $_[2]; EOL = $_[3] } } | |
return $windowsOSList | |
} # Get-WindowsOSList | |
function Format-Date { | |
[CmdletBinding()] | |
param( | |
[ValidatePattern("\d{4}\.\d{1,2}\.\d{1,2}")][string]$Date | |
) | |
return [DateTime]$Date | |
} # Format-Date | |
function Test-OS { | |
[CmdletBinding(DefaultParameterSetName = "Supported")] | |
param() | |
$windowsInfo = Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object Caption, BuildNumber, @{Name = "Type"; Expression = "." } | |
switch -Wildcard ($windowsInfo.Caption) { | |
"*Windows 10*" { | |
switch -Wildcard ($windowsInfo.Caption) { | |
"*LTSC" { $WindowsInfo.Type = "Windows 10 LTSC"; break } | |
"*Pro*" { $WindowsInfo.Type = "Windows 10 Pro"; break } | |
"*Education" { $WindowsInfo.Type = "Windows 10 Education"; break } | |
"*Enterprise" { $WindowsInfo.Type = "Windows 10 Enterprise"; break } | |
} | |
} | |
"*Windows 11*" { | |
switch -Wildcard ($windowsInfo.Caption) { | |
"*Pro*" { $WindowsInfo.Type = "Windows 11 Pro"; break } | |
"*Education" { $WindowsInfo.Type = "Windows 11 Education"; break } | |
"*Enterprise" { $WindowsInfo.Type = "Windows 11 Enterprise"; break } | |
} | |
} | |
"*Windows Server*" { $WindowsInfo.Type = "Windows Server"; break } | |
} | |
$deviceInfo = $Script:Support | Where-Object { $_.Type -eq $windowsInfo.Type -and $_.Build -eq $windowsInfo.BuildNumber } | |
if ($null -eq $deviceInfo) { $deviceInfo = @{Type = "NOT DETECTED OR ANCIENT"; Version = "0"; EOL = "0001.01.01" } } | |
if ((Format-Date -Date $deviceInfo.EOL) -lt (Get-Date)) { return "$($windowsInfo.Caption) $($windowsInfo.BuildNumber) ($(Format-Date -Date $deviceInfo.EOL)) Not Supported" } else { return "Supported" } | |
} # Test-OS | |
$Support = Get-WindowsOSList | |
$hash = @{"OS Supported" = TEST-OS } | |
return $hash | ConvertTo-Json -Compress |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment