【问题标题】:foreach filtering out members already apart of groupforeach 过滤掉已经不属于组的成员
【发布时间】:2017-04-04 13:33:07
【问题描述】:
$GetGroupsFromUser = Get-ADPrincipalGroupMembership $WPFnamelookupbox.Text |
                     Where-Object { $_.Name -like 'G1*' }
$Groups = Get-ADGroup -Filter {Name -like "G1*"}

foreach ($G in $Groups) {
    if ($GetGroupsFromUser -contains $G) {
    } else {
        $WPFgroups.Items.Add($G.SamAccountName)
    }
}

我的目标是只显示用户不是其成员的组。

所以我在使用-contains 运算符方面取得了一些进展。为了让-contains 工作,我需要先创建一个数组,对吗?

【问题讨论】:

  • 所以逻辑应该是。首先获取所有组。然后获取用户所属的所有组。将它们分别存储在一个变量中。然后无论哪个不匹配显示那个。你可以在 foreach 循环中做到这一点
  • Get-Help about_Comparison_Operators 在这里很有用,尤其是有关 -in 运算符的信息。一般来说,Get-Help 是您会发现的最有用的 cmdlet 之一。

标签: powershell foreach


【解决方案1】:

你可以使用Compare-Object:

$GetGroupsFromUser = Get-ADPrincipalGroupMembership $WPFnamelookupbox.Text | Where-Object {$_.name -like 'G1*' }
$Groups = Get-ADGroup -Filter "name -like 'G1*'"
Compare-Object $Groups $GetGroupsFromUser | Where-Object {$_.SideIndicator -eq "<="}

【讨论】:

    【解决方案2】:

    -contains 在您尝试查找数组中元素的匹配项时发挥最佳作用。

    如果您只是在寻找与用户没有的过滤器匹配的组,我们也可以在 where 子句中使用-notcontains

    $groupFilter = "G*"
    $user = "user_bagel"
    $allFilteredGroups = Get-ADGroup -Filter "name -like '$groupFilter'" | Select-Object -ExpandProperty name
    $userFilteredGroups = Get-ADPrincipalGroupMembership $user | Where-object{$_.name -like $groupFilter} | Select-Object -ExpandProperty name
    $allFilteredGroups | Where-Object{$userFilteredGroups -notcontains $_}
    

    您不需要像我所做的那样扩展组名称。无论哪种方式,您都会得到相似的结果。由于您只想知道名称,因此保留完整的组对象似乎很愚蠢。从理论上讲,它也会以这种方式执行得更快。设置像$groupFilter 这样的变量可以更容易地更改脚本。

    【讨论】:

      猜你喜欢
      • 2021-06-22
      • 2020-09-03
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 2021-01-12
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      相关资源
      最近更新 更多