Microsoft used to provide a great table with all the different Windows 10 builds and their end of life dates. This was infinitely useful as a quick reference, especially since the lifecycle model has changed several times since 2015 AND certain versions got EOL extensions due to the COVID-19 pandemic.
Now, all that appears to be left of the lifecycle is here: https://docs.microsoft.com/en-us/lifecycle/faq/windows#windows-10
The brilliant chart appears to be more or less wiped from the face of the internet. For my benefit, and maybe yours, I’m going to replicate it here.
Windows 10 Lifecycle Chart
OS Version | OS Build | Pro EOL Date | Ent EOL Date |
---|---|---|---|
1507 | 10240 | 05/09/2017 | 05/09/2017 |
1511 | 10586 | 10/10/2017 | 10/10/2017 |
1607 | 14393 | 04/10/2018 | 04/09/2019 |
1703 | 15063 | 10/09/2018 | 10/08/2019 |
1709 | 16299 | 04/09/2019 | 10/13/2020 |
1803 | 17134 | 11/12/2019 | 05/11/2021 |
1809 | 17763 | 11/10/2020 | 05/11/2021 |
1903 | 18362 | 12/08/2020 | 12/08/2020 |
1909 | 18363 | 05/11/2021 | 05/10/2022 |
2004 (20H1) | 19041 | 12/14/2021 | 12/14/2021 |
2009 (20H2) | 19042 | 05/10/2022 | 05/09/2023 |
21H1 | 19043 | 12/13/2022 | 12/13/2022 |
21H2 | 19044 | 6/13/2023 | 6/11/2024 |
22H2 | 19045 | 10/14/2025 | 10/14/2025 |
Quick Powershell Domain Searches
All Expired Hosts (updated 06/23/2023)
$range = (get-date).AddDays(-30)
get-adcomputer -filter {(OperatingSystem -like "Windows 10*") -and
(OperatingSystem -notlike "*LTSB*") -and
(OperatingSystem -notlike "*LTSC*") -and
(PasswordLastSet -gt $range) -and
((OperatingSystemVersion -eq '10.0 (10240)') -or
(OperatingSystemVersion -eq '10.0 (10586)') -or
(OperatingSystemVersion -eq '10.0 (14393)') -or
(OperatingSystemVersion -eq '10.0 (15063)') -or
(OperatingSystemVersion -eq '10.0 (16299)') -or
(OperatingSystemVersion -eq '10.0 (17134)') -or
(OperatingSystemVersion -eq '10.0 (17763)') -or
(OperatingSystemVersion -eq '10.0 (18362)') -or
(OperatingSystemVersion -eq '10.0 (18363)') -or
(OperatingSystemVersion -eq '10.0 (19041)') -or
(OperatingSystemVersion -eq '10.0 (19042)') -or
(OperatingSystemVersion -eq '10.0 (19043)') -or
((OperatingSystemVersion -eq '10.0 (19044)') -and
(OperatingSystem -like "*Pro*")))} `
-Properties operatingsystem,operatingsystemversion
This excludes LTSB/LTSC and Server clients (one day, when LTSB deployments finally start expiring the logic will have to change just a little).
I also like setting a PasswordLastSet within 30 days to find recent machines only, though you might want to widen the result size depending on your environment (or if you want to find stale entries in your AD if you’re not automatically tombstoning them).
Note: I use PasswordLastSet and not LastLogonDate, because you might have a client that is still logging in but is not updating its password with AD. These clients may be in a kind of limbo state where they’re functional but not properly writing back to AD and may have inaccurate host OS information in AD. You’ll want to identify a secondary process to find straggling hosts as well as identify hosts with a recent “lastlogondate” but old passwordlastset property.
I like to pipe this out to export-csv for review, but you can do what you want with the results.