Powershell 以两个OU中的所有用户为目标';删除和删除通讯组列表

Powershell 以两个OU中的所有用户为目标';删除和删除通讯组列表,powershell,active-directory,distribution-list,Powershell,Active Directory,Distribution List,希望在这里得到一点帮助-我环顾了网站,但没有看到任何类似的东西(如果有,请直接告诉我,我错过了) 我需要在我们的用户离开流程中加入一个新的步骤,这将从任何广告分发列表中删除他们。我想将此设置为一个计划任务,每晚针对两个OU运行一次,在那里可以找到未激活的用户帐户 我想通过将它指向用户而不是发行版列表所在的OU来运行它,因为我怀疑我们最终会得到从其他类型的组中删除这些用户的请求 此代码段将从单个用户中删除广告发行版列表,但保留所有其他类型的广告组: # GroupCategory 0 = Dis

希望在这里得到一点帮助-我环顾了网站,但没有看到任何类似的东西(如果有,请直接告诉我,我错过了)

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

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

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

#  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并返回一些信息(仅以我使用带有-searchbase的变量为例):

但是——为了完成我的目标,我会做这样的事情吗?!我在这里有点不知所措,任何关于重写的建议都非常感谢:

$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}
              } 
在时尚生活中,总是有几种方法可以做一些事情,所以我相信有一种不那么复杂的方法可以做同样的事情。如果有人有不同的方法,请随时提出替代方案


谢谢你看

听起来你需要三个循环

首先,您需要在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 $_
    }
} 

听起来你需要三个循环

首先,您需要在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 $_
    }
} 

我想我会采取一些不同的做法,获取所有用户的组成员资格,然后按广告组分组,并以这种方式处理每个组。看起来打广告的电话会少很多。所以我会开始联系所有的用户,就像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
}

我想我会采取一些不同的做法,获取所有用户的组成员资格,然后按广告组分组,并以这种方式处理每个组。看起来打广告的电话会少很多。所以我会开始联系所有的用户,就像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
}

非常酷-回想起来看起来很简单!我还有一个步骤要补充,但我现在把这个标记为已解决!非常酷-回想起来看起来很简单!我还有一个步骤要补充,但我现在把这个标记为已解决!哦,哇,那也很酷。我必须承认,我对这个问题的理解不如我对BenH的答案的理解,但我试着把它们都标为答案,因为我认为它们都是有效的方法。很抱歉,我不能同时给出这个答案!如果您有任何具体问题,请随时提问,我会尽力解释。谢谢!我实际上正在与脚本的第一部分搏斗,它收集了所有的用户。。。我需要结合一些逻辑,将收集的用户限制为广告中过期日期超过30天的用户。在我最初的问题得到回答后,我不想鼓励“范围蔓延”,所以我发布了另一个问题-如果你想看一下,我的第一步和问题就在那里!。哦,哇,那也很酷。我必须承认,我对这个问题的理解不如我对BenH的答案的理解,但我试着把它们都标为答案,因为我认为它们都是有效的方法。很抱歉,我不能同时给出这个答案!如果您有任何具体问题,请随时提问,我会尽力解释。谢谢!我实际上正在与脚本的第一部分搏斗,它收集了所有的用户。。。我需要结合一些逻辑,将收集的用户限制为广告中过期日期超过30天的用户。在我最初的问题得到回答后,我不想鼓励“范围蔓延”,所以我发布了另一个问题-如果你想看一下,我的第一步和问题就在那里!。