V doméně se běžně děje, že jsou skupiny vnořovány do sebe a je potom dost pravděpodobné přiřazení uživateli nějaké skupiny, kterou nechcete.
Příklad:
Domain Users -> special_users -> RDP_to_management
V případě přidělení uživatele do skupiny "domain users" se zdědí i podskupiny "special_users" a "RDP_to_management".
Pozor na používání příkazu "net user pepa /domain", který může být vynikající nástroj ovšem v tomto případě selhává, protože vám klidně řekne, že skupina RDP_to_management je prázdá. Přitom ji mají přiděleni všchni uživatelé.
Stejným problémem trpí i příkaz Get-ADUser, který také nevypíše vnořené skupiny.
Skript je postaven na logice výpisu všech skupin a následné vyhledání všech uživatelů.
Připomínám, že nejlepší je spouštět jej na některém z doménových řadičů, protože jinak vyžaduje import modulu ActiveDirectory pro powershell.
$ADGroups = Get-ADGroup -Filter '*'$Results = ForEach ($AdGroup in $ADGroups){ $Members = Get-AdGroupMember -Identity $AdGroup -Recursive | Where-Object objectClass -Match user | %{Get-ADUser -Identity $_.SamAccountName -Properties Enabled} ForEach ($Member in $Members) { $Hash = @{ Group = $AdGroup.SamAccountName Name = $Member.Name Member = $Member.SamAccountName Enabled = $Member.Enabled } New-Object -TypeName PSObject -Property $Hash }}$Results | Export-Csv -Path members_AD.csv -NoTypeInformation -Encoding UTF8Jako bonus ještě přikládám skript, který vám ukáže, jaké skupiny jsou kam vnořené.
$ADGroups = Get-ADGroup -Filter '*'ForEach ($AdGroup in $ADGroups){ $Members = Get-ADGroupMember "$AdGroup" | Select-Object objectClass,name | Where-Object objectClass -Match group ForEach ($Member in $Members) { $Hash = @{ Group = $AdGroup.SamAccountName Member = $Member.Name } New-Object -TypeName PSObject -Property $Hash }}