【问题标题】:Target all users in two OU's and remove Distribution Lists定位两个 OU 中的所有用户并删除分发列表
【发布时间】:2017-06-06 02:33:17
【问题描述】:

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

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

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

此 sn-p 将从单个用户中删除 AD 发行列表,但保留所有其他类型的 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} 

这个 sn-p 将查看一个 OU 并返回一些信息(只是我在 -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 

但是——为了完成我的目标,我会做这样的事情吗?!我在这里有点超出我的深度,感谢任何关于重写的建议:

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

感谢观看!

【问题讨论】:

    标签: powershell active-directory distribution-list


    【解决方案1】:

    所以听起来你需要三个循环。

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

    【讨论】:

    • 非常酷 - 回想起来看起来很简单!我还有一个步骤要添加,但我现在将此标记为已解决!
    【解决方案2】:

    我想我会采取一些不同的做法,通过获取所有用户的组成员身份,然后按 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
    }
    

    【讨论】:

    • 哇哦,这也很酷。我不得不承认,我对这个问题的理解不如我理解 BenH 的答案那么好,但我尝试将它们都标记为答案,因为我认为它们都是有效的方法。抱歉,我不能也给予这个答案!
    • 如果您有任何具体问题,请随时提出,我会尽力解释。
    • 谢谢!我实际上正在与收集所有用户的脚本的第一部分搏斗......我需要结合一些逻辑来将收集的用户限制为仅在 AD 中过期日期超过 30 天的用户。在我最初的问题得到回答后,我不想鼓励“范围蔓延”,所以我发布了另一个问题 here - 如果你想看一看,我的第一步和问题就在那里!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    相关资源
    最近更新 更多