# encoding: ascii
# api: powershell
# title: ComputerQueryTool
# description: Tool for helpdesk to query computers and get information about the computer and the computers owner/user. Can be compiled into .exe with built in credentials with Powerhsell Studio
# version: 8.1
# type: function
# author: Brian C
# license: CC0
# function: Get-UserInformation
# x-poshcode-id: 5839
# x-archived: 2015-10-22T06:56:07
# x-published: 2015-05-01T14:41:00
#
#

function OnApplicationLoad
{
	#TODO: Add custom code to validate application load
	#TODO: Add Snapins here
	Import-Module ActiveDirectory
	return $true #return true for success or false for failure
	
}

function OnApplicationExit
{
	#TODO: Add custom code clean up on application exit
}

$textbox1_TextChanged = {
	#TODO: Place custom script here
}

$handler_btnQuery_Click = {
	$btnQuery.Text = "Processing..."
	$btnQuery.Enabled = $false
	$stringBuilder3 = New-Object System.Text.StringBuilder
	$text3 = "Querying remote computers. This can take a while, please wait..."
	$stringBuilder3.AppendLine($text3)
	$stringBuilder3.AppendLine("")
	$textboxResults.Text = $stringBuilder3.ToString()
	
	function Get-UserInformation
	{
		Param
		(
			# -Identity, usually samaccountname etc.
			[Parameter(Mandatory = $true,
					   ValueFromPipelineByPropertyName = $true,
					   Position = 0)]
			$identity
		)
		
		Begin
		{
			
		}
		
		Process
		{
			$ManagedUserList = @()
			try
			{
				$ADUserData.managedobjects | ForEach-Object -process {
					$objManagedUserObject = New-Object System.Object
					$QueryUser = Get-ADUser -Identity "$($txtUserName.Text)" -Properties Name, PasswordExpired, LockedOut, Enabled, LastBadPasswordAttempt | Select-Object -Property Name, PasswordExpired, LockedOut, Enabled, LastBadPasswordAttempt
					
					$Firstname = $QueryUser.Name.Split(" ")[1]
					$Surname = $QueryUser.Name.Split(" ")[0]
					$Username = $Firstname + " " + $Surname
				}
			}
			catch
			{
				Write-Output "No such user found in Active Directory"
			}
		}
		
		End
		{
			return $ManagedUserList
		}
	}
	
	function Get-UserComputers
	{
		Param
		(
			# -Identity, usually samaccountname etc.
			[Parameter(Mandatory = $true,
					   ValueFromPipelineByPropertyName = $true,
					   Position = 0)]
			$identity
		)
		
		Begin
		{
			try
			{
				$ADUserData = Get-ADUser -Identity $identity -Properties managedobjects
			}
			catch
			{
				$text = Write-Output "Error retrieving data from AD"
				#break
			}
			
		}
		Process
		{
			
			$ManagedObjectsList = @()
			$ADUserData.managedobjects | foreach -process {
				$objManagedObject = New-Object System.Object
				
				#Reset Error Variable
				$Error = ""
				
				#Clean the output
				$_ = (($_ -replace ('^CN\=', '')) -replace (',.*', ''))
				
				#Add the computers name to a list.
				if ($_ -like "*" -and $($_.length) -lt 16)
				{
					#Check if PC is available in AD
					try
					{
						$PC = Get-ADComputer -Identity $_ -Properties Operatingsystem, Enabled, IPV6Address, IPV4Address, LockedOut, LastBadPasswordAttempt | Select-Object -Property Operatingsystem, Enabled, IPV6Address, IPV4Address, LockedOut, LastBadPasswordAttempt
					}
					catch
					{
						Write-Output "No such object found in Active Directory."
						Write-Output ""
						Write-Output "Errorstack: $_"
						Write-Output ""
						Write-Output ""
						$Status = "Error"
					}
					if ($Status -ne "Error")
					{
						# Get information about the user being queried about
						try
						{
							$User = Get-ADUser -Identity "$($txtUserName.Text)" -Properties Name, PasswordExpired, LockedOut, Enabled, LastBadPasswordAttempt | Select-Object -Property Name, PasswordExpired, LockedOut, Enabled, LastBadPasswordAttempt
						}
						catch
						{
							Write-Output "No such user found in Active Directory"
						}
						
						$objManagedObject | Add-Member -Type NoteProperty -Name Computername -Value "$_ `n"
						
						if ((Test-Connection -Count 1 -ComputerName $_ -Quiet))
						{
							$IP = Test-Connection -Count 1 -ComputerName $_
							try
							{
								Function Get-LastLogon
								{
<#

.SYNOPSIS
	This function will list the last user logged on or logged in.

.DESCRIPTION
	This function will list the last user logged on or logged in.  It will detect if the user is currently logged on
	via WMI or the Registry, depending on what version of Windows is running on the target.  There is some "guess" work
	to determine what Domain the user truly belongs to if run against Vista NON SP1 and below, since the function
	is using the profile name initially to detect the user name.  It then compares the profile name and the Security
	Entries (ACE-SDDL) to see if they are equal to determine Domain and if the profile is loaded via the Registry.

.PARAMETER ComputerName
	A single Computer or an array of computer names.  The default is localhost ($env:COMPUTERNAME).

.PARAMETER FilterSID
	Filters a single SID from the results.  For use if there is a service account commonly used.
	
.PARAMETER WQLFilter
	Default WQLFilter defined for the Win32_UserProfile query, it is best to leave this alone, unless you know what
	you are doing.
	Default Value = "NOT SID = 'S-1-5-18' AND NOT SID = 'S-1-5-19' AND NOT SID = 'S-1-5-20'"
	
.EXAMPLE
	$Servers = Get-Content "C:\ServerList.txt"
	Get-LastLogon -ComputerName $Servers

	This example will return the last logon information from all the servers in the C:\ServerList.txt file.

	Computer          : SVR01
	User              : WILHITE\BRIAN
	SID               : S-1-5-21-012345678-0123456789-012345678-012345
	Time              : 9/20/2012 1:07:58 PM
	CurrentlyLoggedOn : False

	Computer          : SVR02
	User              : WILIHTE\BRIAN
	SID               : S-1-5-21-012345678-0123456789-012345678-012345
	Time              : 9/20/2012 12:46:48 PM
	CurrentlyLoggedOn : True
	
.EXAMPLE
	Get-LastLogon -ComputerName svr01, svr02 -FilterSID S-1-5-21-012345678-0123456789-012345678-012345

	This example will return the last logon information from all the servers in the C:\ServerList.txt file.

	Computer          : SVR01
	User              : WILHITE\ADMIN
	SID               : S-1-5-21-012345678-0123456789-012345678-543210
	Time              : 9/20/2012 1:07:58 PM
	CurrentlyLoggedOn : False

	Computer          : SVR02
	User              : WILIHTE\ADMIN
	SID               : S-1-5-21-012345678-0123456789-012345678-543210
	Time              : 9/20/2012 12:46:48 PM
	CurrentlyLoggedOn : True

.LINK
	http://msdn.microsoft.com/en-us/library/windows/desktop/ee886409(v=vs.85).aspx
	http://msdn.microsoft.com/en-us/library/system.security.principal.securityidentifier.aspx

.NOTES
	Author:	 Brian C. Wilhite
	Email:	 bwilhite1@carolina.rr.com
	Date: 	 "09/20/2012"
	Updates: Added FilterSID Parameter
	         Cleaned Up Code, defined fewer variables when creating PSObjects
	ToDo:    Clean up the UserSID Translation, to continue even if the SID is local
#>
									
									[CmdletBinding()]
									param (
										[Parameter(Position = 0, ValueFromPipeline = $true)]
										[Alias("CN", "Computer")]
										[String[]]$ComputerName = "$env:COMPUTERNAME",
										[String]$FilterSID,
										[String]$WQLFilter = "NOT SID = 'S-1-5-18' AND NOT SID = 'S-1-5-19' AND NOT SID = 'S-1-5-20'"
									)
									
									Begin
									{
										#Adjusting ErrorActionPreference to stop on all errors
										$TempErrAct = $ErrorActionPreference
										$ErrorActionPreference = "Stop"
										#Exclude Local System, Local Service & Network Service
									}#End Begin Script Block
									
									Process
									{
										Foreach ($Computer in $ComputerName)
										{
											$Computer = $Computer.ToUpper().Trim()
											Try
											{
												#Querying Windows version to determine how to proceed.
												$Win32OS = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $Computer
												$Build = $Win32OS.BuildNumber
												
												#Win32_UserProfile exist on Windows Vista and above
												If ($Build -ge 6001)
												{
													If ($FilterSID)
													{
														$WQLFilter = $WQLFilter + " AND NOT SID = `'$FilterSID`'"
													}#End If ($FilterSID)
													$Win32User = Get-WmiObject -Class Win32_UserProfile -Filter $WQLFilter -ComputerName $Computer
													$LastUser = $Win32User | Sort-Object -Property LastUseTime -Descending | Select-Object -First 1
													$Loaded = $LastUser.Loaded
													$Script:Time = ([WMI]'').ConvertToDateTime($LastUser.LastUseTime)
													
													#Convert SID to Account for friendly display
													$Script:UserSID = New-Object System.Security.Principal.SecurityIdentifier($LastUser.SID)
													$User = $Script:UserSID.Translate([System.Security.Principal.NTAccount])
												}#End If ($Build -ge 6001)
												
												If ($Build -le 6000)
												{
													If ($Build -eq 2195)
													{
														$SysDrv = $Win32OS.SystemDirectory.ToCharArray()[0] + ":"
													}#End If ($Build -eq 2195)
													Else
													{
														$SysDrv = $Win32OS.SystemDrive
													}#End Else
													$SysDrv = $SysDrv.Replace(":", "$")
													$Script:ProfLoc = "\\$Computer\$SysDrv\Documents and Settings"
													$Profiles = Get-ChildItem -Path $Script:ProfLoc
													$Script:NTUserDatLog = $Profiles | ForEach-Object -Process { $_.GetFiles("ntuser.dat.LOG") }
													
													#Function to grab last profile data, used for allowing -FilterSID to function properly.
													function GetLastProfData ($InstanceNumber)
													{
														$Script:LastProf = ($Script:NTUserDatLog | Sort-Object -Property LastWriteTime -Descending)[$InstanceNumber]
														$Script:UserName = $Script:LastProf.DirectoryName.Replace("$Script:ProfLoc", "").Trim("\").ToUpper()
														$Script:Time = $Script:LastProf.LastAccessTime
														
														#Getting the SID of the user from the file ACE to compare
														$Script:Sddl = $Script:LastProf.GetAccessControl().Sddl
														$Script:Sddl = $Script:Sddl.split("(") | Select-String -Pattern "[0-9]\)$" | Select-Object -First 1
														#Formatting SID, assuming the 6th entry will be the users SID.
														$Script:Sddl = $Script:Sddl.ToString().Split(";")[5].Trim(")")
														
														#Convert Account to SID to detect if profile is loaded via the remote registry
														$Script:TranSID = New-Object System.Security.Principal.NTAccount($Script:UserName)
														$Script:UserSID = $Script:TranSID.Translate([System.Security.Principal.SecurityIdentifier])
													}#End function GetLastProfData
													GetLastProfData -InstanceNumber 0
													
													#If the FilterSID equals the UserSID, rerun GetLastProfData and select the next instance
													If ($Script:UserSID -eq $FilterSID)
													{
														GetLastProfData -InstanceNumber 1
													}#End If ($Script:UserSID -eq $FilterSID)
													
													#If the detected SID via Sddl matches the UserSID, then connect to the registry to detect currently loggedon.
													If ($Script:Sddl -eq $Script:UserSID)
													{
														$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.RegistryHive]"Users", $Computer)
														$Loaded = $Reg.GetSubKeyNames() -contains $Script:UserSID.Value
														#Convert SID to Account for friendly display
														$Script:UserSID = New-Object System.Security.Principal.SecurityIdentifier($Script:UserSID)
														$User = $Script:UserSID.Translate([System.Security.Principal.NTAccount])
													}#End If ($Script:Sddl -eq $Script:UserSID)
													Else
													{
														$User = $Script:UserName
														$Loaded = "Unknown"
													}#End Else
													
												}#End If ($Build -le 6000)
												
												#Creating Custom PSObject For Output
												New-Object -TypeName PSObject -Property @{
													Computer = $Computer
													User = $User
													SID = $Script:UserSID
													Time = $Script:Time
													CurrentlyLoggedOn = $Loaded
												} | Select-Object Computer, User, SID, Time, CurrentlyLoggedOn
												
											}#End Try
											
											Catch
											{
												If ($_.Exception.Message -Like "*Some or all identity references could not be translated*")
												{
													Write-Warning "Unable to Translate $Script:UserSID, try filtering the SID `nby using the -FilterSID parameter."
													Write-Warning "It may be that $Script:UserSID is local to $Computer, Unable to translate remote SID"
												}
												Else
												{
													Write-Warning $_
												}
											}#End Catch
											
										}#End Foreach ($Computer in $ComputerName)
										
									}#End Process
									
									End
									{
										#Resetting ErrorActionPref
										$ErrorActionPreference = $TempErrAct
									}#End End
									
								}# End Function Get-LastLogon
								# Filter out built in system acccounts SID when compiling code with system account credentials
								$Lastlogon = Get-LastLogon -ComputerName $_ -FilterSID S-1-5-21-1547161642-1844823847-682003330-143460
								$Lastlogondate = $LastLogon.Time.Year.ToString() + "-" + $LastLogon.Time.Month.ToString() + "-" + $LastLogon.Time.Day.ToString() + " " + $LastLogon.Time.Hour.ToString() + ":" + $LastLogon.Time.Minute.ToString()
								$DaysSinceLastLogon = New-TimeSpan -Start $Lastlogon.time -End (Get-Date) | Select-Object -ExpandProperty Days
							}
							catch
							{
								$Lastlogondate = $null
							}
							
							try
							{
								$PCModel = Get-WmiObject Win32_ComputerSystem -Property Model -ComputerName $_ | Select-Object -ExpandProperty Model
							}
							catch
							{
								$PCModel = $Null
							}
							
							$objManagedObject | Add-Member -Type NoteProperty -Name Connection -Value "Connected `t `n"
							
							if ($Lastlogon -eq $null)
							{
								$objManagedObject | Add-Member -Type NoteProperty -Name 'User Last Logon Date' -Value "Access Denied `t `n"
								$objManagedObject | Add-Member -Type NoteProperty -Name 'Last Logged On User' -Value "Access Denied `t `n"
								$objManagedObject | Add-Member -Type NoteProperty -Name 'Currently Logged On' -Value "Access Denied `t `n"
							}
							else
							{
								try
								{
									$UserName = $Null
									$UserName = $Lastlogon.User.Value.Split("\")
									$Fullname = Get-ADUser -Identity $Username[1] -Properties Name | Select-Object -ExpandProperty Name
									$Firstname = $Fullname.Split(" ")[1]
									$Surname = $Fullname.Split(" ")[0]
									$NewUsername = $Firstname + " " + $Surname
									$Lastlogondate = $LastLogon.Time.Year.ToString() + "-" + $LastLogon.Time.Month.ToString() + "-" + $LastLogon.Time.Day.ToString() + " " + $LastLogon.Time.Hour.ToString() + ":" + $LastLogon.Time.Minute.ToString()
								}
								catch
								{
									$NewUsername = $null
									$Username = $Null
									$Lastlogondate = $null
								}
								$objManagedObject | Add-Member -Type NoteProperty -Name 'User Last Logged On' -Value "Username: $($Username[1]) `t Real name: $NewUsername `n"
								$objManagedObject | Add-Member -Type NoteProperty -Name 'User Last Logon Date' -Value "$LastLogonDate `t `n"
								$objManagedObject | Add-Member -Type NoteProperty -Name 'User Currently Logged On' -Value "$($Lastlogon.CurrentlyLoggedOn) `t `n"

								
								if ($Lastlogon.CurrentlyLoggedOn -eq $true)
								{
									$Lastlogondate = $LastLogon.Time.Year.ToString() + "-" + $LastLogon.Time.Month.ToString() + "-" + $LastLogon.Time.Day.ToString() + " " + $LastLogon.Time.Hour.ToString() + ":" + $LastLogon.Time.Minute.ToString()
									$DaysSinceLastLogon = New-TimeSpan -Start $Lastlogon.time -End (Get-Date) | Select-Object -ExpandProperty Days
									$HoursSinceLastLogon = New-TimeSpan -Start $Lastlogon.time -End (Get-Date) | Select-Object -ExpandProperty Hours
									$MinutesSinceLastLogon = New-TimeSpan -Start $Lastlogon.time -End (Get-Date) | Select-Object -ExpandProperty Minutes
									$Logonduration = "$NewUsername has been logged on for $DaysSinceLastLogon days, $HoursSinceLastLogon hours and $MinutesSinceLastLogon minutes"
									$objManagedObject | Add-Member -Type NoteProperty -Name 'User Logon Duration' -Value "$Logonduration `t `n"
									
								}
								else
								{
									$Logonduration = $null
									$objManagedObject | Add-Member -Type NoteProperty -Name 'User Currently Logged Duration' -Value "$Logonduration `t `n"
								}
							}
							
							if ($User.LastBadPasswordAttempt -ne $null)
							{
								$LastBadPassword = $User.LastBadPasswordAttempt.Year.ToString() + "-" + $User.LastBadPasswordAttempt.Month.ToString() + "-" + $User.LastBadpasswordattempt.Day.ToString() + " " + $User.LastBadPasswordAttempt.Hour.ToString() + ":" + $User.LastBadPasswordAttempt.Minute.ToString()
								$DaysSinceLastBadPassword = New-TimeSpan -Start $User.lastbadpasswordattempt -End (Get-Date) | Select-Object -ExpandProperty Days
								$objManagedObject | Add-Member -Type NoteProperty -Name 'User Last Bad Password Attempt' -Value "$Lastbadpassword `t($DaysSinceLastBadPassword days ago) `t `n"
							}
							else
							{
								$LastBadPassword = "No last bad password entry was found"
								$objManagedObject | Add-Member -Type NoteProperty -Name 'User Last Bad Password Attempt' -Value "$Lastbadpassword `t `n"
								
							}
							
							$objManagedObject | Add-Member -Type NoteProperty -Name 'User Password Expired' -Value "$($User.PasswordExpired) `t `n"
							
							if ($Lastlogon.User.value -ne $null)
							{
								$UserName = $Lastlogon.User.Value.Split("\")
								$PasswordExpires = Get-ADUser -Identity $Username[1] -Properties PasswordLastSet, PasswordNeverExpires, PasswordExpired | Select-Object -Property PasswordLastSet, PasswordNeverExpires, PasswordExpired
								if ($PasswordExpires.PasswordNeverExpires -eq $false)
								{
									$DaysLapsed = New-Timespan -Start $PasswordExpires.PasswordLastSet -End (Get-Date)
									$Days = $DaysLapsed.Days
									$TotalDaysLapsed = 90 - $Days
									$PasswordExpirationDate = (Get-Date).AddDays($TotalDaysLapsed).ToShortDateString()
									$objManagedObject | Add-Member -Type NoteProperty -Name 'User Password Expires At' -Value "$PasswordExpirationDate `t (expires in $TotalDaysLapsed days) `t `n"
								}
								else
								{
									$PasswordExpirationDate = $Null
									$objManagedObject | Add-Member -Type NoteProperty -Name 'User Password Expires At' -Value "$PasswordExpirationDate `t `n"
								}
							}
							else
							{
								$PasswordExpirationDate = $Null
								$objManagedObject | Add-Member -Type NoteProperty -Name 'User Password Expires At' -Value "$PasswordExpirationDate `t `n"
							}
							
							$objManagedObject | Add-Member -Type NoteProperty -Name 'User Locked Out' -Value "$($User.LockedOut) `t `n"
							$objManagedObject | Add-Member -Type NoteProperty -Name 'User Enabled' -Value "$($User.Enabled) `t `n `n"
							
							# Get IP from WMI
							try
							{
								$IPV4 = $null
								$IPV6 = $null
								$IPAddresses = Get-WmiObject -class Win32_NetworkAdapterConfiguration -ComputerName $_ | Where-Object { $_.DHCPEnabled -eq $True -and $_.DNSDomain -eq "btworld.net" }
								$IPS = $IPAddresses | Select-Object -ExpandProperty IPAddress
								$IPV4 = $IPS[0]
								$IPV6 = $IPS[1]
							}
							catch
							{
								$IPV4 = $null
								$IPV6 = $null
							}
							
							$objManagedObject | Add-Member -Type NoteProperty -Name 'IPV6 Address From WMI' -Value "$IPV6 `t `n"
							$objManagedObject | Add-Member -Type NoteProperty -Name 'IPV6 Address From ICMP' -Value "$($IP.IPV6Address.IPAddressToString) `t `n"
							$objManagedObject | Add-Member -Type NoteProperty -Name 'IPV6 Address From AD' -Value "$($PC.IPv6Address) `t `n"
							$objManagedObject | Add-Member -Type NoteProperty -Name 'IPV4 Address From WMI' -Value "$IPV4 `t `n"
							$objManagedObject | Add-Member -Type NoteProperty -Name 'IPV4 Address From ICMP' -Value "$($IP.IPV4Address.IPAddressToString) `t `n"
							$objManagedObject | Add-Member -Type NoteProperty -Name 'IPV4 Address From AD' -Value "$($PC.IPv4Address) `t `n"
							$objManagedObject | Add-Member -Type NoteProperty -Name 'PC Model' -Value "$PCModel `t `n"
							$objManagedObject | Add-Member -Type NoteProperty -Name 'PC Operating System' -Value "$($PC.Operatingsystem) `t `n"
							$objManagedObject | Add-Member -Type NoteProperty -Name 'PC Locked Out' -Value "$($PC.LockedOut) `t `n"
							$objManagedObject | Add-Member -Type NoteProperty -Name 'PC Enabled' -Value "$($PC.Enabled) `t `n"
							$objManagedObject | Add-Member -Type NoteProperty -Name 'PC Last Bad Password Attempt' -Value "$($PC.LastBadPasswordAttempt) `t `n"
						}
						else
						{
							$objManagedObject | Add-Member -Type NoteProperty -Name Connection -Value "Unreachable `n `n `n `n"
						}
						$ManagedObjectsList += $objManagedObject
					}
					else
					{
					}
				}
			}
		}
		End
		{
			return $ManagedObjectsList
		}
	}
	#save the current cursor
	$cursor = $formManagedComputerQuery.Cursor
	#change to wait cursor
	$formManagedComputerQuery.Cursor = [System.Windows.Forms.Cursors]::WaitCursor
	
	# "Gathering system information for {0}" -f $txtComputerName.Text.toUpper() Format-Table -Wrap -HideTableHeaders -AutoSize
	$stringBuilder = New-Object System.Text.StringBuilder
	$stringBuilder.AppendLine($text)
	try
	{
		# Get the users real name and reverse the order so it shows Firstname and then Surname
		$Username = Get-ADUser -Identity "$($txtUserName.Text)" -Properties Name | Select-Object -ExpandProperty Name
		$Firstname = $Username.Split(" ")[1]
		$Surname = $Username.Split(" ")[0]
		$Username = $Firstname + " " + $Surname
	}
	catch
	{
		Write-Output "Could not find the users name"
	}
	
	if ($UserName -ne $null)
	{
		$text = "Computer(s) managed by {0} ({1}) {2}" -f $txtUserName.Text.toUpper(), $Username, (Get-Date -Format g)
	}
	else
	{
		$text = "Computer(s) managed by {0} {1}" -f $txtUserName.Text.toUpper(), (Get-Date -Format g)
	}
	
	$stringBuilder.AppendLine($text)
	$stringBuilder.AppendLine("")
	$stringBuilder.AppendLine("User information is based on the user currently logged in or on the user who was the last one to logon to the computer.")
	
	if ($chkOS.Checked)
	{
		#$stringBuilder.AppendLine("Computername")
		#$stringBuilder.Append("*" * 50)
		$text = ""
		$text = (Get-UserComputers -identity "$($txtUserName.Text)") | Format-List | Out-String -Width 250
		$stringBuilder.AppendLine($text)
	}
	
	#write data to the pipeline
	$textboxResults.Text = $stringBuilder.ToString()
	
	#restore the cursor
	$formManagedComputerQuery.Cursor = $cursor
	
	$btnQuery.Text = "Query"
	$btnQuery.Enabled = $true
}



$lblPrompt_Click = {
	#TODO: Place custom script here
	
}

$labelPrerequisitesRemoteS_Click = {
	#TODO: Place custom script here
}

$label264bitOperatingSyste_Click = {
	#TODO: Place custom script here
	
}

$textboxResults_TextChanged = {
	#TODO: Place custom script here
	
}

$handler_btnPrerequisiteCheck_Click = {
	#TODO: Place custom script here
	
	$buttonPrerequisiteCheck.Text = "Processing..."
	$buttonPrerequisiteCheck.Enabled = $false
	$stringBuilder2 = New-Object System.Text.StringBuilder
	
	$AvailableModules = Get-Module -ListAvailable | Where-Object { $_.name -like "ActiveDirectory" } | Select-Object -ExpandProperty Name
	
	$PSVersion = $PSVersionTable.PSVersion.major.tostring()
	$LoadedModule = Get-Module ActiveDirectory | Select-Object -ExpandProperty Description
	$OS = Get-WmiObject Win32_OperatingSystem | Select-Object -Property Caption, OSArchitecture
	$RSATHotfix = Get-WmiObject -Class "win32_quickfixengineering" | Select-Object -Property "HotfixID" | Where-Object { $_.hotfixid -eq "KB958830" }
	if ($RSATHotfix.hotfixid -eq "KB958830" -or $PSVersion -gt 2)
	{
		$RSAT = "Pass"
	}
	else
	{
		$RSAT = "Fail"
	}
	
	if ($OS.Caption -like "Microsoft Windows Server 2003*" -or $OS.Caption -like "Microsoft Windows Server 2008*" -or $OS.Caption -like "Microsoft Windows Server 2012*" -or $OS.Caption -like "Microsoft Windows 7*" -or $OS.Caption -like "Microsoft Windows 8*" -and $OS.OSArchitecture -eq "64-bit")
	{
		$OSStatus = "Pass"
	}
	else
	{
		$OSStatus = "Fail"
	}
	if ($LoadedModule -eq "Active Directory Module")
	{
		$ModuleLoaded = "Pass"
	}
	elseif ($AvailableModules -eq "ActiveDirectory" -and $PSVersion -gt 2)
	{
		$ModuleLoaded = "Pass"
	}
	else
	{
		$ModuleLoaded = "Fail"
	}
	
	if ($PSVersion -like 1)
	{
		$PSVersion = "Fail"
	}
	else
	{
		$PSVersion = "Pass"
	}
	
	$stringBuilder2.AppendLine("Supported Powershell Version: $PSVersion")
	$stringBuilder2.AppendLine("Supported Operating System: $OSStatus")
	$stringBuilder2.AppendLine("Remote Server Administration Tools Installed: $RSAT")
	$stringBuilder2.AppendLine("Active Directory Module Loaded: $Moduleloaded")
	$stringBuilder2.AppendLine("")
	$textbox1.Text = $stringBuilder2.ToString()
	
	if ($RSAT -eq "Pass" -and $ModuleLoaded -eq "Fail" -and $OS.caption -like "Microsoft Windows 7*" -or $OS.Caption -like "Microsoft Windows 8*")
	{
		$buttonInstallPrerequisites.Visible = $False
		$buttonEnableADModule.Visible = $True
	}
	elseif ($RSAT -eq "Fail" -and $ModuleLoaded -eq "Fail" -and $OS.caption -like "Microsoft Windows 7*" -or $OS.Caption -like "Microsoft Windows 8*")
	{
		$buttonEnableADModule.Visible = $False
		$buttonInstallPrerequisites.Visible = $True
	}
	$buttonPrerequisiteCheck.Text = "Prerequisite Check"
	$buttonPrerequisiteCheck.Enabled = $True
}

$txtUserName_TextChanged = {
	#TODO: Place custom script here
	
}

$buttonInstallPrerequisites_Click = {
	#TODO: Place custom script here
	
}

$handler_buttonInstallPrerequisites_Click = {
	#TODO: Place custom script here
	<#

Date: 13-Feb-2012 ; 19:51
Author: Aman Dhally
Email: amandhally@gmail.com
www: www.amandhally.net/blog
blog: http://newdelhipowershellusergroup.blogspot.com/

More Info about this script : http://newdelhipowershellusergroup.blogspot.in/2012/02/automate-server-administration-tools.html 
This is only to Enable "Active Directory Powershell Module"

Version : 1

				/^(o.o)^\ 
				
Remote Administration server tool : http://www.microsoft.com/download/en/details.aspx?id=7887 | for x86 Select Windows6.1-KB958830-x86-RefreshPkg.msu 				

#>
	
	## You can download Hostfix from the above link
	
	$OS = Get-WmiObject Win32_OperatingSystem | Select-Object -Property Caption, OSArchitecture
	$RSATHotfixWin7 = Get-WmiObject -Class "win32_quickfixengineering" | Select-Object -Property "HotfixID" | Where-Object { $_.hotfixid -eq "KB958830" }
	$RSATHotfixWin81 = Get-WmiObject -Class "win32_quickfixengineering" | Select-Object -Property "HotfixID" | Where-Object { $_.hotfixid -eq "KB2693643" }
	$RSATHotfixWin8 = Get-WmiObject -Class "win32_quickfixengineering" | Select-Object -Property "HotfixID" | Where-Object { $_.hotfixid -eq "KB2693643" }
	
	if ($OS.caption -like "Microsoft Windows 7" -and $RSATHotfixWin7 -eq $null -and $OS.OSArchitecture -like "64-bit")
	{
		$Hotfix = "Windows6.1-KB958830-x64-RefreshPkg.msu"
		$HotfixSource = "\\semjgroup2\manager$\Program_Drivers_SP\Program\Microsoft\AD Admin tools\Windows 7 admin tools\$hotfix"
		
		$HotfixDestination = "C:\Windows\Temp"
		$Testpath = Test-path -path "\\semjgroup2\manager$\Program_Drivers_SP\Program\Microsoft\AD Admin tools\Windows 7 admin tools\$hotfix"
		$Tool = Test-Path "C:\Windows\Temp\Tools"
		if ($Tool -eq $false)
		{
			Write-Output "Download folder not found. Creating folder at C:\Windows\Temp\Tools\"
			New-Item -Name "Tools" -Path $HotfixDestination -ItemType Directory
		}
		else
		{
			Write-Output "Download directory found. Copying RSAT from network drive, please wait..."
		}
		
		
		if ($Testpath -eq $True)
		{
			Copy-Item $HotfixSource -Destination "$HotfixDestination\Tools"
		}
		$TransferStatus = Test-Path "$HotfixDestination\Tools\$Hotfix"
		if ($TransferStatus -eq $True)
		{
			Write-Output "File $Hotfix has been copied to $HotfixDestination\Tools\ Sucessfully. Initiating installation."
		}
		else
		{
			Write-Output "Failed to transfer file to $Hotfixdestination\Tools\. Please install the application manually"
		}
	}
	elseif ($OS.caption -like "Microsoft Windows 8.1*" -and $RSATHotfixWin81 -eq $null -and $OS.OSArchitecture -like "64-bit")
	{
		$Hotfix = "Windows8.1-KB2693643-x64.msu"
		$HotfixSource = "\\semjgroup2\manager$\Program_Drivers_SP\Program\Microsoft\AD Admin tools\Windows81 admin tools\$Hotfix"
		
		$HotfixDestination = "C:\Windows\Temp"
		$Testpath = Test-path -path "\\semjgroup2\manager$\Program_Drivers_SP\Program\Microsoft\AD Admin tools\Windows 7 admin tools\$hotfix"
		$Tool = Test-Path "C:\Windows\Temp\Tools"
		if ($Tool -eq $false)
		{
			Write-Output "Download folder not found. Creating folder at C:\Windows\Temp\Tools\"
			New-Item -Name "Tools" -Path $HotfixDestination -ItemType Directory
		}
		else
		{
			Write-Output "Download directory found. Copying RSAT from network drive, please wait..."
		}
		
		
		if ($Testpath -eq $True)
		{
			Copy-Item $HotfixSource -Destination "$HotfixDestination\Tools"
		}
		$TransferStatus = Test-Path "$HotfixDestination\Tools\$Hotfix"
		if ($TransferStatus -eq $True)
		{
			Write-Output "File $Hotfix has been copied to $HotfixDestination\Tools\ Sucessfully. Initiating installation."
		}
		else
		{
			Write-Output "Failed to transfer file to $Hotfixdestination\Tools\. Please install the application manually"
		}
	}
	elseif ($OS.caption -like "Microsoft Windows 8*" -and $RSATHotfixWin8 -eq $null -and $OS.Architecture -like "64-bit")
	{
		$Hotfix = "Windows6.2-KB2693643-x64.msu"
		$HotfixSource = "\\semjgroup2\manager$\Program_Drivers_SP\Program\Microsoft\AD Admin tools\Windows 8 admin tools\$hotfix"
		
		$HotfixDestination = "C:\Windows\Temp"
		$Testpath = Test-path -path "\\semjgroup2\manager$\Program_Drivers_SP\Program\Microsoft\AD Admin tools\Windows 7 admin tools\$hotfix"
		$Tool = Test-Path "C:\Windows\Temp\Tools"
		if ($Tool -eq $false)
		{
			Write-Output "Download folder not found. Creating folder at C:\Windows\Temp\Tools\"
			New-Item -Name "Tools" -Path $HotfixDestination -ItemType Directory
		}
		else
		{
			Write-Output "Download directory found. Copying RSAT from network drive, please wait..."
		}
		
		
		if ($Testpath -eq $True)
		{
			Copy-Item $HotfixSource -Destination "$HotfixDestination\Tools"
		}
		$TransferStatus = Test-Path "$HotfixDestination\Tools\$Hotfix"
		if ($TransferStatus -eq $True)
		{
			Write-Output "File $Hotfix has been copied to $HotfixDestination\Tools\ Sucessfully. Initiating installation."
		}
		else
		{
			Write-Output "Failed to transfer file to $Hotfixdestination\Tools\. Please install the application manually"
		}
	}
	
	Write-Output "Installing Remote Server Administration Tools......Accept the license agreement and begin installation. Script will continue when installation is completed."
	& wusa.exe "$HotfixDestination\Tools\$Hotfix"
	Start-Sleep -Seconds 15
	$X = 0
	do
	{
		try
		{
			$Installation = Get-Process "wusa"
			if ($Installation -ne $Null)
			{
				Write-Output "Still installing update please wait..."
				Start-Sleep -Seconds 15
				$X = 0
			}
			elseif ($Installation -eq $Null)
			{
				$X = 1
			}
		}
		catch
		{
			$Installation = $Null
		}
	}
	until ($X -eq 1)
	
	
	Write-Output "HotFix Installed. Attempting to enable the Active Directory Module for Windows Powershell"
	& dism.exe /Online /Enable-Feature /FeatureName:RemoteServerAdministrationTools  /FeatureName:RemoteServerAdministrationTools-Roles /FeatureName:RemoteServerAdministrationTools-Roles-AD  /FeatureName:RemoteServerAdministrationTools-Roles-AD-Powershell
	
	do
	{
		try
		{
			$Activation = Get-Process dism -ErrorAction -silentlycontinue
			if ($Activation -ne $Null)
			{
				Write-Output "Still activating Windows features please wait..."
				Start-Sleep -Seconds 15
			}
			else
			{
			}
		}
		catch
		{
			$Activation = $Null
		}
	}
	until ($Activation -eq $Null)
	
	Write-Output "Installation completed. Attempting to load the module now."
	Import-Module ActiveDirectory
	Start-Sleep -Seconds 10
	$Module = Get-Module ActiveDirectory | Select-Object -ExpandProperty Description
	if ($Module -eq "Active Directory Module")
	{
		Write-Output "Module was successfully installed and loaded"
	}
	else
	{
		Write-Output "Module was not installed successfully and has not been loaded"
	}
}

$buttonEnableADModule_Click = {
	#TODO: Place custom script here
}

$handler_buttonEnableADModule_Click = {
	#TODO: Place custom script here
	& dism.exe /Online /Enable-Feature /FeatureName:RemoteServerAdministrationTools  /FeatureName:RemoteServerAdministrationTools-Roles /FeatureName:RemoteServerAdministrationTools-Roles-AD  /FeatureName:RemoteServerAdministrationTools-Roles-AD-Powershell
	
	do
	{
		try
		{
			$Activation = Get-Process dism -ErrorAction -silentlycontinue
			if ($Activation -ne $Null)
			{
				Write-Output "Still activating Windows features please wait..."
				Start-Sleep -Seconds 15
			}
			else
			{
			}
		}
		catch
		{
			$Activation = $Null
		}
	}
	until ($Activation -eq $Null)
	
	Write-Output "Installation completed. Attempting to load the module now."
	Start-Sleep -Seconds 5
	Import-Module ActiveDirectory
	Start-Sleep -Seconds 10
	$Module = Get-Module ActiveDirectory | Select-Object -ExpandProperty Description
	if ($Module -eq "Active Directory Module")
	{
		Write-Output "Module was successfully installed and loaded"
	}
	else
	{
		Write-Output "Module was not installed successfully and has not been loaded"
	}
}
