Учитывая, что у вас есть отдельное подразделение для групп, вы можете перебирать группы, которые есть у завершенного пользователя, и посмотреть, относится ли какая-либо из групп к этому указанному c подразделению. Если это так, удалите все эти группы.
$results = ""
foreach ($ou in $OUs)
{
$users = Get-ADUser -SearchBase $ou -Filter *
foreach ($user in $users)
{
$groups = Get-ADPrincipalGroupMembership -Identity $User | ? {$_.distinguishedName -like "*OU I WANT TO REMOVE FROM*" }
foreach($group in $groups)
{
Remove-ADPrincipalGroupMembership -Identity $user -MemberOf $group -whatif
results += "$user removed from its Groups: $($groups | % { $_.name })\r\n"
}
}
}
results | Out-File -Append C:\temp\new.txt
$ groups будут иметь члены в этом формате. В качестве типа фильтра вы можете использовать difishedName и использовать что-то вроде «OU = Groups, DC = this, DC = com» вместо «OU = Groups», что можно считать широким.
distinguishedName : CN=GroupName,OU=****,DC=****,DC=****
GroupCategory : Security
GroupScope : Global
name : <Name Of The Group>
objectClass : group
objectGUID : <Object Guid>
SamAccountName : <Name Of The Group>
SID : <SID>
Мне нравится сохраните переменные, чтобы я мог использовать их, чтобы записывать, какие изменения выполняются.
ПРИМЕЧАНИЕ: Я использовал -whatif
, чтобы удостовериться, что он не выполняет то, что вы собираетесь, для целей тестирования. Remove-ADPrincipalGroupMembership
также обновляет пользователя с одной группой.
Другой способ go об этом
foreach ($ou in $OUs)
{
$users = Get-ADUser -SearchBase $ou -Filter *
$groups = Get-ADGroup -Filter * -SearchBase $DecomOUGROUP
foreach($group in $groups) {
Remove-ADGroupMember -Identity $group -Members $users -ErrorAction SilentlyContinue
}
}