Introduction
Welcome to part 4 in my Active Directory Cleanup Series. This part is concentrated on pulling a report of Windows Operating Systems that are obsolete/unsupported. Using this report you can review them and decide if they should be removed or upgraded.
Script 1: Long 1 liner.
The following script was posted on one of our blogs. It’s essentially a long 1 line script if you remove the cls. Take a look at the way it uses the filter to select what operating systems it believes is unsupported.
cls
Get-ADcomputer -Filter {(operatingsystem -like "*xp*") -or (operatingsystem -like "*vista*") -or (operatingsystem -like "*Windows NT*")-or (operatingsystem -like "*2000*") -or (operatingsystem -like "*2003*")} -Property Name,OperatingSystem,OperatingSystemServicePack,lastlogontimestamp,enabled | where {$_.enabled -eq $true} | Format-Table Name,OperatingSystem,OperatingSystemServicePack,@{name="lastlogontimestamp"; expression={[datetime]::fromfiletime($_.lastlogontimestamp)}} -Wrap -AutoSize
Script 2: My preferred way
Script 2 uses some of my recommended ways to build a reusable script. It includes help, comments, parameters, CSV file creation, and pulls anything older than Windows 10 1809 by default.
Function Get-OldOperatingSystems {
<#
.SYNOPSIS
This Function searches Active Directory for old operating systems.
.DESCRIPTION
This Function searches Active Directory for old operating systems.
.PARAMETER OperatingSystemVersion
The version of the operating to consider as the minimum supported operating system. The default value is 10.0.17763 which is Windows 10 1809.
.PARAMETER ExportToCSV
If specified location and CSV file to output the results. Default is the script directory location and a file named OldOperatingSystems_yyyyMMss.csv.
.EXAMPLE
Get-OldOperatingSystems
Old OS Computers Found: 5
Output was sent to D:\Scripts\ActiveDirectory\OldOperatingSystems_20200108.csv
Name Enabled OperatingSystem OperatingSystemServicePack OperatingSystemVersion IPv4Address LastLogonDate PasswordLastSet OSBuild
---- ------- --------------- -------------------------- ---------------------- ----------- ------------- --------------- -------
COMPUTER1 True Windows 10 Enterprise 10.0 (16299) 172.16.1.2 12/31/2019 12:01:55 AM 12/12/2019 6:40:53 PM 10.0.16299
COMPUTER2 False Windows 7 Enterprise Service Pack 1 6.1 (7601) 6.1.7601
COMPUTER3 False Windows 10 Enterprise 10.0 (14393) 3/19/2019 5:57:25 PM 3/19/2019 6:10:19 PM 10.0.14393
COMPUTER4 True Windows 10 Enterprise 10.0 (16299) 192.168.1.121 1/3/2020 8:50:46 PM 12/12/2019 9:32:25 PM 10.0.16299
COMPUTER5 False Windows 10 Enterprise 10.0 (16299) 11/12/2019 11:00:58 PM 9/17/2019 3:12:49 PM 10.0.16299
.EXAMPLE
Get-OldOperatingSystems -OperatingSystemVersion "10.0.16300"
Old OS Computers Found: 4
Output was sent to D:\Scripts\ActiveDirectory\OldOperatingSystems_20200108.csv
Name Enabled OperatingSystem OperatingSystemServicePack OperatingSystemVersion IPv4Address LastLogonDate PasswordLastSet OSBuild
---- ------- --------------- -------------------------- ---------------------- ----------- ------------- --------------- -------
COMPUTER1 True Windows 10 Enterprise 10.0 (16299) 172.16.1.2 12/31/2019 12:01:55 AM 12/12/2019 6:40:53 PM 10.0.16299
COMPUTER2 False Windows 7 Enterprise Service Pack 1 6.1 (7601) 6.1.7601
COMPUTER4 True Windows 10 Enterprise 10.0 (16299) 192.168.1.121 1/3/2020 8:50:46 PM 12/12/2019 9:32:25 PM 10.0.16299
COMPUTER5 False Windows 10 Enterprise 10.0 (16299) 11/12/2019 11:00:58 PM 9/17/2019 3:12:49 PM 10.0.16299
.EXAMPLE
Get-OldOperatingSystems -OperatingSystemVersion "10.0.16300" -ExportToCSV "C:\Reports\OldOSs.csv"
Old OS Computers Found: 4
Output was sent to C:\Reports\OldOSs.csv
Name Enabled OperatingSystem OperatingSystemServicePack OperatingSystemVersion IPv4Address LastLogonDate PasswordLastSet OSBuild
---- ------- --------------- -------------------------- ---------------------- ----------- ------------- --------------- -------
COMPUTER1 True Windows 10 Enterprise 10.0 (16299) 172.16.1.2 12/31/2019 12:01:55 AM 12/12/2019 6:40:53 PM 10.0.16299
COMPUTER2 False Windows 7 Enterprise Service Pack 1 6.1 (7601) 6.1.7601
COMPUTER4 True Windows 10 Enterprise 10.0 (16299) 192.168.1.121 1/3/2020 8:50:46 PM 12/12/2019 9:32:25 PM 10.0.16299
COMPUTER5 False Windows 10 Enterprise 10.0 (16299) 11/12/2019 11:00:58 PM 9/17/2019 3:12:49 PM 10.0.16299
.LINK
Windows 10 Build Versions - https://docs.microsoft.com/en-us/windows/release-information/
.LINK
Operating System Versions - https://docs.microsoft.com/en-us/windows/win32/sysinfo/operating-system-version
#>
[CmdletBinding()]
param(
# # of days ago to purge
[Version]$OperatingSystemVersion = "10.0.17763",
# Specifies to export to the specified csv file
[String] $ExportToCSV = $($PSScriptRoot + "\OldOperatingSystems_" + $(Get-Date -Format yyyyMMdd) +".csv")
)
$AllProperties = $("Name","Enabled","OperatingSystem","OperatingSystemServicePack","OperatingSystemVersion","IPv4Address","LastLogonDate","PasswordLastSet")
$AllPropertiesPlusBuild = $AllProperties + @{name="OSBuild"; expression={([Version](($_.OperatingSystemVersion -replace " \(",".") -replace "\)",""))}}
$OldOSs = $null
$OldOSs = Get-ADComputer -Filter {OperatingSystem -like "*Windows*" -and OperatingSystem -notlike "*server*"} -Properties $AllProperties | Select-Object $AllPropertiesPlusBuild | ? {$_.OSBuild -lt $OperatingSystemVersion}
If ($OldOSs) {
$OldOSs | Export-Csv -Path $ExportToCSV -NoTypeInformation -Force
Write-Output "Old OS Computers Found: $($OldOSs.count)"
Write-Output "Output was sent to $ExportToCSV"
$OldOSs | FT -AutoSize
} Else {
Write-Output "No old operating systems returned that were below $OperatingSystemVersion"
}
}
cls
Get-OldOperatingSystems
Summary
Running a quick 1 line command is great for spur of the moment requirements. However, if you invest a few extra minutes to build in parameters, file output and a couple decisions you end up with a script that you can add to your repository, reuse and share with colleagues with pride. Stay tuned for more in this series of PowerShell: Active Directory Cleanup.
You must log in to post a comment.