Soms wil je rechten geven op resources aan gebruikers in een bepaalde OU of je wilt gebruikers in een bepaalde OU een fine grained password policy meegeven.
In Microsoft Active Directory kun je aan OUs geen access permissions verlenen. Je zult dan een zogenoemde Shadow Group moeten aanmaken.
Een Shadow Group is een AD Security Group die je plaatst in de betreffende OU waar je access permissions op wilt verlenen.
De naam van de Security Group komt overeen met de naam van de OU. Verder worden alle objecten die in de OU staan toegevoegd aan deze Security Group.
Het beheren van deze Shadow Group is natuurlijk een kriem omdat je objecten die naar een andere OU worden verplaatst handmatig uit deze Security Group moet halen en nieuwe objecten handmatig moeten worden toegevoegd.
Het beste alternatief daarop is om een gebruik te maken van een Powershell script en deze te schedulen zodat elke dag om de zoveel uur wordt uitgevoerd.
Stap 1:
Maak op bijvoorbeeld een DC een tekst bestand aan. Zeg “C:\PSScripts\update-shadowgroup.ps1”. Kopieer vervolgens onderstaande Powershell functie naar dat ps1 bestand.
<#
.SYNOPSIS
Updates a shadow group membership based on the user or computer objects within an ou
.DESCRIPTION
Better description
.NOTES
Function Name : Update-ShadowGroup
Author : Adam Stone
Requires : PowerShell V2 with AD management pack
.LINK
http://adadmin.blogspot.com/
.EXAMPLE
Simple usage
PS C:\> Update-ShadowGroup -ou "OU=ShadowOU,OU=Test,DC=domain,DC=com" -group shadowgroup
.EXAMPLE
Simple usage
PS C:\> Update-ShadowGroup "OU=ShadowOU,OU=Test,DC=domain,DC=com" shadowgroup
.EXAMPLE
Specify SearchScope
PS C:\> Update-ShadowGroup "OU=ShadowOU,OU=Test,DC=domain,DC=com" shadowgroup -searchscope Subtree
.EXAMPLE
Specify name filter
PS C:\> Update-ShadowGroup "OU=ShadowOU,OU=Test,DC=domain,DC=com" shadowgroup -name srv*
.PARAMETER OU
DN of the OU - required
.PARAMETER Group
Name of the Group - required
.PARAMETER Name
Search pattern to match for the object name
.PARAMETER SearchScope
Can be either "Base" "OneLevel" or "Subtree" - default OneLevel
#>
param (
[Parameter(Position=0, Mandatory=$true,HelpMessage="Enter the DN of the OU (eg ou=test,dc=domain,dc=com)")]
[string] $ou = ""
,
[Parameter(Position=1, Mandatory=$true,HelpMessage="Enter the name of the group (eg group1)")]
[string] $Group = ""
,
[Parameter(Mandatory=$false)]
#valadate the input against defined set of attributes
[string] $name = "*"
,
[Parameter(Mandatory=$false)]
#valadate the input against defined set of attributes
[validateset("Base","OneLevel","Subtree")]
[string] $searchscope = "OneLevel"
)
#the processes the function will complete
process {
try{
$getOU = Get-ADOrganizationalUnit $ou
}
catch {
write-error -message "OU $ou does not exist" -RecommendedAction "Make sure the OU is spelt correctly and try again" ;break
}
try{
$getgroup = get-adgroup $group
}
catch {
write-error -message "Group $group does not exist" -RecommendedAction "Make sure the Group name is spelt correctly and try again" ;break
}
$objects = $(get-adobject -SearchBase $OU -SearchScope $searchscope -filter {((ObjectCategory -eq "user") -or (ObjectCategory -eq "computer")) -and (name -like $name)})
$groupmembers = Get-ADGroupMember -Identity $Group
If ($objects -eq $null -and $groupmembers -eq $null){break}
If ($objects -eq $null){remove-adgroupmember -identity $group -member $groupmembers -confirm:$false;write-host "$OU was empty, all objects removed"}
If ($groupmembers -eq $null){
add-adgroupmember -identity $group -member $objects;write-host "$group was empty, all objects added"
}Else{
switch (Compare-Object -ReferenceObject $groupmembers -DifferenceObject $objects -property name){
{$_.SideIndicator -eq "=>"} {add-adgroupmember -identity $group -member $(get-adobject -LDAPFilter "(name=$($_.name)*)"); write-host "$($_.name) added to $group"}
{$_.SideIndicator -eq "<="} {remove-adgroupmember -identity $group -member $(get-adobject -LDAPFilter "(name=$($_.name)*)") -confirm:$false; write-host "$($_.name) removed from $group"}
}
}
}
Stap 2:
Maak vervolgens een extra ps1 (update-shadowgroups.ps1) bestand aan en plak daar onderstaande code in:
Import-Module ActiveDirectory
. C:\PSScripts\update-shadowgroup.ps1
update-shadowgroup "OU=Sales,DC=domein,DC=local" Sales
update-shadowgroup "OU=Finance,DC=domein,DC=local" Finance
Deze code zorgt ervoor dat de shadow group Sales en Finance worden bijgewerkt.
Let op het script heeft wel de Powershell module ActiveDirectory nodig om deze acties uit te voeren.
Let op het script heeft wel de Powershell module ActiveDirectory nodig om deze acties uit te voeren.
Test:
Maak twee OUs aan: Sales en Finance en plaats daar een aantal gebruikers aan.
Voer vervolgens het script (update-shadowgroups.ps1) uit.
Hieronder een screenshot nadat ik de gebruiker “Verkoper 3” had verplaatst van de OU Sales naar de OU Finance.
Zoals je ziet wordt deze gebruiker automatisch uit de Security Group Sales verwijderd en toegevoegd aan de Security Group “Finance”
Stap 3:
Maak een nieuwe taak aan in Task Scheduler.
Op het "Actions" tabblad "Start a program" en geef daar bij Settings op dat het volgende Program/script moet worden uitgevoerd:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Bij "Add arguments (optional)" voer je in wat powershell moet uitvoeren:
c:\PSScripts\update-shadowgroups.ps1 -noprofile -Noninteractive
Maak een nieuwe taak aan in Task Scheduler.
Op het "Actions" tabblad "Start a program" en geef daar bij Settings op dat het volgende Program/script moet worden uitgevoerd:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Bij "Add arguments (optional)" voer je in wat powershell moet uitvoeren:
c:\PSScripts\update-shadowgroups.ps1 -noprofile -Noninteractive
Hieronder een link naar het blog van de maker van de manage-shadowgroup funtie: