Back in March 2010 when Powershell and I were on somewhat less friendly terms, I wrote an OU shadow script to populate group membership based on the contents of an OU. Since then, Powershell and I now at least acknowledge eachother when we pass in the corridor and I have updated the script with some improvements.
One common use for the script is populating group memberships for use with Fine-Grained Password Policy (FGPP).
Please leave a comment if you see any scope for improvement. You can download a copy of the script here: OUBasedGroupMembership ps1
#########################################################
#
# Name: OUBasedGroupMembership.ps1
# Author: Tony Murray
# Version: 1.0
# Date: 03/09/2013
# Comment: PowerShell 2.0 script to
# manage group membership based on OU contents
#
#########################################################
# Import the AD module
ipmo ActiveDirectory
# Define arrays to be used for matching
$arrou = @()
$arrgp = @()
# Domain controller to be used
$dc = (Get-ADRootDSE).dnshostname
write-host "Using DC $dc for all AD reads/writes"
# Specify the OU where the accounts are located
$OUdn = "OU=Admin Accounts,OU=AD Administration,DC=contoso,DC=com"
$OuUsrs = Get-ADUser -Filter * -SearchBase $oudn -Server $dc
# Specify the group to use
$grp = "de42112f-81d2-4849-900c-d6907c77d3f5" # "Service Accounts"
$grpusers = Get-ADGroupMember -Identity $grp -Server $dc
# Build arrays using the DN attribute value
$OuUsrs | % {$arrou += $_.distinguishedname}
$grpusers | % {$arrgp += $_.distinguishedname}
# Add to group membership (new user in OU)
foreach ($usr in $arrou) {
if ($arrgp -contains $usr) {
write-host "User $usr is a member of the group"
}
else {
write-host "User $usr is not a member of the group - adding..."
#Add-ADGroupMember -Identity $grp -Members $usr -Server $dc
} # end else
Remove-Variable -ErrorAction SilentlyContinue -Name usr
} # end foreach
write-host "`n"
# Remove from group membership (no longer in OU or has been manually added to group)
# The assumption here is that the OU is authoritative for the group's membership
foreach ($mem in $arrgp) {
if ($arrou -contains $mem) {
write-host "User $mem is located in the OU. Nothing to do"
} # end if
else {
write-host "User $mem is not present in the OU. Removing from membership..."
#Remove-ADGroupMember -Identity $grp -Members $mem -Server $dc -Confirm:$false
} # end else
Remove-Variable -ErrorAction SilentlyContinue -Name mem
} # end foreach

Great update thank Tony
Great update thank Tony