0

I want to prevent my Powershell Form from closing after a submit button is pressed. After the function "search_PC" there is no more code and the form closes. I want to still be able to write stuff in there after the function is finished. I have already tried the pause function and while($true) loops. I would be very happy about an answer.

Import-Module ActiveDirectory

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

# Create Form
$objForm = New-Object System.Windows.Forms.Form
$objForm.Size = New-Object System.Drawing.Size(400,500)
$objForm.Backcolor="white"
$objForm.StartPosition = "CenterScreen"
$objForm.Text = "Example Software"
$objForm.Icon="C:\Users\...\icon.ico"

# Label
$objLabel1 = New-Object System.Windows.Forms.Label
$objLabel1.Location = New-Object System.Drawing.Size(80,30)
$objLabel1.Size = New-Object System.Drawing.Size(60,20)
$objLabel1.Text = "UserID:"
$objForm.Controls.Add($objLabel1)

# Textbox
$objTextBox1 = New-Object System.Windows.Forms.TextBox
$objTextBox1.Location = New-Object System.Drawing.Size(160,28)
$objTextBox1.Size = New-Object System.Drawing.Size(100,20)
$objForm.Controls.Add($objTextBox1)

# Label
$objLabel2 = New-Object System.Windows.Forms.Label
$objLabel2.Location = New-Object System.Drawing.Size(80,72)
$objLabel2.Size = New-Object System.Drawing.Size(80,20)
$objLabel2.Text = "PC-Name:"
$objForm.Controls.Add($objLabel2)

# Textbox
$objTextBox2 = New-Object System.Windows.Forms.TextBox
$objTextBox2.Location = New-Object System.Drawing.Size(160,70)
$objTextBox2.Size = New-Object System.Drawing.Size(100,20)
$objForm.Controls.Add($objTextBox2)

# Button for closing
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(100,220)
$CancelButton.Size = New-Object System.Drawing.Size(163,25)
$CancelButton.Text = "Exit"
$CancelButton.Name = "Exit"
$CancelButton.DialogResult = "Cancel"
$CancelButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CancelButton)

# Checkbox
$objTypeCheckbox1 = New-Object System.Windows.Forms.Checkbox 
$objTypeCheckbox1.Location = New-Object System.Drawing.Size(80,120) 
$objTypeCheckbox1.Size = New-Object System.Drawing.Size(500,20)
$objTypeCheckbox1.Text = "Internal Session Support"
$objTypeCheckbox1.TabIndex = 1
$objTypeCheckbox1.Add_Click({$objTypeCheckbox2.Checked = $false})
$objForm.Controls.Add($objTypeCheckbox1)

  # Checkbox
$objTypeCheckbox2 = New-Object System.Windows.Forms.Checkbox 
$objTypeCheckbox2.Location = New-Object System.Drawing.Size(80,140) 
$objTypeCheckbox2.Size = New-Object System.Drawing.Size(500,20)
$objTypeCheckbox2.Text = "Session Support Internal & external"
$objTypeCheckbox2.TabIndex = 2
$objTypeCheckbox2.Add_Click({$objTypeCheckbox1.Checked = $false})
$objForm.Controls.Add($objTypeCheckbox2)

# Button fo checking the User Input
$SubmitButton = New-Object System.Windows.Forms.Button
$SubmitButton.Location = New-Object System.Drawing.Size(100,190)
$SubmitButton.Size = New-Object System.Drawing.Size(163,25)
$SubmitButton.Text = "Submit"
$SubmitButton.Name = "Submit"
$SubmitButton.DialogResult = "OK"
$objForm.AcceptButton = $SubmitButton

$SubmitButton.Add_Click({ 
$User = $objTextBox1.Text
$PC = $objTextBox2.Text

# Check if all User Inputs are filled out
if ( !($User.trim()) -or !($PC.trim()) ) { 
   [void] [Windows.Forms.MessageBox]::Show("Please fill out every value!", "Error", [Windows.Forms.MessageBoxButtons]::ok, [Windows.Forms.MessageBoxIcon]::Warning)}

if($objTypeCheckbox1.checked -eq $true) {$Software = "Internal"}
elseif($objTypeCheckbox2.checked -eq $true) {$Software = "Internal&External"}
else {[void] [Windows.Forms.MessageBox]::Show("Please fill out every value!", "Error", [Windows.Forms.MessageBoxButtons]::ok, [Windows.Forms.MessageBoxIcon]::Warning)}

search_user
})
$objForm.Controls.Add($SubmitButton)

$statusBar1 = New-Object System.Windows.Forms.StatusBar
$objForm.controls.add($statusBar1)

function createFile
{
$Date = Get-Date -Format d.M.yyyy
$Time = (Get-Date).ToString(„HH:mm:ss“)
$Time2 = (Get-Date).ToString(„HH-mm-ss“)
$Date2 = Get-Date -Format yyyy-M-d;
$FileName = $Time2 + " " + $Date2

$wrapper = New-Object PSObject -Property @{ 1 = $Date; 2 = $Time; 3 = $User; 4 = $PC; 5 = $Software }
Export-Csv -InputObject $wrapper -Path C:\Users\...\$FileName.csv -NoTypeInformation
[void] [Windows.Forms.MessageBox]::Show("Successful!")
}

function search_user
{
if (@(Get-ADUser -Filter {SamAccountName -eq $User}).Count -eq 0) {
    $objTextBox1.BackColor = "Red";
    $statusBar1.Text = "Couldn't find user!"
    $objForm.Dispose()
}
else{$objTextBox1.BackColor = "Green"
search_PC}
}

function search_PC
{
$Client = $PC
if (@(Get-ADComputer -Filter {DNSHostName -eq $Client}).Count -eq 0) {
    $objTextBox2.BackColor = "Red";
    $statusBar1.Text = "Couldn't find PC!"
    $objForm.Dispose()
}
else{$objTextBox2.BackColor = "Green"
createFile}
}

$objForm.ShowDialog() #Showing Form and elements

Screenshot of the form:

Screenshot of the form

4
  • 3
    You're disposing of the form when you run the functions. $objForm.Dispose() Commented Jul 22, 2020 at 9:57
  • I'm aware of that. I should have removed it for the question. Even if I remove the function, the application closes ;-( Commented Jul 22, 2020 at 11:58
  • If you have removed $objForm.Dispose() from all the places you have it, then are you receiving any errors in the PowerShell console that you are running the code/script from? I would test it myself, but I'm not on Windows. Commented Jul 22, 2020 at 12:04
  • You should do $objForm.Dispose() only once, AFTER $objForm.ShowDialog() to clear it from memory. Commented Jul 22, 2020 at 12:28

1 Answer 1

1

This line is your problem:

$SubmitButton.DialogResult = "OK"

It should be:

$SubmitButton.DialogResult = [System.Windows.Forms.DialogResult]::None

Or just be removed.

DialogResult

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.