Проблема с PowerShell при добавлении информации пользователя из AD в массив

Любой, кто хорош с хэш-таблицами Эля, может помочь в этом. У меня есть несколько глобальных групп, где я собираю каждого члена групп. Я пытаюсь добавить их в хеш-таблицу, каждая строка содержит всю информацию о возвращаемой учетной записи пользователя, где ключом является $group.

Когда я использую $vdiArr.add, я получаю сообщение об ошибке. Не удается найти перегрузку для "add" и количество аргументов: "9". Когда я удаляю команду hashed out, она работает нормально, но данные в массиве, кажется, повсюду. Я пытаюсь получить информацию о каждом пользователе в одной строке в массиве. например, vdiArr[0]={их группа, имя, имя, фамилия и т. д.

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"

1 ответ

Решение

Попробуйте следующее:

$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]@{} это, вероятно, не то, что вы хотели, потому что приведение пустого хеш-таблицы - @{} - для [System.Collections.ArrayList] приводит к пустому списку массивов - так же, как [System.Collections.ArrayList] @() (приведение из литерала пустого массива) или New-Object System.Collections.ArrayList

Тем не менее, ваше следующее заявление - $vdiArr=@{} - полностью переопределяет ваше предыдущее утверждение и присваивает пустой хеш-таблицу $vdiArr, делая тип $vdiArr[hashtable] ([System.Collections.Hashtable]).

Ваш .Add() вызов тогда терпит неудачу, потому что хеш-таблица .Add() Метод принимает только 2 аргумента - ключ и имя новой записи, а не 9, которые вы ей даете.

Тем не менее, даже если $vdiArr были [System.Collections.ArrayList] экземпляр, как вы, вероятно, намеревались, .Add() звонок не сработает, потому что [System.Collections.ArrayList]"s .Add() Метод принимает только один аргумент - новый элемент для добавления.

Другие вопросы по тегам