Get-ADLockedAccounts — lista zablokowanych kont w domenie

🏢 Active Directory POWERSHELL

Przeszukuje całą domenę AD w poszukiwaniu zablokowanych kont — z możliwością masowego odblokowania

Pobierz .ps1

Opis

Raportuje wszystkie aktualnie zablokowane konta w AD. Wyświetla dla każdego konta: - DisplayName, SamAccountName, Department - Liczba złych prób logowania (BadLogonCount) - Czas ostatniej złej próby (LastBadPasswordAttempt) - Czy konto jest aktywne - Przynależność do OU Parametry: - -SearchBase 'OU=Users,DC=firma,DC=pl' — zawęź przeszukiwanie do OU - -Unlock — odblokuj wszystkie znalezione konta (wymaga potwierdzenia jeśli >5)

🕒 2026-04-13 📦 Źródło: own
skrypt.ps1
#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
}