Как создать динамический список объектов Active Directory с помощью PowerShell?

Как правильно организовать код для отображения всех элементов массива в выпадающем списке, чтобы отобразить каждое имя из $NameList? Я использовал стандартную форму для поиска ФИО в AD и взял пример из <a href="https://learn.microsoft.com/ru-ru/powershell/scripting/samples/selecting-items-from-a-list-box?view=powershell-7.4" rel="nofollow">обучалки</a>, но сталкиваюсь с проблемой: в списке отображается только один элемент. Вот часть кода, которую я использую: <br/> <pre><code>$n = 0
foreach ($i in $NameList.Count) {
    [void] $listBox.Items.Add($NameList[$n])
    $n = $n + 1
}</code></pre> <br/> Можете подсказать, в чём может быть ошибка? Также прилагаю весь код: <br/> <br/>
  • 27 ноября 2024 г. 9:13
Ответы на вопрос 2
Проблема в вашем коде заключается в использовании `$NameList.Count` в цикле `foreach`. `foreach` использует коллекцию, а не число, поэтому он не работает так, как вы ожидаете. Вместо этого вам нужно использовать цикл `for`, чтобы итеративно добавлять элементы в `listBox`.

Ниже приведён пример, который показывает, как создать динамический список объектов Active Directory и правильно отобразить их в выпадающем списке:

```powershell
# Подключение к Active Directory и получение списка пользователей
Import-Module ActiveDirectory
$NameList = Get-ADUser -Filter * -Property DisplayName | Select-Object -ExpandProperty DisplayName

# Создание формы
Add-Type -AssemblyName System.Windows.Forms
$form = New-Object System.Windows.Forms.Form
$form.Text = "Выбор пользователя"
$form.Width = 300
$form.Height = 400

# Создание элемента управления ListBox
$listBox = New-Object System.Windows.Forms.ListBox
$listBox.Width = 250
$listBox.Height = 300
$listBox.Location = New-Object System.Drawing.Point(20, 20)

# Добавление элементов из $NameList в ListBox
foreach ($name in $NameList) {
    $listBox.Items.Add($name) | Out-Null
}

# Добавление ListBox на форму
$form.Controls.Add($listBox)

# Показать форму
$form.Add_Shown({$form.Activate()})
[void] $form.ShowDialog()
```

### Объяснение кода:

1. **Импортирование модуля Active Directory**: Он необходим для работы с объектами AD.
2. **Получение списка пользователей**: Используется команда `Get-ADUser` для получения всех пользователей и извлечения их отображаемых имен в массив `$NameList`.
3. **Создание формы**: Создается основное окно с заголовком и размерами.
4. **Создание ListBox**: Создается элемент управления ListBox, задаются размеры и положение на форме.
5. **Добавление элементов**: Вместо использования цикла `for`, используется `foreach`, который перебирает элементы массива `$NameList` и добавляет их в `listBox`.
6. **Отображение формы**: Открывается диалоговое окно формы.

С помощью этого примера вы сможете отобразить все отображаемые имена пользователей из Active Directory в выпадающем списке. Убедитесь, что у вас есть необходимые разрешения для доступа к AD и правильно настроено окружение для работы с PowerShell и WinForms.
Вы неверно понимаете foreach 

foreach ($User in $NameList) {
    [void] $listBox.Items.Add($User)
}

Если вам только имена, то лучше использовать $User.Name

ну и вот это масло масляное
$NameList = @(Get-ADUser -Filter {Name -like $SearchName} -Properties Name | Select-Object -Property Name)

Достаточно
$NameList = @(Get-ADUser -Filter {Name -like $SearchName} -Properties Name)

Либо, если без Name
$NameList = @(Get-ADUser -Filter {Name -like $SearchName} -Properties Name | Select-Object -ExpandProperty Name)


При этом @() тоже необязательно, если вам вот прям не нужен массив. foreach будет работать и так
Похожие вопросы