#Requires -Modules ActiveDirectory <# .SYNOPSIS Listuje wszystkie aktualnie zablokowane konta AD i opcjonalnie je odblokowuje. .DESCRIPTION Przeszukuje cały AD w poszukiwaniu zablokowanych kont. Wyświetla czas ostatniej złej próby i liczbę błędnych logowań. Z parametrem -Unlock odblokowuje wszystkie znalezione konta (ostrożnie!). .PARAMETER SearchBase DN jednostki organizacyjnej do przeszukania (domyślnie: cała domena). .PARAMETER Unlock Przełącznik — jeśli podany, odblokowuje znalezione konta. .EXAMPLE .\Get-ADLockedAccounts.ps1 .\Get-ADLockedAccounts.ps1 -SearchBase "OU=Users,DC=firma,DC=pl" .\Get-ADLockedAccounts.ps1 -Unlock #> param( [string]$SearchBase = "", [switch]$Unlock ) Import-Module ActiveDirectory -ErrorAction Stop $params = @{ Filter = { LockedOut -eq $true } Properties = 'LockedOut', 'BadLogonCount', 'LastBadPasswordAttempt', 'BadPasswordTime', 'DisplayName', 'Department', 'Enabled', 'DistinguishedName' } if ($SearchBase) { $params.SearchBase = $SearchBase } $locked = Get-ADUser @params | Sort-Object LastBadPasswordAttempt -Descending if (-not $locked) { Write-Host "`n[OK] Brak zablokowanych kont w AD." -ForegroundColor Green return } Write-Host "`n Znaleziono $($locked.Count) zablokowanych kont:`n" -ForegroundColor Yellow $locked | Select-Object DisplayName, SamAccountName, Department, BadLogonCount, LastBadPasswordAttempt, Enabled, @{N='OU'; E={ ($_.DistinguishedName -split ',OU=')[1] }} | Format-Table -AutoSize if ($Unlock) { if ($locked.Count -gt 5) { $confirm = Read-Host "Odblokować wszystkie $($locked.Count) kont? (tak/nie)" if ($confirm -ne 'tak') { Write-Host "Anulowano."; return } } foreach ($acc in $locked) { Unlock-ADAccount -Identity $acc.SamAccountName Write-Host " [OK] Odblokowano: $($acc.SamAccountName)" -ForegroundColor Green } Write-Host "`nOdblokowano $($locked.Count) kont." -ForegroundColor Green } else { Write-Host "Użyj -Unlock aby odblokować wszystkie konta." -ForegroundColor Cyan }