为了修改圣地亚哥的好答案,我想分享一些我在类似任务中的经验。我已经完成了大量的团体成员核对工作。我发现最简洁和最快的方法是利用Compare-Object
cmdlet。适合此处的典型场景是权威源,在这种情况下,源用户确定要对目标进行哪些更改,在这种情况下,目标用户。
我的大部分工作都来自小组,这意味着使用add/Remove-ADGroupMember
这种情况可以更直接地为用户工作。这是一个很好的用例Add/Remove-ADPrincipalGroupMembership
。不幸的是,MSDocs 帮助链接Get/Add/Remove-ADPrincipalGroupMembership
目前似乎已损坏。SS64 似乎有帮助信息here。
所以这没有经过测试,但这样的方法可能看起来像这样:
# Get the membership of sourceUser
$sourceUser = Get-ADUser sourceUser -Properties memberOf
# Get the membership of destUser
$destUser = Get-ADUser destUser -Properties memberOf
$Compare = Compare-Object $sourceUser.memberOf $destUser.memberOf
$Adds = ($Compare | Where-Object{$_.SideIndicator -eq '<=' }).InputObject
$Removes = ($Compare | Where-Object{$_.SideIndicator -eq '=>' }).InputObject
If( $adds ) { Add-ADPrincipalGroupMembership -Identity -MemberOf $Adds }
If( $Removes ) { Remove-ADPrincipalGroupMembership -Identity -MemberOf $Removes -Confirm:$false }
该-memberOf
参数采用一个数组,因此您可以通过单次执行 cmdlet 来影响更改。一切都没有循环。
您可能会使用.Where()
来分析通过Compare-Object
锻炼比较返回的对象:
$Adds = $Compare.Where( {$_.SideIndicator -eq '<=' }).InputObject
$Removes = $Compare.Where( {$_.SideIndicator -eq '=>' }).InputObject
注意:显然,如果您不需要删除,则不必实施。为了完整起见,它包含在示例中。
更新:MS Docs 链接实际上是通过谷歌打破的。直接在 MS 上搜索并在此处获得工作链接