Active Directory: Benutzer in verschachtelten Gruppen auflisten

Ich mag die Best-Practices was das Zuordnen von Gruppen und Benutzern zu Ressourcen angeht, leider sieht man dann aber nicht auf den ersten Blick welcher Benutzer tatsächlich Zugriff hat, oder welcher Benutzer in einer Kette verschachtelter Gruppen steckt. Daher habe ich ein kleines Script geschrieben welches Gruppen, Berechtigungen auf Ordnern und Postfächern rekursiv auslösen kann. Keine große Sache, aber manchmal vieleicht ganz hilfreich. Hier ein Screenshot:

image

image

Hier nun das Script. Einfach in eine .PS1 Datei kopieren und ausführen, wenn Postfächer abgefragt werden soll, muss das Script in der Exchange Management Shell ausgeführt werden, ansonsten reichen die normalen Active Directory Snap-Ins.

<#
————————————————————————————–
Script zum recursiven Auflösen von Gruppen
www.frankysweb.de

by Frank Zöchling
Version 0.1

————————————————————————————–
#>

# Menu aufbauen
write-host „“
write-host „Besuchen Sie meine Website: www.FrankysWeb.de“ -foregroundcolor green
write-host „“
write-host „Für welchen Typ sollen Gruppen aufgelöst werden?“
write-host „“
write-host “ 1 – Gruppe“
write-host “ 2 – Ordner“
write-host “ 3 – Postfach“
write-host „“
write-host “ 0 – Beenden“
write-host „“

# Option abfragen
do {
try {
$numOk = $true
[int]$option = Read-host „Option wählen“
} # end try
catch {$numOK = $false}
} # end do
until (($option -ge 0 -and $option -lt 4) -and $numOK)

#———————————————————

$ErrorActionPreference = „Silentlycontinue“

# Option 1 (Gruppe)
if ($option -eq 1)
{

write-host „“
$group = read-host „Gruppe angeben“
$members = Get-ADGroupMember „$group“ -recursive
$users =@()
foreach ($member in $members)
{
$Name = $member.name
$Sam = $member.SamAccountname
$dn = $member.distinguishedName
$users += new-object PSObject -property @{Name=“$name“;sAMAccountName=“$sam“;distinguishedName=“$dn“}
}
$users | sort-object Name -unique | ft -autosize
}

# Option 2 (Ordner)
if ($option -eq 2)
{
write-host „“
$folder = read-host „Ordner angeben“
$acl = get-acl $folder
$acl = $acl.access
$acl = $acl | where {$_.IdentityReference -notmatch „NT-AUTORITÄT“ -and $_.IdentityReference -notmatch „VORDEFINIERT“}
$users =@()
foreach ($entry in $acl)
{
[string]$group = $entry.IdentityReference
$group = $group.split(„\“)[1]
$rights = $entry.FileSystemRights
$members = Get-ADGroupMember „$group“ -recursive

foreach ($member in $members)
{
$Name = $member.name
$Sam = $member.SamAccountname
$dn = $member.distinguishedName
$users += new-object PSObject -property @{Name=“$name“;sAMAccountName=“$sam“;distinguishedName=“$dn“;Rights=“$rights“}
}
}
$users | sort-object Rights | ft -autosize
}

# Option 3 (Postfach)
if ($option -eq 3)
{
write-host „“
$mailbox = read-host „Postfach angeben“
$acl = Get-MailboxPermission $mailbox | where {$_.AccessRights -eq „FullAccess“ -and $_.User -notmatch „NT-Autorität“}
$users =@()
foreach ($entry in $acl)
{
[string]$group = $entry.User
$group = $group.split(„\“)[1]
$members = Get-ADGroupMember „$group“ -recursive

foreach ($member in $members)
{
$Name = $member.name
$Sam = $member.SamAccountname
$dn = $member.distinguishedName
$users += new-object PSObject -property @{Name=“$name“;sAMAccountName=“$sam“;distinguishedName=“$dn“}
}
}
$users | sort-object Name -unique | ft -autosize
}

# Option 0 (Beenden)
if ($option -eq 0)
{
write-host „“
write-host „Beendet.“
write-host „“
}

Das Objejt “$users” enthält übrigens immer die aufgelösten Benutzer, falls Ihr das Script erweitern wollt…

1 Gedanke zu „Active Directory: Benutzer in verschachtelten Gruppen auflisten“

  1. Mega cool Franky,

    hast Du noch eine Idee wie man die Gruppen alle in eine Datei packen kann um sie dann alle auszulesen?
    Den Dateiexport habe ich bereits eingebunden.

    Gruß,
    ChrisIO

    Antworten

Schreibe einen Kommentar