PowerShell 问题将 AD 中的用户信息添加到数组中

PowerShell issue adding user information from AD into Array

任何擅长散列 tables 的人都可以帮助解决这个问题。我有多个全球组,我收集组中的每个成员。我正在尝试将它们添加到散列 table,每一行都包含有关要返回的用户帐户的所有信息,其中 $group 是键。

当我使用 $vdiArr.add 时,出现错误 Cannot find an overload for "add" and the argument count: "9"。 当我删除散列命令时,它工作正常,但数组中的数据似乎到处都是。我试图在数组中的一行中获取每个用户的信息。例如 vdiArr[0]={theirGroup,Name, GivenName, LastName 等等....

clear-host
$count = $null
$date = Get-Date -format "MM-dd-yyyy_hh-mm-ss"
$vdiGrps = Get-Content "D:\SourceFiles$\Scripts\Active Directory\ADGroups.txt"

$vdiArr=[System.Collections.ArrayList]@{}
$vdiArr=@{}

    foreach($group in $vdiGrps)
    {
        $ADgroup=(get-adgroup $group -properties members).members | get-adobject | where {$_.objectclass -eq "User"}| get-aduser -properties * | select name, GivenName, Surname, UserPrincipalName, SamAccountName, Enabled, DistinguishedName
        $ADgroup

        $vdiArr.add($group,$ADgroup.name,$ADgroup.GivenName,$ADgroup.Surname,$ADgroup.UserPrincipalName,$ADgroup.SamAccountName,$ADgroup.SamAccountName,$ADgroup.Enabled,$ADgroup.DistinguishedName)

        #$vdiArr.group = $group
        #$vdiArr.Name = $ADgroup.name
        #$vdiArr.GivenName = $ADgroup.GivenName
        #$vdiArr.Surname = $ADgroup.Surname
        #$vdiArr.UserPrincipalName = $ADgroup.UserPrincipalName
        #$vdiArr.SamAccountName = $ADgroup.SamAccountName
        #$vdiArr.Enabled = $ADgroup.Enabled
        #$vdiArr.DistinguishedName = $ADgroup.DistinguishedName


    }


$arrOutput += New-Object -TypeName psobject -Property $vdiArr
Out-File -InputObject $arrOutput -FilePath "$home\Desktop\test.csv"

尝试以下操作:

$vdiGrps = Get-Content "D:\SourceFiles$\Scripts\Active Directory\ADGroups.txt"

# Create empty array list.
$vdiArr=[System.Collections.ArrayList] @()

foreach($group in $vdiGrps)
{

    # Get users in group.
    $ADgroup=(get-adgroup $group -properties members).members | get-adobject | where {$_.objectclass -eq "User"}| get-aduser -properties * | select name, GivenName, Surname, UserPrincipalName, SamAccountName, Enabled, DistinguishedName

    # Loop over all users in group and add them to the output array.
    foreach($user in $ADgroup) {
      $null = $vdiArr.Add([pscustomobject] @{
        Group = $group
        Name = $user.name
        GivenName = $user.GivenName
        Surname = $user.Surname
        UserPrincipalName = $user.UserPrincipalName
        SamAccountName = $user.SamAccountName
        Enabled = $user.Enabled
        DistinguishedName = $user.DistinguishedName
      })
    }

}

Out-File -InputObject $vdiArr -FilePath "$HOME\Desktop\test.csv"
  • $null = ... 抑制 .Add() 调用的(不需要的)输出。

  • 上述方法演示了如何从哈希表构造自定义对象,但请注意,如果您将 Group 属性 作为计算的 属性 添加到您的 Select-Object 调用,您可以将生成的对象 直接 添加到输出数组。


至于你试过的

$vdiArr=[System.Collections.ArrayList]@{} 可能不是您想要的,因为将空的 hashtable 文字 - @{} - 转换为 [System.Collections.ArrayList] 会导致空数组列表 - 与 [System.Collections.ArrayList] @() 相同(从空的 array 文字转换)或 New-Object System.Collections.ArrayList

就是说,您的下一条语句 - $vdiArr=@{} - 完全覆盖了您之前的语句并将一个空的哈希表分配给 $vdiArr,使 $vdiArr [hashtable] 的类型([System.Collections.Hashtable]).

你的 .Add() 调用失败了,因为哈希表的 .Add() 方法只接受 2 个参数——键和新条目的名称——不你给它的 9。

也就是说,即使 $vdiArr 是一个 [System.Collections.ArrayList] 实例,正如您可能希望的那样,.Add() 调用也不会起作用,因为 [System.Collections.ArrayList].Add() 方法只接受一个 单个 参数——要添加的新元素。