If you haven’t heard that extended support for Windows XP ended earlier this year you’ve clearly been in a coma. There are a number of well-publicised methods for finding out whether you still have XP machines in your environment. Here is my own humble (and spectacularly over engineered) Powershell offering.
#########################################################
#
# Name: Find-XPStillActive.ps1
# Author: Tony Murray
# Version: 1.0
# Date: 23/09/2014
# Comment: PowerShell 2.0 script to find active
# Windows XP computer accounts
#
#########################################################
## Define global variables
# Export file for storing results
$expfile = "c:\xp_still_active.csv"
# Define the header row for the CSV (we will create our own)
$header = "`"name`",`"os`",`"sp`",`"lastlogondate`""
# Consider any account logged on in the last x days to be active
$days = 60
$Today = Get-date
$SubtractDays = New-Object System.TimeSpan $days, 0, 0, 0, 0
$StartDate = $Today.Subtract($SubtractDays)
$startdate = $startdate.ToFiletime()
# LDAP filter settings
$filter = "(&(lastlogontimestamp>=$startDate)(operatingsystem=Windows XP*))"
## Functions
Function Format-ShortDate ($fdate)
{
if ($fdate) {
$day = $fdate.day
$month = $fdate.month
$year = $fdate.year
"$day/$month/$year"
} # end if
} # end function
## Start doing things
# Import the AD module
ipmo ActiveDirectory
# Tidy up any previous copies of the export file
if (test-path $expfile) {Remove-Item $expfile}
# Add the header row to the export file
Add-Content -Value $header -Path $expfile
# Create an array of computer objects
$active = Get-ADComputer -LDAPFilter $filter -pr *
# loop through the array
foreach ($xp in $active) {
# Grab the attribute values we need from the AD object
$nm = $xp.name
$os = $xp.operatingsystem
$sp = $xp.operatingsystemservicepack
$lt = Format-ShortDate $($xp.lastlogondate)
$row = "`"$nm`",`"$os`",`"$sp`",`"$lt`""
# Commit the row to the export file
Add-Content -Value $row -Path $expfile
} # end foreach
## End script
Enjoy!
