使用Remove-ADGroupMember从多个组中删除用户和组

时间:2016-03-18 20:29:33

标签: powershell

希望有人能指出我正确的方向。另外我还是承认,可能有更好的方法来做我在这里做的事情,但我的目标是让这个工作并理解我做错了所以我很欣赏我的代码修正而不是写一些来自如果可能的话,划伤。

所以这就是我的目标:我在AD中有一个组列表,它们都具有相似的名称格式。我正在尝试创建这些组的数组,并删除不是特定组成员的任何用户以及不是特定组成员的任何组。

例如,WAS-MyAdmins和NYC-MyAdmins是两个组名。他们有一些用户应该留下来,也可能有一些应该留下来的团体。他们还有需要删除的用户和组。我发誓我早些时候已经部分工作了,但我已经尝试了几件事,但又无法回到那一点。

当我运行它时,它只删除所有用户和组。

$Groups = Get-ADGroup -Filter 'Name -like "*-MyAdmins"' | Foreach-Object{ 
$Members1 = Get-ADGroupMember -Identity $_ | Where {$_.ObjectClass -eq 'user'} | Get-ADUser -Properties * | Where {$members1.memberof -ne "CN=Tech_IDs,OU=Groups,DC=contoso,DC=com"}
Remove-ADGroupMember -Identity $_ -Members $Members1 -Confirm:$true}
$Members2 = Get-ADGroupMember -Identity $_ | Where {$_.ObjectClass -eq 'Group'}| Get-ADGroup -Properties * | where {$Members2.memberof -ne "CN=Tech_Group,OU=Groups,DC=contoso,DC=com"}
Remove-ADGroupMember -Identity $_ -Members $Members1 -Confirm:$true

更新代码

$Groups = Get-ADGroup -Filter 'Name -like "*-MyAdmins"' | Foreach-Object{ 
$Members1 = Get-ADGroupMember -Identity $_ | Where {$_.ObjectClass -eq 'user'} | Get-ADUser -Properties * | Where {$_.memberof -notcontains "CN=Tech_IDs,OU=Groups,DC=contoso,DC=com"}
Remove-ADGroupMember -Identity $_ -Members $Members1 -Confirm:$true
$Members2 = Get-ADGroupMember -Identity $_ | Where {$_.ObjectClass -eq 'Group'}| Get-ADGroup -Properties * | where {$_.memberof -notcontains "CN=Tech_Group,OU=Groups,DC=contoso,DC=com"}
Remove-ADGroupMember -Identity $_ -Members $Members1 -Confirm:$true}

1 个答案:

答案 0 :(得分:0)

我认为您当前的代码存在三个主要问题:

  • 删除组不在ForEach-Object循环之内,因此$_中的Get-ADGroupMember -Identity $_不会被填充。
  • 您在同一个表达式中使用变量$members1$members2,并将其结果分配给相应的变量。你可能想在两种情况下使用$_
  • 使用等于运算符(memberOf)将-eq属性(数组)的值与可分辨名称(字符串)进行比较。要检查数组是否包含特定值,您需要使用-contains运算符。

使用专有名称来选择项目是正确的想法,因为它是AD对象的唯一属性之一。它也是AD cmdlet返回的对象的默认属性之一,因此它几乎总是随时可用。但是,你过度复杂了。例如,不需要单独处理用户和组。

要从AD群组中移除用户和/或群组,当他们不是特定其他群组的成员时,您首先要构建其他群组成员的可分辨名称列表:

$groups = 'Tech_IDs', 'Tech_Group'
$dn = $groups | Get-ADGroupMember | Select-Object -Expand DistinguishedName

使用该列表,您可以过滤给定组的成员:

$members = Get-ADGroupMember -Identity $group |
           Where-Object { $dn -notcontains $_.DistinguishedName }

结果,您将获得应该删除的那些组成员的列表。然后你做了:

Remove-ADGroupMember -Identity $group -Members $members -Confirm:$false

对您需要处理的所有群组重复第二步和第三步,并完成。