Shadow groups används i Active Directory (AD) för att enklare administrera olika konton som är; satta i olika s.k. Organizational Units, OU:n. Ibland flyttar man användare över OU:n, av olika orsaker, och detta skript gör det enkelt att kontrollera att varje användare tillhör rätt grupp och OU. För automatisk kontroll bör detta skript schemaläggas.

  • PowerShell är installerat
  • Alla grupper har SG_ som prefix

I skriptet finns alla grupper i example.com/Accounts/Groups/Roles, medan användarna finns i deras respektive OU i example.com/Accounts.

Modifiering av skriptet

Då skriptet är licenserat i enlighet med Apache-licensen version 2 (se länk till höger av sidan) kan du göra i princip allt du vill med det. För att ändra katalogen där grupperna existerar ska variabeln $groups modifieras vid flaggan -SearchBase, och $base till platsen där alla OU:n med deras konton existerar.

Om du undrar något över detta skript och/eller vill ha hjälp med det kan du skicka mig ett mail. Dock kan jag inte lova att jag kan svara på det direkt, och om jag finner det intressant att publicera på bloggen kan jag komma att göra det med tillhörande svar.

############ METADATA ############
# Author: Kristoffer Qvist
# Description: Control that
# correct users, in the
# corresponding OU are set to
# their correct shadow group.
##################################
Import-Module ActiveDirectory
$groups = Get-ADGroup -Filter{name -like "SG_*"} -SearchBase "OU=Roles,OU=Groups,OU=Accounts,DC=example,DC=com"

foreach ($group in $groups) {
    try {
        # This block adds users to their correct Shadow Groups
        $groupSAM = $group.SamAccountName
        $OU       = $groupSAM.Replace("SG_", "")
        $base     = "OU=$OU,OU=Accounts,DC=example,DC=com"
        $users    = Get-ADUser -Filter * -SearchBase $base -Properties DistinguishedName | Select -ExpandPropert DistinguishedName
        foreach ($user in $users) {
            Add-ADGroupMember -Identity $groupSAM -Members $user
        }

        # This block removes users from wrong Shadow Groups
        $groupMember = get-adgroupmember -identity $groupSAM
        foreach ($member in $groupMember) {
            $dgn    = $member.distinguishedName
            $thisOU = Get-ADUser -LDAPFilter "(samAccountType=805306368)" -SearchBase $base
            if ($thisOU -match $dgn) {
                # Nothing to be done ; $dgn should match $thisOU
            } else {
                Remove-ADGroupMember -Identity $groupSAM -Members $dgn -confirm:$false
            }
        } 
    } catch {
        "There was an error adding/removing an user to the correct OU or shadow group. ($group)"
    }
}
# It's good practice to remove the module used
Remove-Module ActiveDirectory