Powershell 如果用户B不在组中,则从用户A删除广告成员资格
我对Powershell脚本非常陌生,甚至比Powershell针对AD的脚本更新。 我试图从一个广告用户到另一个广告用户复制memberOf 我已经得到了一个副本脚本,但在类似部门转移的情况下,我还希望删除用户不再需要的任何访问权限。我已经尝试了下面包含的脚本。它运行(如中所示,不会抛出错误),但不会进行任何更改Powershell 如果用户B不在组中,则从用户A删除广告成员资格,powershell,active-directory,activedirectorymembership,Powershell,Active Directory,Activedirectorymembership,我对Powershell脚本非常陌生,甚至比Powershell针对AD的脚本更新。 我试图从一个广告用户到另一个广告用户复制memberOf 我已经得到了一个副本脚本,但在类似部门转移的情况下,我还希望删除用户不再需要的任何访问权限。我已经尝试了下面包含的脚本。它运行(如中所示,不会抛出错误),但不会进行任何更改 $Source = Get-ADUser *ShortName* -prop MemberOf $Destination = Get-ADUser *ShortName* -prop
$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
}
}
编辑:添加OneLiner以供参考
# 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
,然而,这种情况有助于更直接地处理用户。这是添加/删除ADPrincipalGroupMembership的一个很好的用例。不幸的是,Get/Add/Remove ADPrincipalGroupMembership
的MSDocs帮助链接目前似乎已断开。SS64似乎有帮助信息
所以这没有经过测试,但这种方法可能是这样的:
# 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 }
注意:显然,如果不需要删除,就不必实现。为了完整起见,示例中包含了它
更新:微软文档的链接实际上是通过谷歌破解的。直接在MS上搜索并获得一个工作链接让我看看我是否理解,假设您有
sourceUser
和randomUser,您想删除randomUser`作为sourceUser
不是其成员的组的成员。我说得对吗?基本上是的。虽然random是个用词不当的词,但它很有效。当我试图实现for循环时,我看到了哪里出了问题。我认为正在通过管道的不是。我还将where循环视为for循环,并期望它像数组一样遍历对象。谢谢大家!@D1g1talArts事实上,您已经非常接近您所寻找的内容,我将添加一个编辑,向您展示OneLiner的外观。而且,没问题,很乐意帮助:-)我要指出.Contains()
方法区分大小写。这可能不是问题,但我会避免。特别是因为使用-Contains
、-in
和-not*
变体没有明显的缺点。@Steven是的,我没有指出这一点,因为我们处理的是区分名称
,但你是对的,最右边的MS文档链接(至少对于PS cmdlet)被破坏了,我昨天注意到了这一点。不知道他们在做什么:/@SantiagoSquarzon我想这些链接在谷歌机器上被破坏了,但我通过直接在微软网站上搜索得到了一个有效的链接。添加到答案。。。
$Adds = $Compare.Where( {$_.SideIndicator -eq '<=' }).InputObject
$Removes = $Compare.Where( {$_.SideIndicator -eq '=>' }).InputObject