For a number of years now I have been using OldCmp to find and remove inactive user and computer accounts. The other day I thought I would have a crack at using the AD Powershell cmdlets to at least do the finding part. It wasn’t as difficult as I thought. Here’s an example looking for enabled accounts that have been inactive for 90 days or more:
# Find inactive user accounts
$now = Get-Date
$old = $now.AddDays(-90)
Get-ADUser -Filter * -Properties lastlogondate `
| ? {($_.enabled -eq $true) -and ($_.lastlogondate -le $old)} `
| select samaccountname, lastlogondate `
| Export-Csv .\inactive_users.csv -NoTypeInformation
# Find inactive computer accounts
$now = Get-Date
$old = $now.AddDays(-90)
Get-ADComputer -Filter * -Properties lastlogondate `
| ? {($_.enabled -eq $true) -and ($_.lastlogondate -le $old)} `
| select name, lastlogondate `
| Export-Csv .\inactive_computers.csv -NoTypeInformation
I normally use LDAP filters for all searches, but in this case I used a standard Powershell filter. Why? Well, because the cmdlets expose two pseudo attributes: “enabled” and “lastlogondate”. I call these pseudo attributes because you won’t find them anywhere in the AD schema. They are provided to make life easier. The alternative would be to query userAccountControl with a bitwise filter to find the enabled/disabled state and to do some formatting with lastLogonTimestamp, which is stored in AD as a large integer value.
I hope you find these useful.

There is also: Search-ADAccount -AccountInactive