Powershell GUI. Выбор элемента из динамического списка ListBox

Уважаемые пользователи форума, помогите пожалуйста, со следующим вопросом. Я пытаюсь создать приложение с графическим интерфейсом в Powershell. Так как я новичок в программировании, то решился обратиться на форум за помощью. Суть приложения заключается в поиске по ФИО в учетных записях Active Directory нужной учетной записи сотрудника и просмотре даты смены пароля для этой учетной записи. У меня есть готовый код, который работает при вводе логина аккаунта на Английском языке и показывает сразу результат в $OutputBox и $OutputBox2. При этом хочу реализовать поиск на Русском языке. Код, который я привожу ниже, ищет на Русском языке, но только в текстовом виде отображает учетные записи в ListBox и этот текст можно только скопировать, на него нельзя нажать как на элемент. Подскажите, пожалуйста, мне как сделать, чтобы программа выводила результат в ListBox не в виде текста, а в виде элементов, по названию которых можно щелкнуть курсором мыши и получить результат по конкретной выбранной учетной записи в $outputBox и $outputBox2. Скриншот программы прилагаю https://i.stack.imgur.com/GJ5qP.png .

Заранее благодарю за вашу помощь.

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

$Form = New-Object System.Windows.Forms.Form
$Form.Size = New-Object System.Drawing.Size(460,350)
$Form.Text ="Pass info"
$Form.AutoSize = $false
$Form.MaximizeBox = $false
$Form.MinimizeBox = $true 
$Form.BackColor = "#c08888" 
$Form.ShowIcon = $true 
$Form.SizeGripStyle = [System.Windows.Forms.SizeGripStyle]::Hide 
$Form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::Fixed3D
$Form.WindowState = "Normal"
$Form.StartPosition = "CenterScreen" 
$Form.Opacity = 1.0 
$Form.TopMost = $false 

############################################## Function start ##############################################

function Info {
$wks=$InputBox.text;
Write-Host $wks
$regex1 = "[^-a-zA-Z0-9_#.!@]+"
$regex2 = "[^-а-яА-Я0-9_#.!@]+"
If($wks -match $regex2) {
$Result1=Get-ADUser -identity $wks -Properties * | select CN -ExpandProperty CN
$outputBox.text=$Result1
$Result2=Get-ADUser -identity $wks -Properties * | select PasswordLastset -ExpandProperty PasswordLastset
$outputBox2.text=$Result2
}
If($wks -match $regex1) { 
$wks2 = "$wks*"
Write-Host $wks2
$Result3=Get-AdUser -Filter 'name -Like $wks2' | Select Name -expandproperty Name| Sort Name | fl | out-string
Write-Host $Result3
$ListBox.text = $Result3
} 
}

############################################## End Function ##############################################
 

############################################## GroupBox ##############################################

$groupBox = New-Object System.Windows.Forms.GroupBox
$groupBox.Location = New-Object System.Drawing.Size(10,230)
$groupBox.size = New-Object System.Drawing.Size(280,80)
$groupBox.text = "Info:"
$Form.Controls.Add($groupBox)
 

$FormLabel1 = New-Object System.Windows.Forms.Label
$FormLabel1.Text = "User AD:"
$FormLabel1.ForeColor = "#3009f1"
$FormLabel1.Font = "Microsoft Sans Serif,8"
$FormLabel1.Location = New-Object System.Drawing.Point(10,10)
$FormLabel1.AutoSize = $true
$Form.Controls.Add($FormLabel1)
 

$FormLabel2 = New-Object System.Windows.Forms.Label
$FormLabel2.Text = "ФИО:"
$FormLabel2.Location = New-Object System.Drawing.Point(10,25)
$FormLabel2.ForeColor = "#3009f1"
$FormLabel2.Font = "Microsoft Sans Serif,8"
$FormLabel2.AutoSize = $true
$groupBox.Controls.Add($FormLabel2)
 

$FormLabel3 = New-Object System.Windows.Forms.Label
$FormLabel3.Text = "Дата:"
$FormLabel3.Location = New-Object System.Drawing.Point(10,47)
$FormLabel3.ForeColor = "#3009f1"
$FormLabel3.Font = "Microsoft Sans Serif,8"
$FormLabel3.AutoSize = $true
$groupBox.Controls.Add($FormLabel3)

############################################## End GroupBox ##############################################


############################################ InputBox and OutputBox #########################################
 

$InputBox = New-Object System.Windows.Forms.TextBox
$InputBox.Location = New-Object System.Drawing.Size(65,5)
$InputBox.Size = New-Object System.Drawing.Size(150,20)
$Form.Controls.Add($InputBox)

$outputBox = New-Object System.Windows.Forms.TextBox
$outputBox.Location = New-Object System.Drawing.Size(80,20)
$outputBox.Size = New-Object System.Drawing.Size(180,20)
$outputBox.ReadOnly = $True 
$groupBox.Controls.Add($outputBox)

$outputBox2 = New-Object System.Windows.Forms.TextBox
$outputBox2.Location = New-Object System.Drawing.Size(80,42)
$outputBox2.Size = New-Object System.Drawing.Size(180,42)
$outputBox2.ReadOnly = $True 
$groupBox.Controls.Add($outputBox2)

############################################ End InputBox and OutputBox ######################################### 


############################################## ListBox ##############################################

$ListBox = New-Object System.Windows.Forms.TextBox 
$ListBox.Location = New-Object System.Drawing.Size(65,30) 
$ListBox.Size = New-Object System.Drawing.Size(220,200) 
$ListBox.MultiLine = $True #declaring the text box as multi-line 
$ListBox.AcceptsReturn = $true
$ListBox.ScrollBars = "Vertical"
$ListBox.AcceptsTab = $true
$ListBox.WordWrap = $True
$ListBox.ReadOnly = $True
$Form.Controls.Add($ListBox)

############################################## End ListBox ##############################################


############################################## search in Russian and in English ##############################################

$regex1 = "[^-a-zA-Z0-9_#.!@]+"
$regex2 = "[^-а-яА-Я0-9_#.!@]+"
$TestName = "Mouse" # Cat или кот
If($TestName -match $regex1){echo "English '$TestName'"}
If($TestName -match $regex2){echo "Русский '$TestName'"}
get-aduser -filter 'name -like "*" ' | select name -expandproperty name

############################################## End search in Russian and in English ##############################################

############################################## Button ##############################################

$Button = New-Object System.Windows.Forms.Button
$Button.Location = New-Object System.Drawing.Size(310,20)
$Button.Size = New-Object System.Drawing.Size(110,80)
$Button.Text = "Загрузить данные"
$Button.BackColor = "#d7f705"
$Button.Add_Click({Info})
$Form.Controls.Add($Button)

############################################## End Button ##############################################
 

$Form.Add_Shown({$Form.Activate()})
[void] $Form.ShowDialog()

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Dyakov Alexander

ты хочешь использовать Listbox, но создаешь textbox, нужно поменять функцию примерно вот так вот:

function Info {
$wks=$InputBox.text;
Write-Host $wks
$regex1 = "[^-a-zA-Z0-9_#.!@]+"
$regex2 = "[^-а-яА-Я0-9_#.!@]+"
If($wks -match $regex2) {
$Result1=Get-ADUser -identity $wks -Properties * | select -ExpandProperty CN
$outputBox.text=$Result1
$Result2=Get-ADUser -identity $wks -Properties * | select  -ExpandProperty PasswordLastset
$outputBox2.text=$Result2
}
If($wks -match $regex1) { 
     $wks2 = "$wks*"
     Write-Host $wks2
     $Result3=Get-AdUser -Filter 'name -Like $wks2' | Select Name -expandproperty Name | % {$Listbox.items.add($_)}
     Write-Host $Result3
     } 
}

Добавить функцию для отслеживания изменений выбора элемента

function ListIndexChanged { 
if ($listbox.SelectedItem){
    $User = get-aduser -filter "Name -like '$($listbox.SelectedItem)'" -Properties CN,PasswordLastSet
    $outputBox.text = $User.CN
    $outputBox2.text = $User.PasswordLastSet.tostring()
}
}

Ну и сам listbox

 $ListBox = New-Object System.Windows.Forms.ListBox 
 $ListBox.Location = New-Object System.Drawing.Size(65,30) 
 $ListBox.Size = New-Object System.Drawing.Size(220,200)
 $ListBox.Add_SelectedIndexChanged({ListIndexChanged})
 $Form.Controls.Add($ListBox)

Ну и совет такой не выдёргивай все свойства пользователя, если не собираешься их использовать

→ Ссылка