Každý administrátor to zná. Uživatelé co používají stále stejné heslo i několik let a tím snižují bezpečnost v síti, protože základ je silné a dostatečně často měněné heslo. Jak ale jednodušše a rychle zjistit, kteří uživatelé v doméně naposledy změnili heslo a nebo ho nezměnili nikdy?

Jak na to?

V první řadě si musíme otevřít opět Powershell ISE pro napsání skriptu. Jako první krok bychom mohli začít kontrolovat, jestli jsou v doméně uživatelé co si nikdy nezměnili heslo. No pro nezkušeného uživatele Powershell možná neřešitelný úkol, ale ve své podstatě je to strašně primitivní. Příkazem Get-ADUser si vylistujeme uživatele v doméně a poté podobně jako v SQL vyselektujeme výsledek, tak aby zobrazoval co potřebujeme. Následně výsledek vypíšeme do TXT souboru.

# Zjištění kdo si nikdy nezměnil heslo
Get-ADUser -Filter * -Properties CannotChangePassword | 
where {$_.CannotChangePassword} | 
sort-object {$_.samAccountName} | 
Select samAccountName | 
Export-csv -path c:\scripts\CHU_users-password-never-changed.csv

Tak teď máme vylistované uživatele, kteří jsou tak odvážní a nemění si vůbec heslo. Nyní je čas zjistit stáří hesel. Základem je opět příkaz Get-ADUser, který tentokrát vyfiltrujeme, tak aby zobrazoval jméno účtu, jestli je účet povolený a poté ještě stáří hesla. Vše opět uložíme do TXT souboru.

# Zjištění stáří hesla
Get-ADUser -filter * -properties passwordlastset, passwordneverexpires | 
sort-object Surname | 
select-object SamAccountName, Enabled, PasswordLastSet, PasswordNeverExpires | 
Export-csv -path c:\scripts\CHU_all-users-password-info.csv

Ovšem tento seznam je zbytečně obsáhlý a může akorát plést. Proto je lepší zafiltrovat jen aktivní účty v doméně. Proto si do selektu přidáme ještě podmínku where enabled -like "true", což nám způsobí právě to, že se vypíšou jen účty, které jsou aktivní, respektive povolené. Opět vše uložíme do TXT souboru.

# Zjištění stáří hesla jen u povolených účtů
Get-ADUser -filter * -properties passwordlastset, passwordneverexpires | 
sort-object Surname | 
select-object SamAccountName, Enabled, PasswordLastSet, PasswordNeverExpires | 
where enabled -like "true" | 
Export-csv -path c:\scripts\CHU_enabled-users-password-info.csv

Takže nyní už máme vcelku použitelný skript, který nám napráská uživatele, kteří nikdy nezměnili heslo, napráská i poslední změnu hesla, ale jako správný administrátor by jsme si měli co nejvíce zjednodušit práci aby co nejvíce času zbylo na jiné činnosti... pracovní činnosti. Proto bychom měli skript vylepšit a přidat i ověřování, jestli v doméně existuje nějaký uživatel, který má heslo starší než 1 rok. Jeden rok volím já, protože se mi to jeví jako rozumný časový interval pro změnu hesla, ale klidně si můžete s tímto intervalem pohrát a změnit ho.

Jak tedy na to? Nejdříve si určíme proměnnou datumP do které načteme datum, ale o 1 rok zmenšené abychom mohli porovnávat.

# === Zjištění kdo má heslo starší než 1 rok ===
# Porovnávací datum (- 1 rok)
$datumP = (Get-Date).AddYears(-1)#.ToString("dd/MM/yyyy")

Nyní si načteme povolené uživatele v doméně a ještě více si omezíme co se nám má zobrazovat. Začneme tím, že vyhodíme všechny výsledky, které mají hodnotu PasswordLastSet rovnou NULL a zároveň necháme ty výsledky, které mají hodnotu PasswordLastSet menší než porovnávací datum v proměnné datumP, takže starší jak 1 rok. To vše opět uložíme do TXT souboru.

# Nacteni povolenych uzivatelu
$users = Get-ADUser -filter * -properties passwordlastset, passwordneverexpires | 
sort-object Surname | 
select-object SamAccountName, Enabled, PasswordLastSet, PasswordNeverExpires | 
where {$_.enabled -like "true" -And $_.PasswordLastSet -ne $Null -And $_.PasswordLastSet -lt $datumP} |
Export-csv -path c:\scripts\CHU_users-old-password-info.csv

Nyní už jenom takový detail. Řekneme skriptu aby nám tento bonzovací seznam připomněl přes email, který nám pošle. V podstatě není třeba tento kus kódu komentovat, protože je to naprosto primitivní věc, která není v podstatě nic jiného než načtení konfigurace a poté příkaz pro poslání. Dávejte si ovšem pozor přes jaké SMTP posíláte emaily, protože každé SMTP má své specifika a někdy je nutné účet pro posílání těchto emailů donastavit individuálně.

# === Poslani varovneho emailu ===
# Konfigurace emailu
$location = "c:\scripts\"
$From = "powershell@email.cz"
$To = "admin@email.cz"
$Subject = "HESLA AD UZIVATELU"
$SMTPServer = "smtp.gmail.com"
$SMTPPort = "587"
$Body = "POZOR! Probehla diagnostika uzivatelu domeny a je mozne, ze nekteri maji stare hesla! Bez a zkontroluj to... --> Logy zde: $location"

$User = "powershell@email.cz"
$Pass = ConvertTo-SecureString ‘<super_tajne_heslo>’ -AsPlainText -Force
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User,$Pass

# Poslání emailu (je třeba ověření přes google účet!)
Send-MailMessage -From $From -to $To -Subject $Subject -Body $Body -SmtpServer $SMTPServer -port $SMTPPort -UseSsl -Credential $Cred

Hotový skript můžete najít na GIT zde