定位两个 OU 中的所有用户并删除分发列表

Target all users in two OU's and remove Distribution Lists

希望在这里得到一点帮助——我环顾了网站,但没有看到任何类似的东西(如果有,请指导我)。

我需要在我们的用户离职流程中加入一个新步骤,这会将他们从任何 AD 分发列表中删除。我想将其设置为计划任务 运行 每晚针对两个可以找到未激活用户帐户的 OU。

我想 运行 通过将其指向 USERS 而不是分发列表所在的 OU,因为我怀疑我们最终会收到从其他类型中删除这些用户的请求也是组的。

此代码段将从单个用户中删除 AD Distro 列表,但保留所有其他类型的 AD 组:

#  GroupCategory 0 = Distro List
#  GroupCategory 1 = Security Group

#  GroupScope 0 = DomainLocal
#  GroupScope 1 = Global
#  GroupScope 2 = Universal 

$user = "userlogon"
Get-ADPrincipalGroupMembership -Identity $user|
Where {$_.GroupCategory -eq 0} |
ForEach {Remove-ADPrincipalGroupMembership -Identity $user -MemberOf $_ -Confirm:$false} 

此代码段将查看 OU 和 return 一些信息(这只是我将变量与 -searchbase 结合使用的示例):

$OUs = 'OU=PendingDeletion,OU=Users,DC=Stuff,DC=Place,DC=net','OU=HoldForReview,OU=Users,DC=Stuff,DC=Place,DC=net'


$OU | ForEach {Get-ADGroup -Filter * -Properties ManagedBy -SearchBase $_ } |
 Select Name, ManagedBy |
 Sort -Property Name
 Out-GridView 

但是 – 为了完成我的 objective,我会做这样的事情吗?!我在这里有点不知所云,欢迎任何重写建议:

$OUs = 'OU=PendingDeletion,OU=Users,DC=Stuff,DC=Place,DC=net','OU=HoldForReview,OU=Users,DC=Stuff,DC=Place,DC=net'
 $user = "*"

$OUs | ForEach {
        Get-ADPrincipalGroupMembership -Identity $user|
        Where {$_.GroupCategory -eq 0} |
        ForEach {Remove-ADPrincipalGroupMembership -Identity $user -MemberOf $_ -Confirm:$false}
              } 

在 PoSh 中总是有几种方法可以做事,所以我相信有一种更简单的方法可以做同样的事情。如果有人有不同的方法,请随时提出替代方案。

感谢观看!

听起来你需要三个循环。

首先,您需要遍历 OU 列表以获取用户。我们会将用户对象存储在 $Users

$OUs = 'OU=PendingDeletion,OU=Users,DC=Stuff,DC=Place,DC=net','OU=HoldForReview,OU=Users,DC=Stuff,DC=Place,DC=net'
$Users = ForEach ($OU in $OUs) {
    Get-ADUser -Filter * -SearchBase $OU 
}

接下来遍历用户以获取要删除的组。然后遍历组以删除每个组。

ForEach ($User in $Users) {
    Get-ADPrincipalGroupMembership -Identity $user |
    Where-Object {$_.GroupCategory -eq 0} |
    ForEach-Object {
        Remove-ADPrincipalGroupMembership -Identity $user -MemberOf $_
    }
} 

我想我会采取一些不同的方式,通过获取所有用户的组成员身份,然后按 AD 组分组,然后以这种方式处理每个组。似乎对 AD 的调用会少很多。所以我会开始获取所有用户,就像 BenH 一样,除了我会包括他们的 MemberOf 属性。然后我会建立一个潜在群体的列表并过滤到分发列表。我将这些作为键创建一个哈希表,并将值作为该组中每个用户的数组。然后遍历从关联键中删除每个值的值。

$OUs = 'OU=PendingDeletion,OU=Users,DC=Stuff,DC=Place,DC=net','OU=HoldForReview,OU=Users,DC=Stuff,DC=Place,DC=net'
$Users = ForEach ($OU in $OUs) {
    Get-ADUser -Filter * -SearchBase $OU -Properties MemberOf
}
$UsersByGroup = @{}
ForEach($Group in ($Users.MemberOf | Select -Unique | Get-ADGroup | Where{ $_.GroupCategory -eq 0 })) {
    $UsersByGroup.Add($Group.DistinguishedName,($Users | Where{ $Group.DistinguishedName -in $_.MemberOf}))
}
$UsersByGroup.Keys | ForEach{
    Remove-ADGroupMember -Identity $_ -Members $UsersByGroup[$_] -Confirm:$false
}