希望在这里得到一点帮助 - 我环顾了网站,但没有看到任何类似的东西(请指示我,如果有,我错过了它。)
我需要在用户离线流程中添加一个新步骤,这将从任何AD分发列表中删除它们。我想把它设置为一个计划任务,每晚运行一次针对可以找到未激活用户帐户的两个OU。
我想通过将它指向USERS而不是发布列表所在的OU来运行它,因为我怀疑我们最终会收到从其他类型的组中删除这些用户的请求。 / 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}
这段代码会查看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中总有几种方法可以做到,所以我确信有一种不那么复杂的方法来做同样的事情。如果有人有不同的方法,请随意提出替代方案。
谢谢你看看!
答案 0 :(得分: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 $_
}
}
答案 1 :(得分:1)
我认为通过获取所有用户的组成员资格,然后按AD组进行分组,然后以这种方式处理每个组,我会稍微改变一下。似乎对AD的呼叫要少得多。所以我开始得到所有用户,就像BenH一样,除了我会包含他们的MemberOf属性。然后,我构建一个潜在组列表,并过滤到仅分发列表。我将这些键的Hashtable作为键,并使值成为该组中每个用户的数组。然后循环,从相关键中删除每个值。
$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
}