Keep Active Directory clean and tidy using this PowerShell script to find, move and disable inactive computer accounts.


The script uses Quest PowerShell commands which you can download freely from their website - http://www.quest.com/powershell/activeroles-server.aspx

The script has three run options that can be configured.

 

1. Report Only – find all inactive users and generate a CSV file report showing their details

2. Report and Move – find all inactive users, generates a CSV report file and moves the accounts to a specific OU

3. Report, Move and Disable - find all inactive users, generates a CSV report file, moves the accounts to a specific OU and disables them whilst updating
their description


Simply edit the script variables at the top of script to change the way the  script runs. You can specify the source OU used to search for inactive accounts,  the destination OU to move inactive accounts to, and the description to set in the accounts. You can also specify a search string for the description field. For example I prefix the description field in an AD User account that i never want to be disabled with the prefix DND (Do not disable) – the script will ignore any accounts it finds with a description starting DND. You can also customise how long accounts must have been active for and the location of the report.

 

 

PowerShell
Edit|Remove
#Script designed to search AD for inactive user accounts, mark them as inactive and move them to a specific OU then disable them 
#Script can be run in the following formats 
#    1. Report only 
#    2. Report and move account 
#    3. Report, move and disable 
# 
#Uses quest powershell tools which can be downloaded from http://www.quest.com/powershell/activeroles-server.aspx 
# 
#Version 1.0 
#Denis Cooper 
 
#Setup script Variables 
 
 
#Change the setting from True to false to alter the way the script runs (only one option can be true) 
    $ReportONly = "True"    #Generates a CSV file showing all inactive user accounts 
    $ReportandMove = "False"    #Generates a CSV report, moves the users to a specific OU 
    $ReportMoveDisable = "False" #Generates a CSV report, moves the users to specific OU, and sets the description 
 
 
#Get todays date and store it in the $today variable 
    $Today = Get-Date 
 
#Set the period of inactivity in days 
    $InactiveFor = "90" 
 
#Specify the OU to search for inactive users - us AD CN if searching enire AD 
    $SourceOU = "OU=Users,DC=MyDomain,DC=Int" 
 
#Specify the destination OU to move inactive users to is using report and move or report move disable script options 
    $DestinationOU = "OU=Inactive Users,DC=MyDomain,DC=Int" 
 
#Don't mark anyone with the the specified prefix in the description field to inactive - DND stands for Do Not Disable and is specified 
#in the users account description field for accounts which may not be used to login so will show as inactive but that you don't want to disable 
#must leave the * after the word for wildcard matching 
    $DescriptionPrefix = "DND*" 
     
#Specify the description to set in the computer account on ReportMoveDisable option 
    $Description = "Account disabled due to inactivity on $Today" 
     
#Specify the path to create the csv file (make sure the folder exists) 
    $ReportFile = "C:\source\InactiveUsersReport.csv" 
 
 
#NO CHANGES BELOW THIS LINE 
 
#Generates a report showing inactive users 
    Function ReportOnly { 
        $inactiveUsers | Export-Csv $ReportFile 
         
        $count = $inactiveUsers.Count 
        Write-Host -ForegroundColor White "$count inactive users were found and are being processed" 
         
        Invoke-Item $ReportFile  
    } 
     
#Generates report and moves accounts to desitnation OU 
    Function ReportandMove { 
        $inactiveUsers | Export-Csv $ReportFile 
         
        $count = $inactiveUsers.Count 
        Write-Host -ForegroundColor White "$count inactive users were found and are being processed" 
         
        Invoke-Item $ReportFile  
         
        $inactiveUsers | foreach { 
            Move-QADObject $_ -NewParentContainer $DestinationOU 
        } 
    } 
     
#Generates report, moves accounts to destination OU, disables the account and sets the description 
    Function ReportMoveDisable { 
        $inactiveUsers | Export-Csv $ReportFile 
         
        $count = $inactiveUsers.Count 
        Write-Host -ForegroundColor White "$count inactive users were found and are being processed" 
         
        Invoke-Item $ReportFile  
        $inactiveUsers | foreach { 
            Disable-QADUser $_ 
            Set-QADUser $_ -Description $Description  
            Move-QADObject $_ -NewParentContainer $DestinationOU 
        } 
    } 
     
 
#Runs the script 
 
 
#Finds all inactive user accounts which are in an enabled state and store them in the variable $inactiveusers 
    $inactiveUsers = Get-QADUser -SizeLimit 0 -SearchRoot $sourceOu -NotLoggedOnFor $InactiveFor -Enabled | Where-Object {$_.description -notlike $DescriptionPrefix} 
         
 
#Checks which script to run 
    If (($ReportONly -eq "True"-and ($ReportandMove -eq "True" -or $ReportMoveDisable -eq "True")) { 
        Write-Host -ForegroundColor RED "Only one run condition is allowed, please set only one run value to True and the others to false" 
        Break 
        } 
         
    If ($ReportONly -ne "True" -and $ReportandMove -ne "True" -and $ReportMoveDisable -ne "True") { 
        Write-Host -ForegroundColor RED "No valid run condition was specified, please set only one run value to True and the others to false" 
        Break 
        } 
 
    If ($ReportONly -eq "True") { 
        Write-Host -Foregroundcolor Green "Script running in report only mode." 
        Write-Host -Foregroundcolor Green "Checking for accounts inactive for $inactivefor days in the OU $SourceOU" 
        Write-Host -Foregroundcolor Green "The report will open automatically once complete, or you can find it here $ReportFile" 
         
        ReportOnly 
        }     
 
    If ($ReportandMove -eq "True") { 
        Write-Host -Foregroundcolor Green "Script running in report and move mode." 
        Write-Host -Foregroundcolor Green "Checking for accounts inactive for $inactivefor days in the OU $SourceOU" 
        Write-Host -Foregroundcolor Green "The report will open automatically once complete, or you can find it here $ReportFile" 
        Write-Host -ForegroundColor Green "Any inactive accounts will be moved to this OU $destinationOU" 
 
        ReportAndMove 
        } 
     
    If ($ReportMoveDisable -eq "True") { 
        Write-Host -Foregroundcolor Green "Script running in report, move and disable mode." 
        Write-Host -Foregroundcolor Green "Checking for accounts inactive for $inactivefor days in the OU $SourceOU" 
        Write-Host -Foregroundcolor Green "The report will open automatically once complete, or you can find it here $ReportFile" 
        Write-Host -ForegroundColor Green "Any inactive accounts will be moved to this OU $destinationOU and disabled and their description updated" 
         
        ReportMoveDisable 
        }