Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 如果用户B不在组中,则从用户A删除广告成员资格_Powershell_Active Directory_Activedirectorymembership - Fatal编程技术网

Powershell 如果用户B不在组中,则从用户A删除广告成员资格

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

我对Powershell脚本非常陌生,甚至比Powershell针对AD的脚本更新。 我试图从一个广告用户到另一个广告用户复制memberOf 我已经得到了一个副本脚本,但在类似部门转移的情况下,我还希望删除用户不再需要的任何访问权限。我已经尝试了下面包含的脚本。它运行(如中所示,不会抛出错误),但不会进行任何更改

$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