﻿# encoding: utf-8
# api: powershell
# title: SetDefaultPrinter.ps1
# description: Set a printer as default  for any user who has ever logged onto any given computer in a domain.
# version: 3.0
# type: script
# author: Brad Blaylock
# license: CC0
# function: Test-Alive
# x-poshcode-id: 2987
# x-archived: 2011-10-11T07:46:32
# x-published: 2011-10-06T12:35:00
#
#
<#
.SYNOPSIS
    Sets the Default Printer for any user on any machine in active directory.
.DESCRIPTION
    Search AD for Computername; Select UserAccount and Printer and make that printer the default
	printer for that user on that computer.
.PARAMETER Hostnme
	This parameter is required and should reflect the computer name (or names) you wish to inventory.
	This is basically a search criteria because the first thing the script will do is search Active
	Directory for computer names matching this input.     
.EXAMPLE
.NOTES
    Author:  	Brad Blaylock
	Version:	3.0
    Date:    	October 3, 2011
	Contact:	brad.blaylock@gmail.com
    Details:  	This Script accepts an AD Query (Computername) in the form of an entire computer name
			or partial computername as in sbcomp* or *2471wk1 and will find any listed computers
			that match the criteria in AD.  This list will be presented to the user.  The user will 
			select the computer they are needing, and click [LOAD].  Load will find all user accounts
			that have ever had a profile on that computer; Load will also list all printers installed
			on that computer.  The user will then select the user account and printer and click
			[Set Default].  SetDefault will make the selected printer default for the selected user
			on the selected computer.  
				If the selected user is not logged into the selected computer at the time, SetDefault 
			will Load the selected user's NTUSER.DAT registry Hive and make the selected changes offline.
	Issues:  	None Discovered as of Yet.
}	
#>
#~~~~~~~~~~~CUSTOM FUNCTIONS~~~~~~~~~~~~#
function Test-Alive($comp) {
	$ping = new-object System.Net.NetworkInformation.Ping
	$stat=$ping.Send("$comp")
	$reply = $stat.status
	trap {
		$False
		continue;
	}	
    if($reply -eq "Success") {$True}
}
function Ping-Port([string]$server, [int]$port) { 
	$tcpClient = New-Object System.Net.Sockets.TcpClient 
	trap {  
		$False 
		continue; 
	} 
	$tcpClient.Connect($server,$port) 
	if ($tcpClient.Connected) {$True} 
} 
Function ADSearch {
	$Input = $Args[0]
	$Search = New-Object DirectoryServices.DirectorySearcher([ADSI]â��â��)
	$Search.filter = â��(&(objectClass=Computer)(Name=$Input))â��
	$Results = $Search.Findall()
	foreach ($i in $Results)
	{
		$Item = $i.properties
		$lbxServers.Items.Add("$($Item.cn)")
	}
}
function LoadUsers {
	$hku = 2147483651
	$hklm = 2147483650
	$UserPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
	$UserWMI = [WMIClass]"\\$Computer\root\default:stdRegProv"
	$Accounts = $UserWMI.EnumKey($hklm,$UserPath)
	foreach ($Account in $Accounts.snames) {
			$User = $UserWMI.GetStringValue($hklm,"$UserPath\$Account","ProfileImagePath")
			$UserName = ($User.svalue).split("\")[2]
			$cbxUserAccount.Items.Add($Username)
	}
    $currentuser = (gwmi win32_ComputerSystem -computername $Computer | select UserName).UserName
    $tbxCurrentUser.Text = $currentuser

}
Function LoadPrinters {
	$hklm = 2147483650
	$PrinterPath = "Software\Microsoft\Windows NT\CurrentVersion\Print\Printers"
	$PrinterWMI = [WMIClass]"\\$Computer\root\default:stdRegProv"
	$Printers = $PrinterWMI.EnumKey($hklm,$PrinterPath)
	foreach ($Printer in $Printers.snames) {
			$Print = $PrinterWMI.GetStringValue($hklm,"$PrinterPath\$Printer","Name")
			$PrinterName = $Print.svalue
			$cbxPrinter.Items.Add($PrinterName)
	}
}
Function SetWithLocalRegHive {
#<#
		#Test OS Version (2000, XP or Vista\7\8)  
	$ostest = (gwmi win32_operatingsystem -computername $Computer | select Version | %{$_ -replace "@{Version=", ""} | %{$_ -replace "}", ""})
	$tbxStatus.ForeColor = [System.Drawing.Color]::FromArgb(255,69,139,0)
	Switch -wildcard ($ostest) {
        "5.0*" {$tbxStatus.Text = "Windows 2000"; $profileroot = "Documents and Settings"}
        "5.1*" {$tbxStatus.Text = "Windows XP"; $profileroot = "Documents and Settings"}
        "6.0*" {$tbxStatus.Text = "Windows Vista"; $profileroot = "Users" }
        "6.1*" {$tbxStatus.Text = "Windows 7"; $profileroot = "Users"}
    }
	Reg Load HKLM\TemporaryHive \\$Computer\C$\$profileroot\$UserName\NTUSER.DAT
	$LocalDefPrinter = (New-Object -ComObject Wscript.shell).RegRead("HKLM\TemporaryHive\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\Device")
	$LocalDefPrinterDetails = (New-Object -ComObject Wscript.Shell).RegRead("HKLM\TemporaryHive\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Devices\$PrinterName")
	$LocalDefaultPrinter = ($LocalDefPrinter).split(",")[0]
	$Localspool = ($LocalDefPrinterDetails).split(",")[0]
	$LocalPort = ($LocalDefPrinterDetails).split(",")[1]
	$LocalNewDefPrinter = $PrinterName + "," + $Localspool + "," + $LocalPort            
	(New-Object -comobject Wscript.Shell).regWrite("HKLM\TemporaryHive\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\Device", "$LocalNewDefPrinter", "REG_SZ")
    	Reg Unload HKLM\TemporaryHive
	$tbxStatus.Text = "Default Printer Changed!"	
}
Function SetDefaultPrinter { 
    Get-service -ComputerName $Computer -Include 'RemoteRegistry' | Start-Service
	$domain = $env:USERDOMAIN
	$hklm = 2147483650
	$hku = 2147483651
	$ntAccount = new-object System.Security.Principal.NTAccount($domain, $UserName) 
	$sid = $ntAccount.Translate([System.Security.Principal.SecurityIdentifier]) 
	$ActionPath = "$sid\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows"
	$DevicesPath = "$sid\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Devices"
	$ActionWMI = [WMIClass]"\\$Computer\root\default:stdRegProv"
	$DefPrinter = $ActionWMI.GetStringValue($hku,"$ActionPath","Device")
	$DefPrinterDetails = $ActionWMI.GetStringValue($hku,"$DevicesPath","$PrinterName")
	$testRegKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($hku,$Computer)
	$testReg = $testRegKey.OpenSubKey("$sid")
		If (!$testReg) {
            SetWithLocalRegHive
		}
		Else {
			$DefaultPrinter = ($DefPrinter.svalue).split(",")[0]
			$spool = ($DefPrinterDetails.svalue).split(",")[0]
			$Port = ($DefPrinterDetails.svalue).split(",")[1]
			$NewDefPrinter = $PrinterName + "," + $spool + "," + $Port
			$ActionWMI.SetStringValue($HKU,"$ActionPath","Device","$NewDefPrinter") #SET THE DEFAULT PRINTER#
			
			$tbxStatus.ForeColor = [System.Drawing.Color]::FromArgb(255,69,139,0)
			$tbxStatus.Text = "Default Printer Changed!"
		}
		$cbxUserAccount.ResetText()
		$cbxPrinter.ResetText()
}

#Generated Form Function
function GenerateForm {
########################################################################
# Code Generated By: SAPIEN Technologies PrimalForms (Community Edition) v1.0.8.0
# Generated On: 2/28/2011 11:35 AM
# Generated By: bwblaylock
########################################################################

#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Windows.Forms.VisualStyles") | Out-Null
[System.Windows.Forms.Application]::EnableVisualStyles()

#endregion

#region Generated Form Objects
$FrmMain = New-Object System.Windows.Forms.Form
$pgbProgress = New-Object System.Windows.Forms.ProgressBar
$lblPrinter = New-Object System.Windows.Forms.Label
$lblUserAccount = New-Object System.Windows.Forms.Label
$lblSearch = New-Object System.Windows.Forms.Label
$btnSearch = New-Object System.Windows.Forms.Button
$tbxSearch = New-Object System.Windows.Forms.TextBox
$btnClose = New-Object System.Windows.Forms.Button
$btnLoad = New-Object System.Windows.Forms.Button
$tbxServer = New-Object System.Windows.Forms.TextBox
$tbxStatus = New-Object System.Windows.Forms.TextBox
$tbxCurrentUser = New-Object System.Windows.Forms.TextBox
$lbxServers = New-Object System.Windows.Forms.ListBox
$btnSetDefault = New-Object System.Windows.Forms.Button
$cbxPrinter = New-Object System.Windows.Forms.ComboBox
$cbxUserAccount = New-Object System.Windows.Forms.ComboBox
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects

#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------
#Provide Custom Code for events specified in PrimalForms.
$btnClose_OnClick= 
{
	$FrmMain.Close()
}

$lbxServers.add_SelectedIndexChanged({ 
   	$tbxStatus.Text = $Null
	$tbxStatus.Refresh()
	$tbxServer.Text = $lbxServers.SelectedItem
	$tbxServer.Refresh()
    $tbxCurrentUser.Text = $null
    $tbxCurrentUser.Refresh()
    $cbxPrinter.Items.clear()
    $cbxPrinter.Text = $null
    $cbxPrinter.Refresh()
    $cbxUserAccount.Items.clear()
    $cbxUserAccount.Text = $null
    $cbxUserAccount.Refresh()

}) 

$btnLoad_OnClick= 
{
	$tbxStatus.ForeColor = [System.Drawing.Color]::FromArgb(255,255,255,0)
	$tbxStatus.Text = "Loading..."
	$tbxStatus.Refresh()
	$Computer = $tbxServer.Text
	If (Test-Alive $Computer) {	
		if ( (ping-port $Computer 135) -and (ping-port $Computer 445) ) {
			LoadUsers $Computer
			LoadPrinters $Computer
			$tbxStatus.ForeColor = [System.Drawing.Color]::FromArgb(255,69,139,0)
			$tbxStatus.Text = "Ready..."
		}
		Else { 
			$tbxStatus.ForeColor = [System.Drawing.Color]::FromArgb(255,255,64,64)
			$tbxStatus.Text = "RPC Server Not Available" 
			}
	}
	Else { 
		$tbxStatus.ForeColor = [System.Drawing.Color]::FromArgb(255,255,64,64)
		$tbxStatus.Text = "Server Offline" 
		}
	$pgbProgress.Visible = $False
}

$btnSetDefault_OnClick= 
{
    $Script:Computer = $tbxServer.Text 
	$Script:UserName = $cbxUserAccount.SelectedItem 
	$Script:PrinterName = $cbxPrinter.SelectedItem
	SetDefaultPrinter
}

$btnSearch_OnClick= 
{
	$lbxServers.Items.Clear()
	$Criteria = $tbxSearch.Text
	ADSearch $Criteria
}

$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
	$FrmMain.WindowState = $InitialFormWindowState
}

#----------------------------------------------
#region Generated Form Code
#Main Form
$FrmMain.CancelButton = $btnClose
$FrmMain.BackColor = [System.Drawing.Color]::FromArgb(255,166,202,240)
$FrmMain.Text = "Set Default Printer"
$FrmMain.Name = "FrmMain"
$FrmMain.KeyPreview = $True
$FrmMain.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 439
$System_Drawing_Size.Height = 272
$FrmMain.ClientSize = $System_Drawing_Size
$FrmMain.AcceptButton = $btnSearch
$FrmMain.FormBorderStyle = 2

#Search Label
$lblSearch.TabIndex = 0
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 100
$System_Drawing_Size.Height = 14
$lblSearch.Size = $System_Drawing_Size
$lblSearch.Text = "Search"
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 9
$lblSearch.Location = $System_Drawing_Point
$lblSearch.DataBindings.DefaultDataSourceUpdateMode = 0
$lblSearch.Name = "lblSearch"
$FrmMain.Controls.Add($lblSearch)

#Printer Label
$lblPrinter.TabIndex = 0
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 100
$System_Drawing_Size.Height = 12
$lblPrinter.Size = $System_Drawing_Size
$lblPrinter.Text = "Printer:"
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 258
$System_Drawing_Point.Y = 185
$lblPrinter.Location = $System_Drawing_Point
$lblPrinter.DataBindings.DefaultDataSourceUpdateMode = 0
$lblPrinter.Name = "lblPrinter"
$FrmMain.Controls.Add($lblPrinter)

#UserAccount Label
$lblUserAccount.TabIndex = 0
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 100
$System_Drawing_Size.Height = 13
$lblUserAccount.Size = $System_Drawing_Size
$lblUserAccount.Text = "User Account:"
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 259
$System_Drawing_Point.Y = 145
$lblUserAccount.Location = $System_Drawing_Point
$lblUserAccount.DataBindings.DefaultDataSourceUpdateMode = 0
$lblUserAccount.Name = "lblUserAccount"
$FrmMain.Controls.Add($lblUserAccount)

#Progress Bar
$pgbProgress.DataBindings.DefaultDataSourceUpdateMode = 0
$pgbProgress.BackColor = [System.Drawing.Color]::FromArgb(255,166,202,240)
$pgbProgress.ForeColor = [System.Drawing.Color]::FromArgb(255,0,255,0)
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 191
$System_Drawing_Size.Height = 8
$pgbProgress.Size = $System_Drawing_Size
$pgbProgress.Step = 1
$pgbProgress.TabIndex = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 246
$System_Drawing_Point.Y = 105
$pgbProgress.Location = $System_Drawing_Point
$pgbProgress.Style = [System.Windows.Forms.ProgressBarStyle]::Marquee #2
$pgbProgress.MarqueeAnimationSpeed = 50
$pgbProgress.Visible = $False
$pgbProgress.Name = "pgbProgress"
$FrmMain.Controls.Add($pgbProgress)

#Status Textbox
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 168
$System_Drawing_Size.Height = 17
$tbxStatus.Size = $System_Drawing_Size
$tbxStatus.DataBindings.DefaultDataSourceUpdateMode = 0
$tbxStatus.TextAlign = 2
$tbxStatus.BorderStyle = 0
$tbxStatus.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",10,1,3,0)
$tbxStatus.Name = "tbxStatus"
$tbxStatus.BackColor = [System.Drawing.Color]::FromArgb(255,166,202,240)
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 259
$System_Drawing_Point.Y = 88
$tbxStatus.Location = $System_Drawing_Point
$tbxStatus.TabIndex = 20
$FrmMain.Controls.Add($tbxStatus)

#Server Textbox
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 168
$System_Drawing_Size.Height = 17
$tbxServer.Size = $System_Drawing_Size
$tbxServer.DataBindings.DefaultDataSourceUpdateMode = 0
$tbxServer.TextAlign = 2
$tbxServer.BorderStyle = 0
$tbxServer.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",10,1,3,1)
$tbxServer.Name = "tbxServer"
$tbxServer.BackColor = [System.Drawing.Color]::FromArgb(255,166,202,240)
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 259
$System_Drawing_Point.Y = 32
$tbxServer.Location = $System_Drawing_Point
$tbxServer.TabIndex = 19
$FrmMain.Controls.Add($tbxServer)

#CurrentUser Textbox
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 168
$System_Drawing_Size.Height = 17
$tbxCurrentUser.Size = $System_Drawing_Size
$tbxCurrentUser.DataBindings.DefaultDataSourceUpdateMode = 0
$tbxCurrentUser.TextAlign = 2
$tbxCurrentUser.BorderStyle = 0
$tbxCurrentUser.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",8,[Drawing.FontStyle]'Italic') #0,3,1)
$tbxCurrentUser.Name = "tbxCurrentUser"
$tbxCurrentUser.BackColor = [System.Drawing.Color]::FromArgb(255,166,202,240)
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 259
$System_Drawing_Point.Y = 60
$tbxCurrentUser.Location = $System_Drawing_Point
$tbxCurrentUser.TabIndex = 20
$FrmMain.Controls.Add($tbxCurrentUser)

#Search Button
$btnSearch.TabIndex = 2
$btnSearch.Name = "btnSearch"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 60
$System_Drawing_Size.Height = 23
$btnSearch.Size = $System_Drawing_Size
$btnSearch.UseVisualStyleBackColor = $True
$btnSearch.Text = "Search"
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 180
$System_Drawing_Point.Y = 26
$btnSearch.Location = $System_Drawing_Point
$btnSearch.DataBindings.DefaultDataSourceUpdateMode = 0
$btnSearch.add_Click($btnSearch_OnClick)
$FrmMain.Controls.Add($btnSearch)

#Load Button
$btnLoad.TabIndex = 4
$btnLoad.Name = "btnLoad"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 60
$System_Drawing_Size.Height = 23
$btnLoad.Size = $System_Drawing_Size
$btnLoad.UseVisualStyleBackColor = $True
$btnLoad.Text = "Load"
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 310
$System_Drawing_Point.Y = 120
$btnLoad.Location = $System_Drawing_Point
$btnLoad.DataBindings.DefaultDataSourceUpdateMode = 0
$btnLoad.add_Click($btnLoad_OnClick)
$FrmMain.Controls.Add($btnLoad)

#Close Button
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 351
$System_Drawing_Point.Y = 236
$btnClose.Location = $System_Drawing_Point
$btnClose.DataBindings.DefaultDataSourceUpdateMode = 0
$btnClose.DialogResult = 2
$btnClose.add_Click($btnClose_OnClick)
$FrmMain.Controls.Add($btnClose)

#SetDefault Button
$btnSetDefault.TabIndex = 7
$btnSetDefault.Name = "btnSetDefault"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 75
$System_Drawing_Size.Height = 23
$btnSetDefault.Size = $System_Drawing_Size
$btnSetDefault.UseVisualStyleBackColor = $True
$btnSetDefault.Text = "Set Default"
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 259
$System_Drawing_Point.Y = 236
$btnSetDefault.Location = $System_Drawing_Point
$btnSetDefault.DataBindings.DefaultDataSourceUpdateMode = 0
$btnSetDefault.add_Click($btnSetDefault_OnClick)
$FrmMain.Controls.Add($btnSetDefault)

#Search Textbox
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 161
$System_Drawing_Size.Height = 20
$tbxSearch.Size = $System_Drawing_Size
$tbxSearch.DataBindings.DefaultDataSourceUpdateMode = 0
$tbxSearch.Name = "tbxSearch"
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 29
$tbxSearch.Location = $System_Drawing_Point
$tbxSearch.TabIndex = 1
$FrmMain.Controls.Add($tbxSearch)
$btnClose.TabIndex = 8
$btnClose.Name = "btnClose"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 75
$System_Drawing_Size.Height = 23
$btnClose.Size = $System_Drawing_Size
$btnClose.UseVisualStyleBackColor = $True
$btnClose.Text = "Close"

#Servers Listbox
#$lbxServers.UseCompatibleStateImageBehavior = $False
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 227
$System_Drawing_Size.Height = 205
$lbxServers.Size = $System_Drawing_Size
$lbxServers.DataBindings.DefaultDataSourceUpdateMode = 0
$lbxServers.Name = "lbxServers"
#$lbxServers.View = 3
$lbxServers.TabIndex = 3
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 55
$lbxServers.Location = $System_Drawing_Point
$FrmMain.Controls.Add($lbxServers)

#Printer Combobox
$cbxPrinter.FormattingEnabled = $True
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 168
$System_Drawing_Size.Height = 21
$cbxPrinter.Size = $System_Drawing_Size
$cbxPrinter.DataBindings.DefaultDataSourceUpdateMode = 0
$cbxPrinter.Name = "cbxPrinter"
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 258
$System_Drawing_Point.Y = 200
$cbxPrinter.Location = $System_Drawing_Point
$cbxPrinter.TabIndex = 6
$FrmMain.Controls.Add($cbxPrinter)

#UserAccount Combobox
$cbxUserAccount.FormattingEnabled = $True
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 168
$System_Drawing_Size.Height = 21
$cbxUserAccount.Size = $System_Drawing_Size
$cbxUserAccount.DataBindings.DefaultDataSourceUpdateMode = 0
$cbxUserAccount.Name = "cbxUserAccount"
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 258
$System_Drawing_Point.Y = 161
$cbxUserAccount.Location = $System_Drawing_Point
$cbxUserAccount.TabIndex = 5
$FrmMain.Controls.Add($cbxUserAccount)

#endregion Generated Form Code

#Save the initial state of the form
$InitialFormWindowState = $FrmMain.WindowState
#Init the OnLoad event to correct the initial state of the form
$FrmMain.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$FrmMain.ShowDialog()| Out-Null

} #End Function

#Call the Function
GenerateForm
