Putin is a war criminal and a son of a bitch!


 

Potřeboval jsem vytvořit evidenci uživatelů kvůli revizím účtů. Napsal jsem skript v Powershell, který vypisuje naprosto všechny skupiny uživatelů.
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 UTF8

Jako 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
    }
}