如果用户 B 不在组中,则从用户 A 中删除 AD 成员资格
Remove AD Membership From user A if user B is not in the group
我对 Powershell 脚本非常陌生,对 AD 的 powershell 脚本更陌生。
我试图基本上将 memberOf 从一个 AD 用户复制到另一个
我有一个复制脚本可以工作,但在部门调动等情况下,我还想删除用户不再需要的任何访问权限。我已经尝试了下面包含的脚本。它运行(因为不会抛出错误),但不会进行任何更改。
$Source = Get-ADUser *ShortName* -prop MemberOf
$Destination = Get-ADUser *ShortName* -prop MemberOf
$Source.MemberOf | Where{($Destination.MemberOf -contains $_) -and ($Source.MemberOf -notcontains $_)} | Remove-ADGroupMember $Destination
我看过一些关于 Compare-object 命令的文档,但对它的理解还不够深入,无法查看使用该命令的实现方法。
任何帮助或提示将不胜感激
检查代码,让我知道它是否对你有意义,我添加了评论来为你提供逻辑上的提示。
当然,这不是唯一的方法,但我使用的是经典编码,因此您更容易阅读和理解。
# Get the membership of sourceUser
$sourceUser = Get-ADUser sourceUser -Properties MemberOf
# Get the membership of destUser
$destUser = Get-ADUser destUser -Properties MemberOf
# You want to compare if the the membership of destUser is different from
# the membership of sourceUser, hence we use destUser's membership to loop
foreach($group in $destUser.MemberOf)
{
# If this group is not in the membership of sourceUser ->
# remove thisUser from thisGroup
# Option 1:
if(-not $sourceUser.MemberOf.Contains($group)) # This is harder to read but more efficient
{
Remove-ADGroupMember -Identity $group -Members $destUser.distinguishedName
}
# Option 2:
if($group -notin $sourceUser.MemberOf) # This is easier to read but less efficient
{
Remove-ADGroupMember -Identity $group -Members $destUser.distinguishedName
}
}
编辑:添加 oneliners 以供参考。
# This is how the oneliner you were attempting should look
# I honestly don't like this for people new to Powershell
# Option 1:
$destUser.MemberOf|where{-not $sourceUser.MemberOf.Contains($_)}|Remove-ADGroupMember -Members $destUser.distinguishedName
# Option 2:
$destUser.MemberOf|where{$_ -notin $sourceUser.MemberOf}|Remove-ADGroupMember -Members $destUser.distinguishedName
# Option 3:
$destUser.MemberOf|where{-not $sourceUser.MemberOf.Contains($_)}|foreach{
Remove-ADGroupMember -Identity $_ -Members $destUser.distinguishedName
}
# Option 4:
$destUser.MemberOf|where{$_ -notin $sourceUser.MemberOf}|foreach{
Remove-ADGroupMember -Identity $_ -Members $destUser.distinguishedName
}
修正,我想分享一些我在类似任务中的经验。我已经完成了大量的组成员协调工作。我发现最简洁和最快的方法是利用 Compare-Object
cmdlet。适合此处的典型场景是权威源,在这种情况下,源用户确定要对目标进行哪些更改,在这种情况下,目标用户。
我的大部分工作都是从团队方面进行的,这意味着使用 add/Remove-ADGroupMember
然而,这种情况有助于更直接地为用户工作。这是 Add/Remove-ADPrincipalGroupMembership
的一个很好的用例。不幸的是,Get/Add/Remove-ADPrincipalGroupMembership
的 MSDocs 帮助 link 目前似乎已损坏。 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 links 实际上被突破了 Google。直接在 MS 上搜索并得到一个有效的 link here
我对 Powershell 脚本非常陌生,对 AD 的 powershell 脚本更陌生。 我试图基本上将 memberOf 从一个 AD 用户复制到另一个 我有一个复制脚本可以工作,但在部门调动等情况下,我还想删除用户不再需要的任何访问权限。我已经尝试了下面包含的脚本。它运行(因为不会抛出错误),但不会进行任何更改。
$Source = Get-ADUser *ShortName* -prop MemberOf
$Destination = Get-ADUser *ShortName* -prop MemberOf
$Source.MemberOf | Where{($Destination.MemberOf -contains $_) -and ($Source.MemberOf -notcontains $_)} | Remove-ADGroupMember $Destination
我看过一些关于 Compare-object 命令的文档,但对它的理解还不够深入,无法查看使用该命令的实现方法。 任何帮助或提示将不胜感激
检查代码,让我知道它是否对你有意义,我添加了评论来为你提供逻辑上的提示。
当然,这不是唯一的方法,但我使用的是经典编码,因此您更容易阅读和理解。
# Get the membership of sourceUser
$sourceUser = Get-ADUser sourceUser -Properties MemberOf
# Get the membership of destUser
$destUser = Get-ADUser destUser -Properties MemberOf
# You want to compare if the the membership of destUser is different from
# the membership of sourceUser, hence we use destUser's membership to loop
foreach($group in $destUser.MemberOf)
{
# If this group is not in the membership of sourceUser ->
# remove thisUser from thisGroup
# Option 1:
if(-not $sourceUser.MemberOf.Contains($group)) # This is harder to read but more efficient
{
Remove-ADGroupMember -Identity $group -Members $destUser.distinguishedName
}
# Option 2:
if($group -notin $sourceUser.MemberOf) # This is easier to read but less efficient
{
Remove-ADGroupMember -Identity $group -Members $destUser.distinguishedName
}
}
编辑:添加 oneliners 以供参考。
# This is how the oneliner you were attempting should look
# I honestly don't like this for people new to Powershell
# Option 1:
$destUser.MemberOf|where{-not $sourceUser.MemberOf.Contains($_)}|Remove-ADGroupMember -Members $destUser.distinguishedName
# Option 2:
$destUser.MemberOf|where{$_ -notin $sourceUser.MemberOf}|Remove-ADGroupMember -Members $destUser.distinguishedName
# Option 3:
$destUser.MemberOf|where{-not $sourceUser.MemberOf.Contains($_)}|foreach{
Remove-ADGroupMember -Identity $_ -Members $destUser.distinguishedName
}
# Option 4:
$destUser.MemberOf|where{$_ -notin $sourceUser.MemberOf}|foreach{
Remove-ADGroupMember -Identity $_ -Members $destUser.distinguishedName
}
修正Compare-Object
cmdlet。适合此处的典型场景是权威源,在这种情况下,源用户确定要对目标进行哪些更改,在这种情况下,目标用户。
我的大部分工作都是从团队方面进行的,这意味着使用 add/Remove-ADGroupMember
然而,这种情况有助于更直接地为用户工作。这是 Add/Remove-ADPrincipalGroupMembership
的一个很好的用例。不幸的是,Get/Add/Remove-ADPrincipalGroupMembership
的 MSDocs 帮助 link 目前似乎已损坏。 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 links 实际上被突破了 Google。直接在 MS 上搜索并得到一个有效的 link here