logo powershell

Automatisch inactieve accounts disablen

Een simpel script om gebruikers na x aantal dagen niet aanmelden automatisch te laten blokkeren. Daarbij een switch voor het dry-runnen van dit script om de implicaties in te schatten en natuurlijk een logging optie. Sla het onderstaande op als DisableUsersAfterInactiveDays.ps1

param(
    [string]$OU = "OU=Users,DC=domain,DC=com",  # Specify the target OU
    [int]$InactiveDays = 30,                   # Number of days of inactivity
    [switch]$DryRun = $false,                  # Dry run mode switch
    [string]$LogFilePath                       # Optional log file path
)

# Function to log messages if logging is enabled or output to console if no log file path is provided
function LogMessage {
    param(
        [string]$message
    )
    if ($LogFilePath) {
        $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
        $logEntry = "$timestamp - $message"
        Add-content -Path $LogFilePath -Value $logEntry
    } else {
        Write-Output $message  # Output to console if no log file path provided
    }
}

# Get the current date
$currentDate = Get-Date

# Retrieve inactive users in the specified OU
$inactiveUsers = Get-ADUser -Filter {Enabled -eq $true} -SearchBase "$OU" -Properties LastLogonDate |
    Where-Object {($_.LastLogonDate -lt ($currentDate).AddDays(-$InactiveDays)) -or (-not $_.LastLogonDate)}

# Process inactive users
foreach ($user in $inactiveUsers) {
    $userName = $user.Name
    $lastLogon = $user.LastLogonDate
    if ($DryRun) {
        LogMessage "Dry run: User $userName would be disabled. Last logon: $lastLogon"
    } else {
        Disable-ADAccount -Identity $user
        LogMessage "User $userName disabled. Last logon: $lastLogon"
    }
}


Voorbeeld met output naar scherm:

.\DisableUsersAfterInactiveDays.ps1 -OU "OU=Sales,DC=contoso,DC=com" -InactiveDays 45 -DryRun 

Voorbeeld met output naar logfile:

.\DisableUsersAfterInactiveDays.ps1 -OU "OU=Sales,DC=contoso,DC=com" -InactiveDays 45 -DryRun -Logfilepath "C:\beheer\DisableUsersAfterInactiveDays.txt"

De definitieve taak zonder -dryrun kun je vervolgens schedulen:

.\DisableUsersAfterInactiveDays.ps1 -OU "OU=Sales,DC=contoso,DC=com" -InactiveDays 45  -Logfilepath "C:\beheer\DisableUsersAfterInactiveDays.txt"

Wil je een overzicht van inactieve domain computers?

Search-ADAccount -ComputersOnly -AccountInactive -TimeSpan 180 | select name

Om dit tot een verwijder actie om te zetten(draai altijd de vorige variant eerst!):

Search-ADAccount -ComputersOnly -AccountInactive -TimeSpan (New-TimeSpan -Days 90) | ForEach-Object { Remove-ADComputer -Identity $_.DistinguishedName -Confirm:$false }