Shadow Groups – OU-basierte dynamische Security Groups

Wer schon mal mit Novel Directory Service oder Novel eDirectory zu tun hatte, kennt die recht schicke Möglichkeit, Berechtigungen und Resourcen anhand von OUs zu vergeben. Im AD ist das nativ nicht ganz so komfortabel möglich. Eine inoffizelle Alternative ist die Pflege von Shadow Groups, die regelmäßig die Mitglieder eine Security Group mit den Usern (oder Computern) einer OU abgleicht.

Ein Beispiel hierfür ist z.B., dass ich meinen Administratoren (die alle in der OU „Admins“ sind), ein eigene Fine-Grained Password Policy zuweisen möchte und dies natürlich automatisch auch für neu angelegte Admins passieren soll.

Im folgenden „einfachen“ Fall werden einfach alle Mitglieder der Shadow Group erst entfernt und danach alle Benutzerobjekte der OU der Gruppe wieder hinzugefügt.

$OU="OU=Admins,DC=lab,DC=local"
$ShadowGroup="CN=Admins-Shadow-Group-Name,OU=Security Groups,DC=lab,DC=local"
Get-ADGroupMember –Identity $ShadowGroup | Where-Object {$_.distinguishedName –NotMatch $OU} | ForEach-Object {Remove-ADPrincipalGroupMembership –Identity $_ –MemberOf $ShadowGroup –Confirm:$false}
Get-ADUser –SearchBase $OU –SearchScope OneLevel –LDAPFilter "(!memberOf=$ShadowGroup)" | ForEach-Object {Add-ADPrincipalGroupMembership –Identity $_ –MemberOf $ShadowGroup}

Etwas schöner geht das, indem nur Mitglieder entfernt werden, die nicht mehr in der OU sind und nur neue Mitglieder aus der OU hinzugefügt werden.

$OU="OU=Admins,DC=lab,DC=local"
$ShadowGroup="CN=Admins-Shadow-Group-Name,OU=Security Groups,DC=lab,DC=local"
$GroupMembers = Get-ADGroupMember -Identity $ShadowGroup | ? objectClass -eq "user"
$GroupMembers | %{ if($OUUser.Name -notcontains $_.Name) Remove-ADPrincipalGroupMembership -Identity $_ -MemberOf $ShadowGroup
$OUUsers = Get-ADUser -Filter * -SearchBase $OU
$OUUsers | %{ if($GroupMembers.Name -notcontains $_.Name) Add-ADPrincipalGroupMembershipt -Identity $_ -MemberOf $ShadowGroup

Da ein Abgleich zwischen Benutzerobjekten einer OU und den Gruppenmitgliedern regelmäßig erfolgen muss, ist ein Scheduled Task erforderlich (z.B. auf einem der DCs), der z.B. stündlich ausgeführt wird und die beiden Datensätze miteinander in Einklang bringt. Wichtig ist dabei, folgende Einstellung zu konfigurieren:

General -> Security options           Run with highest privileges
Actions -> Action:                    Start a program
Actions -> Program/script:            C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe
Actions -> Add arguments (optional):  -command <Pfad-zum-PS-Script>\<PS-Script>.ps1

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.