Удалить все группы при указании c OU - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь создать сценарий очистки AD, который пропустит go через завершенное подразделение и проверит удаление всех пользователей из указанных c подразделений. в настоящее время, если я запустлю его, он удалит всех пользователей в прекращенном OU из всех OU. Я мог бы просто быть слепым, но есть ли простой способ, чтобы он только удалял группы из выбранных OU?

$OUs = "OU=Terminated,OU=####,OU=####,DC=####,DC=####"

$results = foreach ($OU in $OUs) {
    get-aduser -SearchBase $OU -filter * -properties MemberOf | foreach-object {
        ? $_.MemberOf -like "*OU I want removed*" | Remove-ADGroupMember -Members $_.DistinguishedName -Confirm:$false -whatif
    }
}
$results | Export-Csv '.\Users groups have been remoed from.csv' -NoTypeInformation

Я думал, что это будет работать, однако все, что он мне дает, это:

Where-Object : A positional parameter cannot be found that accepts argument 'Microsoft.ActiveDirectory.Management.ADPropertyValueCollection'.
At C:\###\###\###\accounts script.ps1:8 char:13
+             ? $_.MemberOf -like "*Distrobution Lists*" | <#%{$keep -n ...

1 Ответ

0 голосов
/ 14 января 2020

Учитывая, что у вас есть отдельное подразделение для групп, вы можете перебирать группы, которые есть у завершенного пользователя, и посмотреть, относится ли какая-либо из групп к этому указанному 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
  }
}
...