@SimTorAdmin

Как сделать динамический список PowerShell для объектов AD?

Мне нужно сделать поиск ФИО в AD с выбором элемента из списка.
Данные я вытащил, формочку взял стандартную, из обучалки
Не могу сделать так, чтобы элементов списка было столько, сколько объектов в массиве. Всегда отображается только один элемент, не могу понять в чём дело. Думаю, я что-то неправильно сделал в этом цикле:
$n = 0
foreach ($i in $NameList.Count) {
    [void] $listBox.Items.Add($NameList[$n])
    $n = $n + 1
}

Но, на всякий случай, прикладываю весь код:

spoiler
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

[string]$a = Read-Host "Введите Имя/Фамилию кириллицей"
[string]$SearchName = "*$a*"
$NameList = @(Get-ADUser -Filter {Name -like $SearchName} -Properties Name | Select-Object -Property Name)

$form = New-Object System.Windows.Forms.Form
$form.Text = 'Выберите пользователя'
$form.Size = New-Object System.Drawing.Size(300,200)
$form.StartPosition = 'CenterScreen'

$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(75,120)
$okButton.Size = New-Object System.Drawing.Size(75,23)
$okButton.Text = 'OK'
$okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $okButton
$form.Controls.Add($okButton)

$cancelButton = New-Object System.Windows.Forms.Button
$cancelButton.Location = New-Object System.Drawing.Point(150,120)
$cancelButton.Size = New-Object System.Drawing.Size(75,23)
$cancelButton.Text = 'Cancel'
$cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $cancelButton
$form.Controls.Add($cancelButton)

$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = 'Please select a computer:'
$form.Controls.Add($label)

$listBox = New-Object System.Windows.Forms.ListBox
$listBox.Location = New-Object System.Drawing.Point(10,40)
$listBox.Size = New-Object System.Drawing.Size(260,20)
$listBox.Height = 80

$n = 0
foreach ($i in $NameList.Count) {
    [void] $listBox.Items.Add($NameList[$n])
    $n = $n + 1
}

$form.Controls.Add($listBox)
$form.Topmost = $true
$result = $form.ShowDialog()

if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
    $x = $listBox.SelectedItem
    $x
}
  • Вопрос задан
  • 22 просмотра
Решения вопроса 1
@MaxKozlov Куратор тега PowerShell
Вы неверно понимаете 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 будет работать и так
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы