Search code examples
powershellpowershell-5.0

PowerShell issue adding user information from AD into Array


Anyone good with hash tables ale to help out on this one. I have multiple global groups where I am gather each member of the groups. I am trying to add them to a hash table, each line contains all the information about the user account being returned where the $group is the key.

When I use $vdiArr.add I get the error Cannot find an overload for "add" and the argument count: "9". When I remove the hashed out command it works fine but the data in the array seems to be all over the place. I am trying to achieve each user's information on one line within the array. e.g vdiArr[0]={theirGroup,Name, GivenName, LastName and so on....

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"

Solution

  • Try the following:

    $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 = ... suppresses the (undesired) output from the .Add() call.

    • The above approach demonstrates how to construct a custom object from a hashtable, but note that if you added a Group property as a calculated property to your Select-Object call, you could add the resulting objects directly to the output array.


    As for what you've tried:

    $vdiArr=[System.Collections.ArrayList]@{} is probably not what you intended, because casting the empty hashtable literal - @{} - to [System.Collections.ArrayList] results in an empty array list - the same as [System.Collections.ArrayList] @() (casting from an empty array literal) or New-Object System.Collections.ArrayList

    That said, your very next statement - $vdiArr=@{} - completely overrides your previous statement and assigns an empty hashtable to $vdiArr, making the type of $vdiArr [hashtable] ([System.Collections.Hashtable]).

    Your .Add() call then fails, because a hashtable's .Add() method only accepts 2 arguments - the key and the name of the new entry - not the 9 you're giving it.

    That said, even if $vdiArr were a [System.Collections.ArrayList] instance, as you probably intended, the .Add() call wouldn't work, because [System.Collections.ArrayList]'s .Add() method only accepts a single argument - the new element to add.