Search code examples
winformsfunctionpowershelluser-interfacetextbox

Using a function to populate a textbox in Powershell


I currently have a script that queries our AD for the users' AD attribute "Department".

Right now, the script will run "successfully" but all output for Textbox2 goes to the console instead of TextBox2.

If I change my function Get-CCUsers to be a query without variables, like Get-ADUser -Filter "Department -eq 19330" (we use numbers for our departments) then the output shows in TextBox2 as I want it to.

How can I get my function to populate TextBox2?
BTW, this script was cobbled together with my limited understanding, and there may well be superfluous or nonsense lines in here.

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

$form = New-Object System.Windows.Forms.Form
$form.Text = 'Howard Center Profile Migration'
$form.Size = New-Object System.Drawing.Size(800,650)
$form.StartPosition = 'CenterScreen'

$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 enter the Cost Center # in the space below:'
$form.Controls.Add($label)

$textBox = New-Object System.Windows.Forms.TextBox
$textBox.Location = New-Object System.Drawing.Point(10,40)
$textBox.Size = New-Object System.Drawing.Size(100,20)
$form.Controls.Add($textBox)

$RunButton = New-Object System.Windows.Forms.Button
$RunButton.Location = New-Object System.Drawing.Point(75,120)
$RunButton.Size = New-Object System.Drawing.Size(75,23)
$RunButton.Text = 'RUN'
#$RunButton.DialogResult = [System.Windows.Forms.DialogResult]::OK


<#$RunButton.Add_Click({
#add here code triggered by the event
   $TextBox2.Text = Get-Process | Format-Table -Property ProcessName, Id, CPU -AutoSize | Out-String
})
#>

$form.AcceptButton = $RunButton
$form.Controls.Add($RunButton)

$label2 = New-Object System.Windows.Forms.Label
$label2.Location = New-Object System.Drawing.Point(10,70)
$label2.Size = New-Object System.Drawing.Size(280,20)
$label2.Text = 'When you are ready click the Run button below'
$form.Controls.Add($label2)

$TextBox2 = New-Object system.windows.Forms.TextBox
$TextBox2.Text = ""
$TextBox2.Multiline = $true
$TextBox2.BackColor = "#013686"
$TextBox2.ScrollBars = "Both"
$TextBox2.Width = 750
$TextBox2.Height = 450
$TextBox2.location = new-object system.drawing.point(10,150)
$TextBox2.Font = "Microsoft Sans Serif,10"
$TextBox2.ForeColor = "#ffffff"



$Form.controls.Add($TextBox2)

$form.Topmost = $true

function Get-CCUsers {
Write-Host "The textbox text is $textbox.Text"
$dept = $textBox.Text
$deptUsers = Get-ADUser -Filter "Department -eq $dept"
ForEach ($user in $deptUsers) {
    IF ( ((get-aduser $user).enabled) -eq $True ) {
        $UHomeDir = (Get-ADUser $user -Properties HomeDirectory).HomeDirectory
        $UProfPath = (Get-ADUser $user -Properties ProfilePath).ProfilePath
        Write-Host "$user, $UHomeDir, $UProfPath"
        }
    }
}

$RunButton.Add_Click({
    $TextBox2.Text = Get-CCUsers
        })

$TextBox2.Add_TextChanged({
    $TextBox2.SelectionStart = $TextBox2.Text.Length
    $TextBox2.ScrollToCaret()
    })

$form.Add_Shown({$Form.Update()})
$result = $form.ShowDialog()

$global:x = $textBox.Text
# $x


# if ($result -eq [System.Windows.Forms.DialogResult]::OK)
#{




#}

Solution

  • I have made your script working changing the 'Get-CCUSers' function

    function Get-CCUsers {
    Write-Host "The textbox text is $textbox.Text"
    $dept = $textBox.Text
    $deptUsers = Get-ADUser -Filter "Department -eq '$dept'"
    $res = @()
    ForEach ($user in $deptUsers) {
        IF ( ((get-aduser $user).enabled) -eq $True ) {
            $UHomeDir = (Get-ADUser $user -Properties HomeDirectory).HomeDirectory
            $UProfPath = (Get-ADUser $user -Properties ProfilePath).ProfilePath
            $res += "$user, $UHomeDir, $UProfPath"
            }
        }
    return $res
    }
    

    In short:

    1. I removed the Write-Host (the output was actually redirected to stdout)
    2. I added a $res in the function initialized as array
    3. In the ForEach loop, results are added as items in the array
    4. The $res is returned by the function, and then used $RunButton