#Get-UnusedComputers.ps1 # #Alan dot Kaplan at va dot gov #alan at akaplan dot com #2/13/16 WorkFlow Check-Unused { param([string[]]$computers) ForEach -parallel ($Computer in $computers){ InLineScript{ $Error.Clear() $BOnline = $false $lastLogon = "" $bOnline = "unknown" $UserPath ="" $bOnline = Test-Connection -quiet -Count 1 -ComputerName $using:Computer if ($bOnline -eq $true){ Try{ $localPathList = get-wmiobject -ComputerName $using:Computer -query "Select localpath from Win32_UserProfile Where Special = 'False'" -ErrorAction Stop | select -ExpandProperty localpath $logons = $localPathList | % { $UNC ="\\$using:Computer\"+$_.ToString().Replace(":","$") if (test-path $UNC) {gi $UNC} } $lastLogonNfo = $logons | sort lastwritetime -Descending | select name, LastWriteTime -First 1 $lastLogon = ($lastLogonNfo).LastWriteTime.tostring().trim() $UserPath = ($lastLogonNFO).name.tostring().trim() }Catch{} } $output = [PSCustomObject]@{ HostName = $using:Computer LastLogon=$lastLogon LastUser = $UserPath Online = $bOnline Error = $Error[0].Exception.Message } return $output }#End Inline } #End Foreach }#End WorkFlow #Examples for input $OU = 'OU=Workstations,DC=MyCo,DC=com' $computers = (Get-adComputer -searchbase $OU -filter * -searchscope subtree).name $LastLogonInfo = Check-Unused $computers $LastLogonInfo | select * -ExcludeProperty ps* | Export-Csv -Path $env:userprofile\Desktop\InactiveComputers.csv -NoTypeInformation