En Shadow Group i Active Directory är en behörighetsgrupp som speglar innehållet i en OU. Det är ett av Microsoft vedertaget begrepp och är vanligt förekommande bland frågorna vid certifieringar.
Det finns inte något inbyggt sätt att underhålla en Shadow Group, man får använda egna script för att göra detta.
I min implementation har jag valt att använda använda Active Directory även för att markera vilka grupper som ska vara Shadow Groups, så att jag inte behöver modifiera några script när jag skapar nya.
Jag använder fältet Notes för att ange vilken OU som gruppen ska spegla. Prefixet shadow:// har jag själv hittat på för att minimera risken att fel uppstår då Notes används till andra saker.
Scriptet
Här är själva scriptet som sedan uppdaterar grupperna.
# Importerar modulen för Active Directory Import-Module ActiveDirectory # En datum-sträng som används vid loggningen $d=Get-Date -Format "yyyy-MM-dd hh:mm" # Tar fram alla grupper i AD där Notes (Info) # börjar med strängen shadow:// Get-ADGroup -Filter * -Properties info | # alla grupper... Where-Object {$_.Info} | # ...där info inte är null... Where-Object {$_.Info.StartsWith("shadow://")} | # ...och har rätt prefix. ForEach-Object { # Lyfter ut lite information i variabler $gr=$_ # Gruppen i fråga, objekt $grName = $_.Name # Gruppens namn, för loggning $grDN=$_.DistinguishedName # Gruppens DN $ou=$_.info.substring(9) # DN för det OU som gruppen ska spegla Write-Output "$d $grName SHADOW $ou" # Skapar en lista över vilka användarkonton som ska tas bort ur gruppen $remove = Get-ADGroupMember -Identity $gr | Where-Object { $_.distinguishedName -NotMatch $ou } # Raderar medlemmarna ur gruppen baserat på listan (om den inte är tom) if($remove -ne $null) { $remove | ForEach-Object { $uName = $_.Name # Loggning Write-Output "$d $grName REMOVE $uName" # Loggning Remove-ADPrincipalGroupMembership -Identity $_ -MemberOf $gr -Confirm:$false } } # Skapar en lista över vilka medlemmar som ska läggas till. # Använder LDAP-filter för att inte ta med existerande medlemmar. $add= Get-ADUser -SearchBase $ou -SearchScope OneLevel -LDAPFilter "(!memberOf=$grDN)" # Lägger till medlemmar i gruppen baserat på listan (om den inte är tom) if($add -ne $null) { $add | ForEach-Object { $uName = $_.Name #Loggning Write-Output "$d $grName ADD $uName" #Loggning Add-ADPrincipalGroupMembership -Identity $_.DistinguishedName -MemberOf $gr } } Write-Output "$d $grName DONE" }
Schemaläggning av scriptet
Eftersom jag har spenderat åtskilliga timmar med att svära över schemaläggningen av Powershell-script sammanfattar jag är min egen metod.
- Skapa en vanlig Basic Task i Windows Task Scheduler.
- Ange Powershell.exe som program. Du behöver inte ange fullständig sökväg.
- Ange ”E:\Scripts\ShadowGroups.ps1 >> E:\Scripts\ShadowGroups.log" som parameter. Detta är det Powershell-kommando som ska köras. Du måste använda en fullständig sökvägar, Powershell tar INTE med aktiv katalog (angiven i Start in).
- Om du har mellanslag i sökvägarna måste du enkelfnutta dem inom dubbelfnuttarna enligt:
”’E:\Admin Scripts\ShadowGroups.ps1’ >> ‘E:\Admin Logs\ShadowGroups.log’"
Min färdiga Schedule task ser ut så här: