Powershell / dsquery拉取组数组中的用户列表,使用唯一用户创建一个数组

时间:2014-10-07 23:22:31

标签: powershell dsquery

我的任务是确保所有管理员都拥有正确的权限。我们有一些管理组,所以我要做的就是使用powershell和dsquery从这些组中提取所有用户并将它们放入一个数组中。用户可能在多个管理员组中,因此我只想要每个用户中的一个。然后我会使用dsget获取所有用户的更多信息并将其输出到css。我坚持认为我不能让 - 包含正常工作。在我有这个用户列表后,reast应该是前进的。

$admingroups = @("Group 1","Group 2","Group 3","Group 4")
$adminnames = @()

foreach ($adming in $admingroups) { 
  $admin = (&dsquery group -samid $adming -limit 0 | dsget group -members -expand)
  if ($adminnames -contains $admin) {
    write-host "Dupes"
  }Else{
    $adminnames += $admin
  }
}

2 个答案:

答案 0 :(得分:0)

我一直在看你的逻辑,不能指责我认为完全错误的东西。它主要是变量$admin的名称。 -contains应该检查元素是否是数组的一部分。来自about_Comparison_Operators

  

描述:遏制操作员。告诉是否收藏   参考值包括单个测试值

但是,您可以同时将$adminnames$admin作为数组。首先,您的dsquery将返回DistinguishedName的数组。为了让你的逻辑工作,你必须遍历每一个,以便-contains做你期望的事。

您是否必须使用dsquery来获取此信息?一些内置cmdlet可以轻松处理这个问题。

$groups = @("group 1","group 2")
$groups | ForEach-Object{Get-ADGroupMember -Identity $_} | Sort-Object -Unique | Select -ExpandProperty DistinguishedName

如果您想使用dsquery,我仍然会使用Sort-Object

foreach ($adming in $admingroups) { 
     $adminnames += (&dsquery group -samid $adming -limit 0 | dsget group -members -expand)
}
$adminnames | Sort-Object -Unique 

如果你想知道类似于你已经拥有的重复项,你可以只比较一下。

$uniqueAdminNames = $adminnames | Sort-Object -Unique
Write-Host "Ignored $($adminnames.Count - $uniqueAdminNames.Count) duplicate(s)"

答案 1 :(得分:0)

那么,您希望为每个管理员用户看到他们在哪些管理员组中?

但是,你的主要问题是(如果我错了,请纠正我):
鉴于您通过查询每个管理员组来检索管理员用户的整体列表,您可能有重复项,那么如何删除重复项?

在这种情况下,问题是您错过了ForEach循环:

$AdminGroups = @("Group 1","Group 2","Group 3","Group 4")
$AdminNames = @()

ForEach ($Group in $AdminGroups) {
    $AdminsInGroup = @( dsquery group -samid $Group -limit 0 | dsget group -members -expand )

    ForEach( $Admin in $AdminsInGroup ) {
        if( $AdminNames -contains $Admin ) {
            Write-Host "Dupes"
        } else {
            $AdminNames += $Admin
        }
    }
}

或者,Select-Object有一个" -unique"参数:

$AdminGroups = @("Group 1","Group 2","Group 3","Group 4")
$AdminNames = @()

ForEach ($Group in $AdminGroups) {
    $AdminsInGroup = @( dsquery group -samid $Group -limit 0 | dsget group -members -expand )

    $AdminNames += $AdminsInGroup
}

$AdminNames = @( $AdminNames | Select -Unique )