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

Powershell/dsquery组数组中的用户拉列表使用唯一用户创建一个数组,powershell,dsquery,Powershell,Dsquery,我的任务是确保所有管理员都有正确的权限。我们有几个管理组,所以我想我应该做的是使用powershell和dsquery从这些组中提取所有用户,并将它们放入一个数组中。该用户可能在多个管理员组中,因此我只需要每个用户中的一个。然后,我将使用dsget获取所有用户的更多信息,并将其输出到css。我被一个事实所困扰,那就是我不能正常工作。在我有了这个用户列表后,重新开始应该是向前的 $admingroups = @("Group 1","Group 2","Group 3","Group 4") $a

我的任务是确保所有管理员都有正确的权限。我们有几个管理组,所以我想我应该做的是使用powershell和dsquery从这些组中提取所有用户,并将它们放入一个数组中。该用户可能在多个管理员组中,因此我只需要每个用户中的一个。然后,我将使用dsget获取所有用户的更多信息,并将其输出到css。我被一个事实所困扰,那就是我不能正常工作。在我有了这个用户列表后,重新开始应该是向前的

$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
  }
}

我一直在看你的逻辑,不能指出我认为完全错误的地方。主要是您的名字varialble
$admin
-contains
用于检查元素是否是数组的一部分。从

描述:安全壳操作员。说明 参考值包括单个测试值

但是,您可以同时使用
$adminnames
$admin
数组。首先,您的
dsquery
将返回
discrimitedName
的数组。为了使逻辑正常工作,您必须循环遍历每个逻辑,以便
-contains
也按您的期望执行

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

$groups = @("group 1","group 2")
$groups | ForEach-Object{Get-ADGroupMember -Identity $_} | Sort-Object -Unique | Select -ExpandProperty DistinguishedName
如果您仍然想使用
dsquery
,我仍然会使用
排序对象

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)"

那么,您想看看,对于每个管理员用户,他们都在哪些管理员组中

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

在这种情况下,问题是缺少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
        }
    }
}
或者,选择对象具有“-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 )

此外,考虑安装远程服务器管理工具,然后可以导入ActiveDirectory模块并真正开始完成任务。我也是一个IT爱好者,我每天都使用它。链接:@Matt,my PowerShell 2.0没有显示任何此类要求
Get Help Select-Full
,这里的3.0文档中也没有。