From d4df2f595b8ab3bcc447142c2e623307e77e336e Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Thu, 16 Nov 2017 09:06:50 -0500 Subject: [PATCH 01/21] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3cb2c0a..61df0d1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ # OSD -Powershell script using windows forms to prompt for computer name during OSD deployment in PE. +Powershell scripts for OSD deployment in PE. Requires powershell feature added to WinPE. From a57db1c813aa2fac52edca070d5da4099bc2842c Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Thu, 16 Nov 2017 09:07:17 -0500 Subject: [PATCH 02/21] Delete Set-OSDComputerName.ps1 --- Set-OSDComputerName.ps1 | 1311 --------------------------------------- 1 file changed, 1311 deletions(-) delete mode 100644 Set-OSDComputerName.ps1 diff --git a/Set-OSDComputerName.ps1 b/Set-OSDComputerName.ps1 deleted file mode 100644 index 17d1139..0000000 --- a/Set-OSDComputerName.ps1 +++ /dev/null @@ -1,1311 +0,0 @@ -##*============================================= -##* VARIABLE DECLARATION -##*============================================= -$ComputerName = $env:COMPUTERNAME -$ComputerSystem = Get-WmiObject -Namespace "root\cimv2" -Class Win32_ComputerSystem -[string]$Manufacturer = $ComputerSystem.Manufacturer -[string]$Model = $ComputerSystem.Model -$BIOSInfo = get-wmiobject Win32_BIOS -[string]$SerialNumber = $BIOSInfo.SerialNumber - -[boolean]$Is64Bit = [boolean]((Get-WmiObject -Class 'Win32_Processor' | Where-Object { $_.DeviceID -eq 'CPU0' } | Select-Object -ExpandProperty 'AddressWidth') -eq 64) -If ($Is64Bit) { [string]$envOSArchitecture = '64-bit' } Else { [string]$envOSArchitecture = '32-bit' } - - -Function Load-Form -{ - $Form.Controls.AddRange(@( - $LabelManufacturer, - $LabelModel, - $LabelSerial, - - $GBModel, - $PBDELLCHASSIS, - - #$GBSystemInfo, - #$OutputBoxSysInfo, - - $TBComputerName, - $GBComputerName, - $ButtonOK - )) - #$Form.Add_Shown({Retrieve-SystemInfo -DisplayType "Basic" -DisplayOutbox -IgnorePing}) - $Form.Add_Shown({Get-SystemImage}) - $Form.Add_Shown({$Form.Activate()}) - [void] $Form.ShowDialog() - -} - -Function Get-SystemImage{ - $system = Get-WMIObject -class Win32_systemenclosure - $type = $system.chassistypes - - Switch ($Type) - { - "1" {$Type = "Other";$PBDELLCHASSIS.Image = $Null} - "2" {$Type = "Virtual Machine";$PBDELLCHASSIS.Image = $VMImage} - "3" {$Type = "Desktop";$PBDELLCHASSIS.Image = $DesktopImage} - "4" {$type = "Low Profile Desktop";$PBDELLCHASSIS.Image = $DesktopImage} - "5" {$type = "Pizza Box";$PBDELLCHASSIS.Image = $Null} - "6" {$type = "Mini Tower";$PBDELLCHASSIS.Image = $DesktopImage} - "7" {$type = "Tower";$PBDELLCHASSIS.Image = $DesktopImage} - "8" {$type = "Portable";$PBDELLCHASSIS.Image = $Null} - "9" {$type = "Laptop";$PBDELLCHASSIS.Image = $LaptopImage} - "10" {$type = "Notebook";$PBDELLCHASSIS.Image = $LaptopImage} - "11" {$type = "Handheld";$PBDELLCHASSIS.Image = $Null} - "12" {$type = "Docking Station";$PBDELLCHASSIS.Image = $Null} - "13" {$type = "All-in-One";$PBDELLCHASSIS.Image = $Null} - "14" {$type = "Sub-Notebook";$PBDELLCHASSIS.Image = $Null} - "15" {$type = "Space Saving";$PBDELLCHASSIS.Image = $Null} - "16" {$type = "Lunch Box";$PBDELLCHASSIS.Image = $Null} - "17" {$type = "Main System Chassis";$PBDELLCHASSIS.Image = $Null} - "18" {$type = "Expansion Chassis";$PBDELLCHASSIS.Image = $Null} - "19" {$type = "Sub-Chassis";$PBDELLCHASSIS.Image = $Null} - "20" {$type = "Bus Expansion Chassis";$PBDELLCHASSIS.Image = $Null} - "21" {$type = "Peripheral Chassis";$PBDELLCHASSIS.Image = $Null} - "22" {$type = "Storage Chassis";$PBDELLCHASSIS.Image = $Null} - "23" {$type = "Rack Mount Chassis";$PBDELLCHASSIS.Image = $Null} - "24" {$type = "Sealed-Case PC";$PBDELLCHASSIS.Image = $Null} - Default {$type = "Unknown";$PBDELLCHASSIS.Image = $Null} - } - $LabelModel.Visible = $true -} - -Function Get-OSDComputerName{ - If ($ComputerName.StartsWith('MININT')) { - If ($serialNumber.StartsWith('System')){ - return "[Unit]-[identifier]" - } - Else{ - return "[Unit]-" + $serialNumber - } - } - ElseIf ($ComputerName.StartsWith('MINWINPC')) { - If ($serialNumber.StartsWith('System')){ - return "[Unit]-[identifier]" - } - Else{ - return "[Unit]-" + $serialNumber - } - } - Else { - return $ComputerName - } -} -Function Set-OSDComputerName -{ - $ErrorProvider.Clear() - $ErrorProvider.SetIconPadding($GBComputerName, 10) - $ErrorProvider.SetIconAlignment($GBComputerName, "MiddleRight") - - if ($TBComputerName.Text.Length -eq 0) - { - $ErrorProvider.SetError($GBComputerName, "Please enter a computer name.") - } - - elseif ($TBComputerName.Text.Length -gt 15) - { - $ErrorProvider.SetError($GBComputerName, "Computer name cannot be more than 15 characters.") - } - - elseif ($TBComputerName.Text -eq $serialNumber) - { - $ErrorProvider.SetError($GBComputerName, "Computer name cannot be just the serial number.") - } - - #Validation Rule for computer names. - elseif ($TBComputerName.Text -match "^[-_]|[^a-zA-Z0-9-_]") - { - $ErrorProvider.SetError($GBComputerName, "Computer name invalid, please correct the computer name.") - } - - else - { - $OSDComputerName = $TBComputerName.Text.ToUpper() - $TSEnv = New-Object -COMObject Microsoft.SMS.TSEnvironment - $TSEnv.Value("OSDComputerName") = "$($OSDComputerName)" - $Form.Close() - } -} - -Function Retrieve-SystemInfo - <# - .SYNOPSIS - Get Complete details of any server Local or remote - .DESCRIPTION - This function uses WMI class to connect to remote machine and get all related details - .PARAMETER COMPUTERNAMES - Just Pass computer name as Its parameter - .EXAMPLE - Retrieve-SystemInfo - .EXAMPLE - Retrieve-SystemInfo -ComputerName HQSPDBSP01 - .NOTES - To get help: - Get-Help Retrieve-SystemInfo - .LINK - http://sqlpowershell.wordpress.com - #> - - { - param( - [ValidateSet("Detail","Basic","NetInfo")] - [string]$DisplayType = "Detail", - [switch] $DisplayForm = $false, - [switch] $DisplayOutbox = $false, - [switch] $IgnorePing - ) - - # Declare main data hash to be populated later - $data = @{} - $data.' Computer Name:' = $env:ComputerName - - If($DisplayType -eq "Detail"){ - # Do a DNS lookup with a .NET class method. Suppress error messages. - $ErrorActionPreference = 'SilentlyContinue' - if ( $ips = [System.Net.Dns]::GetHostAddresses($env:ComputerName) | foreach { $_.IPAddressToString } ) { - $data.'IP Address(es) from DNS' = ($ips -join ', ') - } - else { - $data.'IP Address from DNS' = 'Could not resolve' - } - # Make errors visible again - $ErrorActionPreference = 'Continue' - - # We'll assume no ping reply means it's dead. Try this anyway if -IgnorePing is specified - if ($ping -or $ignorePing) { - $data.'WMI Data Collection Attempt' = 'Yes (ping reply or -IgnorePing)' - - # Get various info from the ComputerSystem WMI class - if ($wmi = Get-WmiObject -Class Win32_ComputerSystem -ErrorAction SilentlyContinue) { - $data.'Computer Hardware Manufacturer' = $wmi.Manufacturer - $data.'Computer Hardware Model' = $wmi.Model - $data.'Memory Physical in MB' = ($wmi.TotalPhysicalMemory/1MB).ToString('N') - $data.'Logged On User' = $wmi.Username - } - $wmi = $null - - # Get the free/total disk space from local disks (DriveType 3) - if ($wmi = Get-WmiObject -Class Win32_LogicalDisk -Filter 'DriveType=3' -ErrorAction SilentlyContinue) { - $wmi | Select 'DeviceID', 'Size', 'FreeSpace' | Foreach { - $data."Local disk $($_.DeviceID)" = ('' + ($_.FreeSpace/1MB).ToString('N') + ' MB free of ' + ($_.Size/1MB).ToString('N') + ' MB total space with ' + ($_.Size/1MB - $_.FreeSpace/1MB).ToString('N') +' MB Used Space') - } - } - $wmi = $null - - # Get IP addresses from all local network adapters through WMI - if ($wmi = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ErrorAction SilentlyContinue) { - $Ips = @{} - $wmi | Where { $_.IPAddress -match '\S+' } | Foreach { $Ips.$($_.IPAddress -join ', ') = $_.MACAddress } - $counter = 0 - $Ips.GetEnumerator() | Foreach { - $counter++; $data."IP Address $counter" = '' + $_.Name + ' (MAC: ' + $_.Value + ')' - } - } - $wmi = $null - - # Get CPU information with WMI - if ($wmi = Get-WmiObject -Class Win32_Processor -ErrorAction SilentlyContinue) { - $wmi | Foreach { - $maxClockSpeed = $_.MaxClockSpeed - $numberOfCores += $_.NumberOfCores - $description = $_.Description - $numberOfLogProc += $_.NumberOfLogicalProcessors - $socketDesignation = $_.SocketDesignation - $status = $_.Status - $manufacturer = $_.Manufacturer - $name = $_.Name - } - $data.'CPU Clock Speed' = $maxClockSpeed - $data.'CPU Cores' = $numberOfCores - $data.'CPU Description' = $description - $data.'CPU Logical Processors' = $numberOfLogProc - $data.'CPU Socket' = $socketDesignation - $data.'CPU Status' = $status - $data.'CPU Manufacturer' = $manufacturer - $data.'CPU Name' = $name -replace '\s+', ' ' - } - $wmi = $null - - # Get BIOS info from WMI - if ($wmi = Get-WmiObject -Class Win32_Bios -ErrorAction SilentlyContinue) { - $data.'BIOS Manufacturer' = $wmi.Manufacturer - $data.'BIOS Name' = $wmi.Name - $data.'BIOS Version' = $wmi.Version - $data.'BIOS SM Version:' = $wmi.SMBIOSBIOSVersion - } - $wmi = $null - - # Get operating system info from WMI - if ($wmi = Get-WmiObject -Class Win32_OperatingSystem -ErrorAction SilentlyContinue) { - $data.'OS Boot Time' = $wmi.ConvertToDateTime($wmi.LastBootUpTime) - $data.'OS System Drive' = $wmi.SystemDrive - $data.'OS System Device' = $wmi.SystemDevice - $data.'OS Language ' = $wmi.OSLanguage - $data.'OS Version' = $wmi.Version - $data.'OS Windows dir' = $wmi.WindowsDirectory - $data.'OS Name' = $wmi.Caption - $data.'OS Install Date' = $wmi.ConvertToDateTime($wmi.InstallDate) - $data.'OS Service Pack' = [string]$wmi.ServicePackMajorVersion + '.' + $wmi.ServicePackMinorVersion - } - # Scan for open ports - $ports = @{ - 'File shares/RPC' = '139' ; - 'File shares' = '445' ; - 'RDP' = '3389'; - #'Zenworks' = '1761'; - } - foreach ($service in $ports.Keys) { - $socket = New-Object Net.Sockets.TcpClient - # Suppress error messages - $ErrorActionPreference = 'SilentlyContinue' - # Try to connect - $socket.Connect($env:ComputerName, $ports.$service) - # Make error messages visible again - $ErrorActionPreference = 'Continue' - if ($socket.Connected) { - $data."Port $($ports.$service) ($service)" = 'Open' - $socket.Close() - } - else { - $data."Port $($ports.$service) ($service)" = 'Closed or filtered' - } - $socket = $null - } - } - else { - $data.'WMI Data Collected' = 'No (no ping reply and -IgnorePing not specified)' - } - $wmi = $null - - if ($wmi = Get-WmiObject -Class Win32_OperatingSystem -ErrorAction SilentlyContinue| Select-Object Name, TotalVisibleMemorySize, FreePhysicalMemory,TotalVirtualMemorySize,FreeVirtualMemory,FreeSpaceInPagingFiles,NumberofProcesses,NumberOfUsers ) { - $wmi | Foreach { - $TotalRAM = $_.TotalVisibleMemorySize/1MB - $FreeRAM = $_.FreePhysicalMemory/1MB - $UsedRAM = $_.TotalVisibleMemorySize/1MB - $_.FreePhysicalMemory/1MB - $TotalRAM = [Math]::Round($TotalRAM, 2) - $FreeRAM = [Math]::Round($FreeRAM, 2) - $UsedRAM = [Math]::Round($UsedRAM, 2) - $RAMPercentFree = ($FreeRAM / $TotalRAM) * 100 - $RAMPercentFree = [Math]::Round($RAMPercentFree, 2) - $TotalVirtualMemorySize = [Math]::Round($_.TotalVirtualMemorySize/1MB, 3) - $FreeVirtualMemory = [Math]::Round($_.FreeVirtualMemory/1MB, 3) - $FreeSpaceInPagingFiles = [Math]::Round($_.FreeSpaceInPagingFiles/1MB, 3) - $NumberofProcesses = $_.NumberofProcesses - $NumberOfUsers = $_.NumberOfUsers - } - $data.'Memory - Total RAM GB ' = $TotalRAM - $data.'Memory - RAM Free GB' = $FreeRAM - $data.'Memory - RAM Used GB' = $UsedRAM - $data.'Memory - Percentage Free'= $RAMPercentFree - $data.'Memory - TotalVirtualMemorySize' = $TotalVirtualMemorySize - $data.'Memory - FreeVirtualMemory' = $FreeVirtualMemory - $data.'Memory - FreeSpaceInPagingFiles' = $FreeSpaceInPagingFiles - $data.'NumberofProcesses'= $NumberofProcesses - $data.'NumberOfUsers' = $NumberOfUsers -replace '\s+', ' ' - } - # Output data - "#"*80 - "OS Complete Information" - "Generated $(get-date)" - "Generated from $(gc env:computername)" - "#"*80 - - } ElseIf ($DisplayType -eq "NetInfo"){ - - } Else { - # Get operating system info from WMI - if ($wmi = Get-WmiObject -Class Win32_OperatingSystem -ErrorAction SilentlyContinue) { - If(!$wmi.Caption){$Caption="WinPE"; $Name = "PE:"}Else{$Caption=$wmi.Caption; $Name = "OS:"} - $data." $Name" = "$Caption ("+$wmi.Version+")" - } - - # Get BIOS info from WMI - if ($wmi = Get-WmiObject -Class Win32_Bios -ErrorAction SilentlyContinue) { - $data.'BIOS Version:' = $wmi.SMBIOSBIOSVersion - $data.'Serial Number:' = $wmi.SerialNumber - } - $wmi = $null - - if ($wmi = Get-WmiObject -Class Win32_ComputerSystem -ErrorAction SilentlyContinue) { - $data.'Manufacturer:' = $wmi.Manufacturer - $data.'Model:' = $wmi.Model - } - $wmi = $null - - # Get IP addresses from all local network adapters through WMI - if ($wmi = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ErrorAction SilentlyContinue) { - $Ips = @{} - $wmi | Where { $_.IPAddress -match '\S+' } | Foreach { $Ips.$($_.IPAddress -join ', ' ) = $_.MACAddress } - $counter = 0 - $Ips.GetEnumerator() | Foreach { - $counter++; $data.("Net Address["+$counter+"]:") = '' + $_.Name + ' MAC['+$counter+']:' + $_.Value + '' - } - } - $wmi = $null - } - - $EnumeratedData = [system.String]::Join("`n", ($data.GetEnumerator()| Sort-Object 'Name' | Format-Table -HideTableHeaders -AutoSize | out-string)) - #$EnumeratedData = ($data.GetEnumerator()| Sort-Object 'Name' | format-table -HideTableHeaders | out-string) - If($DisplayOutbox){ - Write-OutputBox -OutputBoxMessage $EnumeratedData -Type " " -Object SysInfo - } Else{ - $data.GetEnumerator() | Sort-Object 'Name' | Format-Table -AutoSize - } - If($DisplayForm){$data.GetEnumerator() | Sort-Object 'Name' | Out-GridView -Title "$env:ComputerName Information"} -} - -function Clear-OutputBox { - $OutputBox.ResetText() -} - -function Write-OutputBox { - param( - [parameter(Mandatory=$true)] - [string]$OutputBoxMessage, - [ValidateSet(" ")] - [string]$Type, - [parameter(Mandatory=$true)] - [ValidateSet("SysInfo")] - [string]$Object - ) - Process { - if ($Object -like "SysInfo") { - if ($OutputBoxSysInfo.Text.Length -eq 0) { - $OutputBoxSysInfo.Text = "$($Type)$($OutputBoxMessage)" - [System.Windows.Forms.Application]::DoEvents() - $OutputBoxSysInfo.ScrollToCaret() - } - else { - $OutputBoxSysInfo.AppendText("`n$($Type)$($OutputBoxMessage)") - [System.Windows.Forms.Application]::DoEvents() - $OutputBoxSysInfo.ScrollToCaret() - } - } - } -} - - -##*============================================= -##* ASSEMBLIES -##*============================================= -Add-Type -AssemblyName "System.Drawing" -Add-Type -AssemblyName "System.Windows.Forms" - -$Global:ErrorProvider = New-Object System.Windows.Forms.ErrorProvider - - -$FormWidth = 805 -$FormHeight = 530 - -$Form = New-Object System.Windows.Forms.Form -$Form.Size = New-Object System.Drawing.Size($FormWidth,$FormHeight) -$Form.MinimumSize = New-Object System.Drawing.Size($FormWidth,$FormHeight) -$Form.MaximumSize = New-Object System.Drawing.Size($FormWidth,$FormHeight) -$Form.StartPosition = "CenterScreen" -$Form.SizeGripStyle = "Hide" -$Form.Text = "Enter Computer Name" -$Form.ControlBox = $false -$Form.TopMost = $true - -#Pictures -$DesktopBase64String = "iVBORw0KGgoAAAANSUhEUgAAANwAAAChCAYAAACs5tGeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ -bWFnZVJlYWR5ccllPAAAAw9pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp -bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 -eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1 -MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo -dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw -dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu -MC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVz -b3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1N -OkRvY3VtZW50SUQ9InhtcC5kaWQ6OEFEODc1QUMyMkVGMTFFNkE1Q0FGRjRCNEVGNTAyNzQiIHht -cE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OEFEODc1QUIyMkVGMTFFNkE1Q0FGRjRCNEVGNTAyNzQi -IHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIFdpbmRvd3MiPiA8eG1wTU06RGVy -aXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0iQzdBNjM1Qjc3QUFBNEFGMUFDNjIyRkE0QURDNDFG -OEEiIHN0UmVmOmRvY3VtZW50SUQ9IkM3QTYzNUI3N0FBQTRBRjFBQzYyMkZBNEFEQzQxRjhBIi8+ -IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5k -PSJyIj8+NL3INQAAVApJREFUeNrsnXd0Xdd15s9r6CDYADaAnQSrWERSJEX1ZstqsWXHju24yXHJ -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 -YII=" -$DesktopImageBytes = [Convert]::FromBase64String($DesktopBase64String) -$DesktopMemoryStream = New-Object -TypeName IO.MemoryStream($DesktopImageBytes, 0, $DesktopImageBytes.Length) -$DesktopMemoryStream.Write($DesktopImageBytes, 0, $DesktopImageBytes.Length) -$DesktopImage = [System.Drawing.Image]::FromStream($DesktopMemoryStream, $true) - -$LaptopBase64String = "iVBORw0KGgoAAAANSUhEUgAAANwAAAChCAYAAACs5tGeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ -bWFnZVJlYWR5ccllPAAAAw9pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp -bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 -eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1 -MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo -dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw -dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu -MC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVz -b3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1N -OkRvY3VtZW50SUQ9InhtcC5kaWQ6QkQyRThEMjIyMkVGMTFFNjkyQzhBNEU5M0FERkFBODQiIHht -cE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QkQyRThEMjEyMkVGMTFFNjkyQzhBNEU5M0FERkFBODQi -IHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIFdpbmRvd3MiPiA8eG1wTU06RGVy -aXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0iQzdBNjM1Qjc3QUFBNEFGMUFDNjIyRkE0QURDNDFG -OEEiIHN0UmVmOmRvY3VtZW50SUQ9IkM3QTYzNUI3N0FBQTRBRjFBQzYyMkZBNEFEQzQxRjhBIi8+ -IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5k -PSJyIj8++J8qKwAAQGhJREFUeNrsfVmsJsd13qle/u3uy+z7whFlUrIpi9YW2ZbsxDKSGM5iyIAh -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" -$LaptopImageBytes = [Convert]::FromBase64String($LaptopBase64String) -$LaptopMemoryStream = New-Object -TypeName IO.MemoryStream($LaptopImageBytes, 0, $LaptopImageBytes.Length) -$LaptopMemoryStream.Write($LaptopImageBytes, 0, $LaptopImageBytes.Length) -$LaptopImage = [System.Drawing.Image]::FromStream($LaptopMemoryStream, $true) - - -$VMBase64String = "iVBORw0KGgoAAAANSUhEUgAAANwAAAChCAYAAACs5tGeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ -bWFnZVJlYWR5ccllPAAAAw9pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp -bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 -eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1 -MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo -dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw -dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu -MC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVz -b3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1N -OkRvY3VtZW50SUQ9InhtcC5kaWQ6MTREQzU1NjgyMkYwMTFFNkJBMjNEMEYxODJFREZCOTQiIHht -cE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTREQzU1NjcyMkYwMTFFNkJBMjNEMEYxODJFREZCOTQi -IHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIFdpbmRvd3MiPiA8eG1wTU06RGVy -aXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0iQzdBNjM1Qjc3QUFBNEFGMUFDNjIyRkE0QURDNDFG -OEEiIHN0UmVmOmRvY3VtZW50SUQ9IkM3QTYzNUI3N0FBQTRBRjFBQzYyMkZBNEFEQzQxRjhBIi8+ -IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5k -PSJyIj8+LjFvdQAAF3hJREFUeNrsnVtsFFl6x7+y3W5jg425GDBgzHW4GZjhYs8soySwI8hESKNk -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" -$VMImageBytes = [Convert]::FromBase64String($VMBase64String) -$VMMemoryStream = New-Object -TypeName IO.MemoryStream($VMImageBytes, 0, $VMImageBytes.Length) -$VMMemoryStream.Write($VMImageBytes, 0, $VMImageBytes.Length) -$VMImage = [System.Drawing.Image]::FromStream($VMMemoryStream, $true) - -# PictureBoxes -$PBDELLCHASSIS = New-Object -TypeName System.Windows.Forms.PictureBox -$PBDELLCHASSIS.Location = New-Object -TypeName System.Drawing.Size(38,20) -$PBDELLCHASSIS.Size = New-Object -TypeName System.Drawing.Size(220,160) - -$LabelManufacturer = New-Object System.Windows.Forms.Label -$LabelManufacturer.Location = New-Object System.Drawing.Size(38,210) -$LabelManufacturer.Size = New-Object System.Drawing.Size(160,15) -$LabelManufacturer.Text = $Manufacturer - -$LabelModel = New-Object System.Windows.Forms.Label -$LabelModel.Location = New-Object System.Drawing.Size(38,235) -$LabelModel.Size = New-Object System.Drawing.Size(160,15) -$LabelModel.Text = $Model - -$LabelSerial = New-Object System.Windows.Forms.Label -$LabelSerial.Location = New-Object System.Drawing.Size(38,260) -$LabelSerial.Size = New-Object System.Drawing.Size(160,15) -$LabelSerial.Text = $SerialNumber - -$GBModel = New-Object System.Windows.Forms.GroupBox -$GBModel.Location = New-Object System.Drawing.Size(20,180) -$GBModel.Size = New-Object System.Drawing.Size(220,120) -$GBModel.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) -$GBModel.Text = "Model" - -$GBSystemInfo = New-Object System.Windows.Forms.GroupBox -$GBSystemInfo.Location = New-Object System.Drawing.Size(20,324) -$GBSystemInfo.Size = New-Object System.Drawing.Size(220,138) -$GBSystemInfo.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) -$GBSystemInfo.Text = "System Information" - -$OutputBoxSysInfo = New-Object System.Windows.Forms.RichTextBox -$OutputBoxSysInfo.Location = New-Object System.Drawing.Size(30,340) -$OutputBoxSysInfo.Size = New-Object System.Drawing.Size(200,115) -$OutputBoxSysInfo.BackColor = "white" -$OutputBoxSysInfo.ReadOnly = $true -$OutputBoxSysInfo.MultiLine = $True - -$TBComputerName = New-Object System.Windows.Forms.TextBox -$TBComputerName.Location = New-Object System.Drawing.Size(310,80) -$TBComputerName.Size = New-Object System.Drawing.Size(390,80) -$TBComputerName.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","18",[System.Drawing.FontStyle]::Bold) -$TBComputerName.TabIndex = "1" -$TBComputerName.Text = Get-OSDComputerName - -$GBComputerName = New-Object System.Windows.Forms.GroupBox -$GBComputerName.Location = New-Object System.Drawing.Size(290,50) -$GBComputerName.Size = New-Object System.Drawing.Size(440,90) -$GBComputerName.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","10",[System.Drawing.FontStyle]::Bold) -$GBComputerName.Text = "Computer name:" - -$ButtonOK = New-Object System.Windows.Forms.Button -$ButtonOK.Location = New-Object System.Drawing.Size(655,400) -$ButtonOK.Size = New-Object System.Drawing.Size(100,60) -$ButtonOK.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","10",[System.Drawing.FontStyle]::Bold) -$ButtonOK.Text = "Set" -$ButtonOK.TabIndex = "2" -$ButtonOK.Add_Click({Set-OSDComputerName}) - -$Form.KeyPreview = $True -$Form.Add_KeyDown({if ($_.KeyCode -eq "Enter"){Set-OSDComputerName}}) - -Load-Form \ No newline at end of file From d93015d2ae6f2c8c5e23cfd3e4674fbc9f313d22 Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Wed, 28 Mar 2018 23:05:22 -0400 Subject: [PATCH 03/21] Create README.md --- OSD-BIOSPrerequisitesTool/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 OSD-BIOSPrerequisitesTool/README.md diff --git a/OSD-BIOSPrerequisitesTool/README.md b/OSD-BIOSPrerequisitesTool/README.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/OSD-BIOSPrerequisitesTool/README.md @@ -0,0 +1 @@ + From 31ff464f24c11019e80080334997da343f5ad749 Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Wed, 28 Mar 2018 23:05:46 -0400 Subject: [PATCH 04/21] Add files via upload --- OSD-BIOSPrerequisitesTool/OSD-BIOSConfig.xml | 71 ++++++++++++++++++ .../OSD-BIOSPrerequisitesTool.ps1 | Bin 0 -> 202030 bytes 2 files changed, 71 insertions(+) create mode 100644 OSD-BIOSPrerequisitesTool/OSD-BIOSConfig.xml create mode 100644 OSD-BIOSPrerequisitesTool/OSD-BIOSPrerequisitesTool.ps1 diff --git a/OSD-BIOSPrerequisitesTool/OSD-BIOSConfig.xml b/OSD-BIOSPrerequisitesTool/OSD-BIOSConfig.xml new file mode 100644 index 0000000..f95fad9 --- /dev/null +++ b/OSD-BIOSPrerequisitesTool/OSD-BIOSConfig.xml @@ -0,0 +1,71 @@ + + + BIOS Prerequisites Tool + 1.0.2 + + False + True + + false + \\SERVERNAME\SHARE\Path-to-Config.xml + + + + $scriptRoot\PowershellModules\functions.ps1 + + + + + DellBIOSPowershell + Dell Inc. + D:\DeploymentShare\Scripts\TRIBOOT\PowershellModules\DellBIOSProvider\1.0 + D:\DeploymentShare\Scripts\TRIBOOT\PowershellModules\DellBIOSProviderX86\1.0 + + + Dell Command | Configure Toolkit + Dell Inc. + D:\DeploymentShare\Scripts\TRIBOOT\tools\Dell\X86_64 + D:\DeploymentShare\Scripts\TRIBOOT\tools\Dell\X86 + + + + + Vp/6rtVh5xVziVakKqKSlQ== + dLJ+P3TJ3kxFVxxlawpqzA== + az1IW4sWbG00Tc1tKXoLPA== + + + + + + + Microsoft Windows 10 Enterprise (1511) + 10586 + x64 + + + + + Dell Inc. + Latitude E7450 + A12 + + + Dell Inc. + Precision T5610 + A11 + + + Dell Inc. + Precision T7610 + A11 + + + System manufacturer + System Product Name + 1101 + + + + + \ No newline at end of file diff --git a/OSD-BIOSPrerequisitesTool/OSD-BIOSPrerequisitesTool.ps1 b/OSD-BIOSPrerequisitesTool/OSD-BIOSPrerequisitesTool.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..030b65b453ef9067837507af7a79d1e58315d7e1 GIT binary patch literal 202030 zcmeFa=~EoXv-iteorwGDd3$dJ2N5Cp*r3hYe2z~Xv}0>CAj!7u@FNK%A)ytt`SjpVe`jax=i+_cGJ=5K#nU|sE+nH^(e>v#E zp!ggydw=G=px+eCzs}sBSrN>SHJ1&|en;QF(hL?gr|mGC7c&oa?~_`7qo3=#`#{g# zQ#&wvTc6&Bryi))O?`TyevZz}&8+H~ZQa?>H;ej2@9)%>=RWEF7XvIE7XI#rUN-fY zu{QJ^R9e*&w12H9W_SCZRV%Pv-UkvO+7A8R4`cK6%b6#FeO{kqZ{BuRTtBOOHw4kL zT7s2Fp&!QrcP{GN7y7Yr7iTUB!pEU!=3*_Ob@!N#8yoY!#=9lFI3$MMtLk}2ytWyz z;7>TNUj;6{Jo8a);Ii$(*hgDtXBh5=svOIpTNTc?)ccO)$swH0{%^zQf;a?;dEA2v zE5hq5jj{JJff3#CQoYqF0Uto!=b9B9k@FT@aCFA7ztG@DX703@ojKCVEl0%Di{a@l zQEDS_edIas0r*Ta0Ldfa`CZT*@b$WWB2OVvv+Ad$w{iHga17LIYJr@!QL5yQi1jb^ z{1HLd`QT73;jMg?v0{

&wotOn~P)2 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 literal 0 HcmV?d00001 From 5dd7d8bf8fe91a88f37816383de661f82238f618 Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Wed, 28 Mar 2018 23:07:21 -0400 Subject: [PATCH 05/21] Create README --- Set-ComputerName/README | 1 + 1 file changed, 1 insertion(+) create mode 100644 Set-ComputerName/README diff --git a/Set-ComputerName/README b/Set-ComputerName/README new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Set-ComputerName/README @@ -0,0 +1 @@ + From 0a6a8e4b0293f1f490f80ffb438dfacdbd480864 Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Wed, 28 Mar 2018 23:07:36 -0400 Subject: [PATCH 06/21] Add files via upload --- Set-ComputerName/Set-OSDComputerName.ps1 | 1311 ++++++++++++++++++++++ 1 file changed, 1311 insertions(+) create mode 100644 Set-ComputerName/Set-OSDComputerName.ps1 diff --git a/Set-ComputerName/Set-OSDComputerName.ps1 b/Set-ComputerName/Set-OSDComputerName.ps1 new file mode 100644 index 0000000..17d1139 --- /dev/null +++ b/Set-ComputerName/Set-OSDComputerName.ps1 @@ -0,0 +1,1311 @@ +##*============================================= +##* VARIABLE DECLARATION +##*============================================= +$ComputerName = $env:COMPUTERNAME +$ComputerSystem = Get-WmiObject -Namespace "root\cimv2" -Class Win32_ComputerSystem +[string]$Manufacturer = $ComputerSystem.Manufacturer +[string]$Model = $ComputerSystem.Model +$BIOSInfo = get-wmiobject Win32_BIOS +[string]$SerialNumber = $BIOSInfo.SerialNumber + +[boolean]$Is64Bit = [boolean]((Get-WmiObject -Class 'Win32_Processor' | Where-Object { $_.DeviceID -eq 'CPU0' } | Select-Object -ExpandProperty 'AddressWidth') -eq 64) +If ($Is64Bit) { [string]$envOSArchitecture = '64-bit' } Else { [string]$envOSArchitecture = '32-bit' } + + +Function Load-Form +{ + $Form.Controls.AddRange(@( + $LabelManufacturer, + $LabelModel, + $LabelSerial, + + $GBModel, + $PBDELLCHASSIS, + + #$GBSystemInfo, + #$OutputBoxSysInfo, + + $TBComputerName, + $GBComputerName, + $ButtonOK + )) + #$Form.Add_Shown({Retrieve-SystemInfo -DisplayType "Basic" -DisplayOutbox -IgnorePing}) + $Form.Add_Shown({Get-SystemImage}) + $Form.Add_Shown({$Form.Activate()}) + [void] $Form.ShowDialog() + +} + +Function Get-SystemImage{ + $system = Get-WMIObject -class Win32_systemenclosure + $type = $system.chassistypes + + Switch ($Type) + { + "1" {$Type = "Other";$PBDELLCHASSIS.Image = $Null} + "2" {$Type = "Virtual Machine";$PBDELLCHASSIS.Image = $VMImage} + "3" {$Type = "Desktop";$PBDELLCHASSIS.Image = $DesktopImage} + "4" {$type = "Low Profile Desktop";$PBDELLCHASSIS.Image = $DesktopImage} + "5" {$type = "Pizza Box";$PBDELLCHASSIS.Image = $Null} + "6" {$type = "Mini Tower";$PBDELLCHASSIS.Image = $DesktopImage} + "7" {$type = "Tower";$PBDELLCHASSIS.Image = $DesktopImage} + "8" {$type = "Portable";$PBDELLCHASSIS.Image = $Null} + "9" {$type = "Laptop";$PBDELLCHASSIS.Image = $LaptopImage} + "10" {$type = "Notebook";$PBDELLCHASSIS.Image = $LaptopImage} + "11" {$type = "Handheld";$PBDELLCHASSIS.Image = $Null} + "12" {$type = "Docking Station";$PBDELLCHASSIS.Image = $Null} + "13" {$type = "All-in-One";$PBDELLCHASSIS.Image = $Null} + "14" {$type = "Sub-Notebook";$PBDELLCHASSIS.Image = $Null} + "15" {$type = "Space Saving";$PBDELLCHASSIS.Image = $Null} + "16" {$type = "Lunch Box";$PBDELLCHASSIS.Image = $Null} + "17" {$type = "Main System Chassis";$PBDELLCHASSIS.Image = $Null} + "18" {$type = "Expansion Chassis";$PBDELLCHASSIS.Image = $Null} + "19" {$type = "Sub-Chassis";$PBDELLCHASSIS.Image = $Null} + "20" {$type = "Bus Expansion Chassis";$PBDELLCHASSIS.Image = $Null} + "21" {$type = "Peripheral Chassis";$PBDELLCHASSIS.Image = $Null} + "22" {$type = "Storage Chassis";$PBDELLCHASSIS.Image = $Null} + "23" {$type = "Rack Mount Chassis";$PBDELLCHASSIS.Image = $Null} + "24" {$type = "Sealed-Case PC";$PBDELLCHASSIS.Image = $Null} + Default {$type = "Unknown";$PBDELLCHASSIS.Image = $Null} + } + $LabelModel.Visible = $true +} + +Function Get-OSDComputerName{ + If ($ComputerName.StartsWith('MININT')) { + If ($serialNumber.StartsWith('System')){ + return "[Unit]-[identifier]" + } + Else{ + return "[Unit]-" + $serialNumber + } + } + ElseIf ($ComputerName.StartsWith('MINWINPC')) { + If ($serialNumber.StartsWith('System')){ + return "[Unit]-[identifier]" + } + Else{ + return "[Unit]-" + $serialNumber + } + } + Else { + return $ComputerName + } +} +Function Set-OSDComputerName +{ + $ErrorProvider.Clear() + $ErrorProvider.SetIconPadding($GBComputerName, 10) + $ErrorProvider.SetIconAlignment($GBComputerName, "MiddleRight") + + if ($TBComputerName.Text.Length -eq 0) + { + $ErrorProvider.SetError($GBComputerName, "Please enter a computer name.") + } + + elseif ($TBComputerName.Text.Length -gt 15) + { + $ErrorProvider.SetError($GBComputerName, "Computer name cannot be more than 15 characters.") + } + + elseif ($TBComputerName.Text -eq $serialNumber) + { + $ErrorProvider.SetError($GBComputerName, "Computer name cannot be just the serial number.") + } + + #Validation Rule for computer names. + elseif ($TBComputerName.Text -match "^[-_]|[^a-zA-Z0-9-_]") + { + $ErrorProvider.SetError($GBComputerName, "Computer name invalid, please correct the computer name.") + } + + else + { + $OSDComputerName = $TBComputerName.Text.ToUpper() + $TSEnv = New-Object -COMObject Microsoft.SMS.TSEnvironment + $TSEnv.Value("OSDComputerName") = "$($OSDComputerName)" + $Form.Close() + } +} + +Function Retrieve-SystemInfo + <# + .SYNOPSIS + Get Complete details of any server Local or remote + .DESCRIPTION + This function uses WMI class to connect to remote machine and get all related details + .PARAMETER COMPUTERNAMES + Just Pass computer name as Its parameter + .EXAMPLE + Retrieve-SystemInfo + .EXAMPLE + Retrieve-SystemInfo -ComputerName HQSPDBSP01 + .NOTES + To get help: + Get-Help Retrieve-SystemInfo + .LINK + http://sqlpowershell.wordpress.com + #> + + { + param( + [ValidateSet("Detail","Basic","NetInfo")] + [string]$DisplayType = "Detail", + [switch] $DisplayForm = $false, + [switch] $DisplayOutbox = $false, + [switch] $IgnorePing + ) + + # Declare main data hash to be populated later + $data = @{} + $data.' Computer Name:' = $env:ComputerName + + If($DisplayType -eq "Detail"){ + # Do a DNS lookup with a .NET class method. Suppress error messages. + $ErrorActionPreference = 'SilentlyContinue' + if ( $ips = [System.Net.Dns]::GetHostAddresses($env:ComputerName) | foreach { $_.IPAddressToString } ) { + $data.'IP Address(es) from DNS' = ($ips -join ', ') + } + else { + $data.'IP Address from DNS' = 'Could not resolve' + } + # Make errors visible again + $ErrorActionPreference = 'Continue' + + # We'll assume no ping reply means it's dead. Try this anyway if -IgnorePing is specified + if ($ping -or $ignorePing) { + $data.'WMI Data Collection Attempt' = 'Yes (ping reply or -IgnorePing)' + + # Get various info from the ComputerSystem WMI class + if ($wmi = Get-WmiObject -Class Win32_ComputerSystem -ErrorAction SilentlyContinue) { + $data.'Computer Hardware Manufacturer' = $wmi.Manufacturer + $data.'Computer Hardware Model' = $wmi.Model + $data.'Memory Physical in MB' = ($wmi.TotalPhysicalMemory/1MB).ToString('N') + $data.'Logged On User' = $wmi.Username + } + $wmi = $null + + # Get the free/total disk space from local disks (DriveType 3) + if ($wmi = Get-WmiObject -Class Win32_LogicalDisk -Filter 'DriveType=3' -ErrorAction SilentlyContinue) { + $wmi | Select 'DeviceID', 'Size', 'FreeSpace' | Foreach { + $data."Local disk $($_.DeviceID)" = ('' + ($_.FreeSpace/1MB).ToString('N') + ' MB free of ' + ($_.Size/1MB).ToString('N') + ' MB total space with ' + ($_.Size/1MB - $_.FreeSpace/1MB).ToString('N') +' MB Used Space') + } + } + $wmi = $null + + # Get IP addresses from all local network adapters through WMI + if ($wmi = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ErrorAction SilentlyContinue) { + $Ips = @{} + $wmi | Where { $_.IPAddress -match '\S+' } | Foreach { $Ips.$($_.IPAddress -join ', ') = $_.MACAddress } + $counter = 0 + $Ips.GetEnumerator() | Foreach { + $counter++; $data."IP Address $counter" = '' + $_.Name + ' (MAC: ' + $_.Value + ')' + } + } + $wmi = $null + + # Get CPU information with WMI + if ($wmi = Get-WmiObject -Class Win32_Processor -ErrorAction SilentlyContinue) { + $wmi | Foreach { + $maxClockSpeed = $_.MaxClockSpeed + $numberOfCores += $_.NumberOfCores + $description = $_.Description + $numberOfLogProc += $_.NumberOfLogicalProcessors + $socketDesignation = $_.SocketDesignation + $status = $_.Status + $manufacturer = $_.Manufacturer + $name = $_.Name + } + $data.'CPU Clock Speed' = $maxClockSpeed + $data.'CPU Cores' = $numberOfCores + $data.'CPU Description' = $description + $data.'CPU Logical Processors' = $numberOfLogProc + $data.'CPU Socket' = $socketDesignation + $data.'CPU Status' = $status + $data.'CPU Manufacturer' = $manufacturer + $data.'CPU Name' = $name -replace '\s+', ' ' + } + $wmi = $null + + # Get BIOS info from WMI + if ($wmi = Get-WmiObject -Class Win32_Bios -ErrorAction SilentlyContinue) { + $data.'BIOS Manufacturer' = $wmi.Manufacturer + $data.'BIOS Name' = $wmi.Name + $data.'BIOS Version' = $wmi.Version + $data.'BIOS SM Version:' = $wmi.SMBIOSBIOSVersion + } + $wmi = $null + + # Get operating system info from WMI + if ($wmi = Get-WmiObject -Class Win32_OperatingSystem -ErrorAction SilentlyContinue) { + $data.'OS Boot Time' = $wmi.ConvertToDateTime($wmi.LastBootUpTime) + $data.'OS System Drive' = $wmi.SystemDrive + $data.'OS System Device' = $wmi.SystemDevice + $data.'OS Language ' = $wmi.OSLanguage + $data.'OS Version' = $wmi.Version + $data.'OS Windows dir' = $wmi.WindowsDirectory + $data.'OS Name' = $wmi.Caption + $data.'OS Install Date' = $wmi.ConvertToDateTime($wmi.InstallDate) + $data.'OS Service Pack' = [string]$wmi.ServicePackMajorVersion + '.' + $wmi.ServicePackMinorVersion + } + # Scan for open ports + $ports = @{ + 'File shares/RPC' = '139' ; + 'File shares' = '445' ; + 'RDP' = '3389'; + #'Zenworks' = '1761'; + } + foreach ($service in $ports.Keys) { + $socket = New-Object Net.Sockets.TcpClient + # Suppress error messages + $ErrorActionPreference = 'SilentlyContinue' + # Try to connect + $socket.Connect($env:ComputerName, $ports.$service) + # Make error messages visible again + $ErrorActionPreference = 'Continue' + if ($socket.Connected) { + $data."Port $($ports.$service) ($service)" = 'Open' + $socket.Close() + } + else { + $data."Port $($ports.$service) ($service)" = 'Closed or filtered' + } + $socket = $null + } + } + else { + $data.'WMI Data Collected' = 'No (no ping reply and -IgnorePing not specified)' + } + $wmi = $null + + if ($wmi = Get-WmiObject -Class Win32_OperatingSystem -ErrorAction SilentlyContinue| Select-Object Name, TotalVisibleMemorySize, FreePhysicalMemory,TotalVirtualMemorySize,FreeVirtualMemory,FreeSpaceInPagingFiles,NumberofProcesses,NumberOfUsers ) { + $wmi | Foreach { + $TotalRAM = $_.TotalVisibleMemorySize/1MB + $FreeRAM = $_.FreePhysicalMemory/1MB + $UsedRAM = $_.TotalVisibleMemorySize/1MB - $_.FreePhysicalMemory/1MB + $TotalRAM = [Math]::Round($TotalRAM, 2) + $FreeRAM = [Math]::Round($FreeRAM, 2) + $UsedRAM = [Math]::Round($UsedRAM, 2) + $RAMPercentFree = ($FreeRAM / $TotalRAM) * 100 + $RAMPercentFree = [Math]::Round($RAMPercentFree, 2) + $TotalVirtualMemorySize = [Math]::Round($_.TotalVirtualMemorySize/1MB, 3) + $FreeVirtualMemory = [Math]::Round($_.FreeVirtualMemory/1MB, 3) + $FreeSpaceInPagingFiles = [Math]::Round($_.FreeSpaceInPagingFiles/1MB, 3) + $NumberofProcesses = $_.NumberofProcesses + $NumberOfUsers = $_.NumberOfUsers + } + $data.'Memory - Total RAM GB ' = $TotalRAM + $data.'Memory - RAM Free GB' = $FreeRAM + $data.'Memory - RAM Used GB' = $UsedRAM + $data.'Memory - Percentage Free'= $RAMPercentFree + $data.'Memory - TotalVirtualMemorySize' = $TotalVirtualMemorySize + $data.'Memory - FreeVirtualMemory' = $FreeVirtualMemory + $data.'Memory - FreeSpaceInPagingFiles' = $FreeSpaceInPagingFiles + $data.'NumberofProcesses'= $NumberofProcesses + $data.'NumberOfUsers' = $NumberOfUsers -replace '\s+', ' ' + } + # Output data + "#"*80 + "OS Complete Information" + "Generated $(get-date)" + "Generated from $(gc env:computername)" + "#"*80 + + } ElseIf ($DisplayType -eq "NetInfo"){ + + } Else { + # Get operating system info from WMI + if ($wmi = Get-WmiObject -Class Win32_OperatingSystem -ErrorAction SilentlyContinue) { + If(!$wmi.Caption){$Caption="WinPE"; $Name = "PE:"}Else{$Caption=$wmi.Caption; $Name = "OS:"} + $data." $Name" = "$Caption ("+$wmi.Version+")" + } + + # Get BIOS info from WMI + if ($wmi = Get-WmiObject -Class Win32_Bios -ErrorAction SilentlyContinue) { + $data.'BIOS Version:' = $wmi.SMBIOSBIOSVersion + $data.'Serial Number:' = $wmi.SerialNumber + } + $wmi = $null + + if ($wmi = Get-WmiObject -Class Win32_ComputerSystem -ErrorAction SilentlyContinue) { + $data.'Manufacturer:' = $wmi.Manufacturer + $data.'Model:' = $wmi.Model + } + $wmi = $null + + # Get IP addresses from all local network adapters through WMI + if ($wmi = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ErrorAction SilentlyContinue) { + $Ips = @{} + $wmi | Where { $_.IPAddress -match '\S+' } | Foreach { $Ips.$($_.IPAddress -join ', ' ) = $_.MACAddress } + $counter = 0 + $Ips.GetEnumerator() | Foreach { + $counter++; $data.("Net Address["+$counter+"]:") = '' + $_.Name + ' MAC['+$counter+']:' + $_.Value + '' + } + } + $wmi = $null + } + + $EnumeratedData = [system.String]::Join("`n", ($data.GetEnumerator()| Sort-Object 'Name' | Format-Table -HideTableHeaders -AutoSize | out-string)) + #$EnumeratedData = ($data.GetEnumerator()| Sort-Object 'Name' | format-table -HideTableHeaders | out-string) + If($DisplayOutbox){ + Write-OutputBox -OutputBoxMessage $EnumeratedData -Type " " -Object SysInfo + } Else{ + $data.GetEnumerator() | Sort-Object 'Name' | Format-Table -AutoSize + } + If($DisplayForm){$data.GetEnumerator() | Sort-Object 'Name' | Out-GridView -Title "$env:ComputerName Information"} +} + +function Clear-OutputBox { + $OutputBox.ResetText() +} + +function Write-OutputBox { + param( + [parameter(Mandatory=$true)] + [string]$OutputBoxMessage, + [ValidateSet(" ")] + [string]$Type, + [parameter(Mandatory=$true)] + [ValidateSet("SysInfo")] + [string]$Object + ) + Process { + if ($Object -like "SysInfo") { + if ($OutputBoxSysInfo.Text.Length -eq 0) { + $OutputBoxSysInfo.Text = "$($Type)$($OutputBoxMessage)" + [System.Windows.Forms.Application]::DoEvents() + $OutputBoxSysInfo.ScrollToCaret() + } + else { + $OutputBoxSysInfo.AppendText("`n$($Type)$($OutputBoxMessage)") + [System.Windows.Forms.Application]::DoEvents() + $OutputBoxSysInfo.ScrollToCaret() + } + } + } +} + + +##*============================================= +##* ASSEMBLIES +##*============================================= +Add-Type -AssemblyName "System.Drawing" +Add-Type -AssemblyName "System.Windows.Forms" + +$Global:ErrorProvider = New-Object System.Windows.Forms.ErrorProvider + + +$FormWidth = 805 +$FormHeight = 530 + +$Form = New-Object System.Windows.Forms.Form +$Form.Size = New-Object System.Drawing.Size($FormWidth,$FormHeight) +$Form.MinimumSize = New-Object System.Drawing.Size($FormWidth,$FormHeight) +$Form.MaximumSize = New-Object System.Drawing.Size($FormWidth,$FormHeight) +$Form.StartPosition = "CenterScreen" +$Form.SizeGripStyle = "Hide" +$Form.Text = "Enter Computer Name" +$Form.ControlBox = $false +$Form.TopMost = $true + +#Pictures +$DesktopBase64String = "iVBORw0KGgoAAAANSUhEUgAAANwAAAChCAYAAACs5tGeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ +bWFnZVJlYWR5ccllPAAAAw9pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp +bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 +eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1 +MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo +dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw +dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu +MC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVz +b3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1N +OkRvY3VtZW50SUQ9InhtcC5kaWQ6OEFEODc1QUMyMkVGMTFFNkE1Q0FGRjRCNEVGNTAyNzQiIHht +cE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OEFEODc1QUIyMkVGMTFFNkE1Q0FGRjRCNEVGNTAyNzQi +IHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIFdpbmRvd3MiPiA8eG1wTU06RGVy +aXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0iQzdBNjM1Qjc3QUFBNEFGMUFDNjIyRkE0QURDNDFG +OEEiIHN0UmVmOmRvY3VtZW50SUQ9IkM3QTYzNUI3N0FBQTRBRjFBQzYyMkZBNEFEQzQxRjhBIi8+ +IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5k +PSJyIj8+NL3INQAAVApJREFUeNrsnXd0Xdd15s9r6CDYADaAnQSrWERSJEX1ZstqsWXHju24yXHJ +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 +YII=" +$DesktopImageBytes = [Convert]::FromBase64String($DesktopBase64String) +$DesktopMemoryStream = New-Object -TypeName IO.MemoryStream($DesktopImageBytes, 0, $DesktopImageBytes.Length) +$DesktopMemoryStream.Write($DesktopImageBytes, 0, $DesktopImageBytes.Length) +$DesktopImage = [System.Drawing.Image]::FromStream($DesktopMemoryStream, $true) + +$LaptopBase64String = "iVBORw0KGgoAAAANSUhEUgAAANwAAAChCAYAAACs5tGeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ +bWFnZVJlYWR5ccllPAAAAw9pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp +bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 +eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1 +MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo +dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw +dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu +MC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVz +b3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1N +OkRvY3VtZW50SUQ9InhtcC5kaWQ6QkQyRThEMjIyMkVGMTFFNjkyQzhBNEU5M0FERkFBODQiIHht +cE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QkQyRThEMjEyMkVGMTFFNjkyQzhBNEU5M0FERkFBODQi +IHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIFdpbmRvd3MiPiA8eG1wTU06RGVy +aXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0iQzdBNjM1Qjc3QUFBNEFGMUFDNjIyRkE0QURDNDFG +OEEiIHN0UmVmOmRvY3VtZW50SUQ9IkM3QTYzNUI3N0FBQTRBRjFBQzYyMkZBNEFEQzQxRjhBIi8+ +IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5k +PSJyIj8++J8qKwAAQGhJREFUeNrsfVmsJsd13qle/u3uy+z7whFlUrIpi9YW2ZbsxDKSGM5iyIAh +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" +$LaptopImageBytes = [Convert]::FromBase64String($LaptopBase64String) +$LaptopMemoryStream = New-Object -TypeName IO.MemoryStream($LaptopImageBytes, 0, $LaptopImageBytes.Length) +$LaptopMemoryStream.Write($LaptopImageBytes, 0, $LaptopImageBytes.Length) +$LaptopImage = [System.Drawing.Image]::FromStream($LaptopMemoryStream, $true) + + +$VMBase64String = "iVBORw0KGgoAAAANSUhEUgAAANwAAAChCAYAAACs5tGeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ +bWFnZVJlYWR5ccllPAAAAw9pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp +bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 +eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1 +MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo +dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw +dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu +MC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVz +b3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1N +OkRvY3VtZW50SUQ9InhtcC5kaWQ6MTREQzU1NjgyMkYwMTFFNkJBMjNEMEYxODJFREZCOTQiIHht +cE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTREQzU1NjcyMkYwMTFFNkJBMjNEMEYxODJFREZCOTQi +IHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIFdpbmRvd3MiPiA8eG1wTU06RGVy +aXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0iQzdBNjM1Qjc3QUFBNEFGMUFDNjIyRkE0QURDNDFG +OEEiIHN0UmVmOmRvY3VtZW50SUQ9IkM3QTYzNUI3N0FBQTRBRjFBQzYyMkZBNEFEQzQxRjhBIi8+ +IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5k +PSJyIj8+LjFvdQAAF3hJREFUeNrsnVtsFFl6x7+y3W5jg425GDBgzHW4GZjhYs8soySwI8hESKNk +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" +$VMImageBytes = [Convert]::FromBase64String($VMBase64String) +$VMMemoryStream = New-Object -TypeName IO.MemoryStream($VMImageBytes, 0, $VMImageBytes.Length) +$VMMemoryStream.Write($VMImageBytes, 0, $VMImageBytes.Length) +$VMImage = [System.Drawing.Image]::FromStream($VMMemoryStream, $true) + +# PictureBoxes +$PBDELLCHASSIS = New-Object -TypeName System.Windows.Forms.PictureBox +$PBDELLCHASSIS.Location = New-Object -TypeName System.Drawing.Size(38,20) +$PBDELLCHASSIS.Size = New-Object -TypeName System.Drawing.Size(220,160) + +$LabelManufacturer = New-Object System.Windows.Forms.Label +$LabelManufacturer.Location = New-Object System.Drawing.Size(38,210) +$LabelManufacturer.Size = New-Object System.Drawing.Size(160,15) +$LabelManufacturer.Text = $Manufacturer + +$LabelModel = New-Object System.Windows.Forms.Label +$LabelModel.Location = New-Object System.Drawing.Size(38,235) +$LabelModel.Size = New-Object System.Drawing.Size(160,15) +$LabelModel.Text = $Model + +$LabelSerial = New-Object System.Windows.Forms.Label +$LabelSerial.Location = New-Object System.Drawing.Size(38,260) +$LabelSerial.Size = New-Object System.Drawing.Size(160,15) +$LabelSerial.Text = $SerialNumber + +$GBModel = New-Object System.Windows.Forms.GroupBox +$GBModel.Location = New-Object System.Drawing.Size(20,180) +$GBModel.Size = New-Object System.Drawing.Size(220,120) +$GBModel.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) +$GBModel.Text = "Model" + +$GBSystemInfo = New-Object System.Windows.Forms.GroupBox +$GBSystemInfo.Location = New-Object System.Drawing.Size(20,324) +$GBSystemInfo.Size = New-Object System.Drawing.Size(220,138) +$GBSystemInfo.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) +$GBSystemInfo.Text = "System Information" + +$OutputBoxSysInfo = New-Object System.Windows.Forms.RichTextBox +$OutputBoxSysInfo.Location = New-Object System.Drawing.Size(30,340) +$OutputBoxSysInfo.Size = New-Object System.Drawing.Size(200,115) +$OutputBoxSysInfo.BackColor = "white" +$OutputBoxSysInfo.ReadOnly = $true +$OutputBoxSysInfo.MultiLine = $True + +$TBComputerName = New-Object System.Windows.Forms.TextBox +$TBComputerName.Location = New-Object System.Drawing.Size(310,80) +$TBComputerName.Size = New-Object System.Drawing.Size(390,80) +$TBComputerName.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","18",[System.Drawing.FontStyle]::Bold) +$TBComputerName.TabIndex = "1" +$TBComputerName.Text = Get-OSDComputerName + +$GBComputerName = New-Object System.Windows.Forms.GroupBox +$GBComputerName.Location = New-Object System.Drawing.Size(290,50) +$GBComputerName.Size = New-Object System.Drawing.Size(440,90) +$GBComputerName.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","10",[System.Drawing.FontStyle]::Bold) +$GBComputerName.Text = "Computer name:" + +$ButtonOK = New-Object System.Windows.Forms.Button +$ButtonOK.Location = New-Object System.Drawing.Size(655,400) +$ButtonOK.Size = New-Object System.Drawing.Size(100,60) +$ButtonOK.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","10",[System.Drawing.FontStyle]::Bold) +$ButtonOK.Text = "Set" +$ButtonOK.TabIndex = "2" +$ButtonOK.Add_Click({Set-OSDComputerName}) + +$Form.KeyPreview = $True +$Form.Add_KeyDown({if ($_.KeyCode -eq "Enter"){Set-OSDComputerName}}) + +Load-Form \ No newline at end of file From de12a387ade697821938313786d0204396bf1752 Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Wed, 28 Mar 2018 23:18:55 -0400 Subject: [PATCH 07/21] Create REA --- BIOSPrerequisitesTool/REA | 1 + 1 file changed, 1 insertion(+) create mode 100644 BIOSPrerequisitesTool/REA diff --git a/BIOSPrerequisitesTool/REA b/BIOSPrerequisitesTool/REA new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/BIOSPrerequisitesTool/REA @@ -0,0 +1 @@ + From dbccee054c816053f6a570b92e57df1a1dc2a2c7 Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Wed, 28 Mar 2018 23:19:41 -0400 Subject: [PATCH 08/21] Rename OSD-BIOSPrerequisitesTool/OSD-BIOSConfig.xml to BIOSPrerequisitesTool/OSD-BIOSConfig.xml --- .../OSD-BIOSConfig.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename {OSD-BIOSPrerequisitesTool => BIOSPrerequisitesTool}/OSD-BIOSConfig.xml (96%) diff --git a/OSD-BIOSPrerequisitesTool/OSD-BIOSConfig.xml b/BIOSPrerequisitesTool/OSD-BIOSConfig.xml similarity index 96% rename from OSD-BIOSPrerequisitesTool/OSD-BIOSConfig.xml rename to BIOSPrerequisitesTool/OSD-BIOSConfig.xml index f95fad9..d98a90d 100644 --- a/OSD-BIOSPrerequisitesTool/OSD-BIOSConfig.xml +++ b/BIOSPrerequisitesTool/OSD-BIOSConfig.xml @@ -68,4 +68,4 @@ - \ No newline at end of file + From 43c1d432ed2ca5821599dadddf5fabf4a1d54109 Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Wed, 28 Mar 2018 23:20:10 -0400 Subject: [PATCH 09/21] Rename OSD-BIOSPrerequisitesTool/OSD-BIOSPrerequisitesTool.ps1 to BIOSPrerequisitesTool/OSD-BIOSPrerequisitesTool.ps1 --- .../OSD-BIOSPrerequisitesTool.ps1 | 2264 +++++++++++++++++ .../OSD-BIOSPrerequisitesTool.ps1 | Bin 202030 -> 0 bytes 2 files changed, 2264 insertions(+) create mode 100644 BIOSPrerequisitesTool/OSD-BIOSPrerequisitesTool.ps1 delete mode 100644 OSD-BIOSPrerequisitesTool/OSD-BIOSPrerequisitesTool.ps1 diff --git a/BIOSPrerequisitesTool/OSD-BIOSPrerequisitesTool.ps1 b/BIOSPrerequisitesTool/OSD-BIOSPrerequisitesTool.ps1 new file mode 100644 index 0000000..ced8e67 --- /dev/null +++ b/BIOSPrerequisitesTool/OSD-BIOSPrerequisitesTool.ps1 @@ -0,0 +1,2264 @@ +#======================================================================== +# +# Created: 2016-04-22 +# Author: Richard tracy +# Idea From: Nickolaj Andersen +# +#======================================================================== +[void][Reflection.Assembly]::LoadWithPartialName("System.Security") +## Variables: Script Name and Script Paths +[string]$scriptPath = $MyInvocation.MyCommand.Definition +[string]$scriptName = [IO.Path]::GetFileNameWithoutExtension($scriptPath) +[string]$scriptFileName = Split-Path -Path $scriptPath -Leaf +[string]$scriptRoot = Split-Path -Path $scriptPath -Parent +[string]$invokingScript = (Get-Variable -Name 'MyInvocation').Value.ScriptName + +#include additional extensions +If (Test-Path -Path ($scriptRoot + '.\PowershellModules\functions.ps1')){ +. ($scriptRoot + '.\PowershellModules\functions.ps1') +} +# Get the invoking script directory +If ($invokingScript) { + # If this script was invoked by another script + [string]$scriptParentPath = Split-Path -Path $invokingScript -Parent +} +Else { + # If this script was not invoked by another script, fall back to the directory one level above this script + [string]$scriptParentPath = (Get-Item -LiteralPath $scriptRoot).Parent.FullName +} + +##*============================================= +##* READ CONFIG.XML FILE +##*============================================= +[string]$ConfigFile = Join-Path -Path $scriptRoot -ChildPath 'OSD-BIOSConfig.xml' +[xml]$XmlConfigFile = Get-Content $ConfigFile +$UseRemoteInstead = $XmlConfigFile.app.configs.useRemote.remote +If ($UseRemoteInstead -eq $true){ + $remoteConfig = $XmlConfigFile.app.configs.useRemote.path + If (Test-Path $remoteConfig){ + [xml]$XmlConfigFile = Get-Content $remoteConfig + } +} +$apptitle = $XmlConfigFile.app.title +$appversion = $XmlConfigFile.app.version +$TabPageConfigs = $XmlConfigFile.app.configs.pagetabs.tab + +$SupportedOperatingSystems = $XmlConfigFile.app.supported.OSbuilds.OS +$MinimumOS = $SupportedOperatingSystems | Where-Object id -eq "minimum" +[int]$MinimumOSversion = $MinimumOS.version + +$SupportedSystems = $XmlConfigFile.app.supported.hardwarePlatforms.system +$SupportedManufacturers = $SupportedSystems.manufacturer | sort -Unique +$SupportedModels = $SupportedSystems.model + +[Xml.XmlElement]$XMLAdditionalProviders = $XmlConfigFile.app.configs.additionalProviders +[array]$DellProviders = $XMLAdditionalProviders.provider | Where-Object {$_.platformsupport -eq "Dell Inc."} +Foreach ($provider in $DellProviders){ + #write-host $provider.name + #write-host $provider.enabled + If ($provider.name -eq "Dell Command | Configure Toolkit"){ + If ($provider.enabled -eq "true") { + $UseDellCCTK = $true + }Else { + $UseDellCCTK = $false + } + + [string]$DellCCTKPath = $provider.path_x64 + [string]$DellCCTKPathx86 = $provider.path_x86 + + } + If ($provider.name -eq "DellBIOSPowershell"){ + If ($provider.enabled -eq "true") { + $UseDellPSProvider = $true + }Else { + $UseDellPSProvider = $false + } + [string]$DellPSProviderPath = $provider.path_x64 + [string]$DellPSProviderPathX86 = $provider.path_x86 + } + +} + + +#[array]$BIOSKnownUsedpwd = @($XmlConfigFile.app.configs.knownBIOSPasswords.password) +[array]$BIOSKnownUsedpwd = @($XmlConfigFile.app.configs.knownBIOSPasswords.cryptpassword) +#to encrypt load Encrypt-String and then run it, copy the results in config file +#Encrypt-String -String -Passphrase "" + +If ($XmlConfigFile.app.configs.debugmode -eq 'true'){ + [Boolean]$Global:LogDebugMode = $True +} Else { + [Boolean]$Global:LogDebugMode = $False +} + +If ($XmlConfigFile.app.configs.alwaysCheckBIOS -eq 'true'){ + [Boolean]$Global:IgnorePrereqs = $true +} Else { + [Boolean]$Global:IgnorePrereqs = $false +} +##*============================================= +##* VARIABLE DECLARATION +##*============================================= + +$Global:SMCSharedData = 0 +$ComputerName = $env:COMPUTERNAME +$ComputerSystem = Get-WmiObject -Namespace "root\cimv2" -Class Win32_ComputerSystem +[string]$Manufacturer = $ComputerSystem.Manufacturer +[string]$Model = $ComputerSystem.Model +[int]$OSProductType = Get-WmiObject -Namespace "root\cimv2" -Class Win32_OperatingSystem | Select-Object -ExpandProperty ProductType +[string]$OSCaption = Get-WmiObject -Namespace "root\cimv2" -Class Win32_OperatingSystem | Select-Object -ExpandProperty Caption +[int]$OSMajor = ([System.Environment]::OSVersion.Version).Major +[int]$OSBuildNumber = ([System.Environment]::OSVersion.Version).Build + + +[boolean]$Is64Bit = [boolean]((Get-WmiObject -Class 'Win32_Processor' | Where-Object { $_.DeviceID -eq 'CPU0' } | Select-Object -ExpandProperty 'AddressWidth') -eq 64) +If ($Is64Bit) { [string]$envOSArchitecture = '64-bit' } Else { [string]$envOSArchitecture = '32-bit' } + + +##*============================================= +##* FUNCTIONS +##*============================================= +function Load-Form { + $Form.Controls.Add($TabControl) + $TabControl.Controls.AddRange(@( + $TabSHBPage, + $TabLoggingPage + )) + $TabSHBPage.Controls.AddRange(@( + $ProgressBar, + $LabelHeader, + $LabelSupportedModel, + $LabelSupportedOS, + #$LabelPowerShell, + $LabelUEFI, + $OutputBoxSysInfo, + + $LabelBIOSRevision, + $LabelBIOSPassword, + $LabelBIOSTPM, + $LabelBIOSTPMEnabled, + $LabelBIOSTPMActive, + $LabelBIOSVT, + $LabelBIOSVTTE, + $LabelBIOSVTDirectIO, + $LabelLegacyROM, + $LabelSecureBoot, + + #$PBReboot, + $PBModel, + $PBOS, + #$PBPS, + $PBUEFI, + + #$GBReboot, + $GBModel, + $GBOS, + #$GBPS, + $GBUEFI, + + $PBBIOSRevision, + $PBBIOSPassword, + $PBBIOSTPM, + $PBBIOSTPMON, + $PBBIOSTPMACT, + $PBBIOSVT, + $PBBIOSVTDirectIO, + $PBBIOSVTTE, + $PBLEGACYOROM, + $PBSECUREBOOT, + + $LBOSVersions, + $GBOSVersion, + $GBSystemModel, + + $GBBIOSRevision, + $GBBIOSPassword, + $GBBIOSTPM, + $GBBIOSTPMON, + $GBBIOSTPMACT, + $GBBIOSVT, + $GBBIOSVTDirectIO, + $GBBIOSVTTE, + $GBLEGACYROM, + $GBSECUREBOOT, + + $GBBIOSInfo, + $GBTPMSettings, + $GBVTSettings, + $GBBootSettings, + + $CBPrerequisitesOverride, + $GBSystemValidation, + + #$CBContinueOverride, + $ButtonContinueExit + )) + $Form.Add_Shown({Retrieve-SystemInfo -DisplayType "Basic" -DisplayOutbox -IgnorePing}) + $Form.Add_Shown({Validate-RunChecks}) + $Form.Add_Shown({Validate-BIOSChecks}) + $Form.Add_Shown({$Form.Activate()}) + [void]$Form.ShowDialog() +} + +function Load-LoggingPage { + if (-not(($TabLoggingPage.Controls | Measure-Object).Count -ge 1)) { + $TabLoggingPage.Controls.Clear() + $TabLoggingPage.Controls.AddRange(@( + $OutputBoxLogging, + $ButtonExportLogging + )) + } + if ($ButtonExportLogging.Enabled -eq $false) { + $ButtonExportLogging.Enabled = $true + } +} + +function Interactive-TabPages { + param( + [parameter(Mandatory=$true)] + [ValidateSet("Enable","Disable")] + $Mode + ) + Begin { + $CurrentTabPage = $TabControl.SelectedTab.Name + switch ($Mode) { + "Enable" { $TabPageMode = $true } + "Disable" { $TabPageMode = $false } + } + $TabNameArrayList = New-Object -TypeName System.Collections.ArrayList + foreach ($TabNameArrayListObject in (($TabControl.TabPages.Name))) { + $TabNameArrayList.Add($TabNameArrayListObject) + } + } + Process { + foreach ($TabPageObject in $TabNameArrayList) { + if ($Mode -like "Disable") { + if ($CurrentTabPage -like "SHB") { + $TabLoggingPage.Enabled = $TabPageMode + } + } + else { + $TabSHBPage.Enabled = $TabPageMode + $TabLoggingPage.Enabled = $TabPageMode + } + } + } +} + +function Interactive-Buttons { + param( + [parameter(Mandatory=$true)] + [ValidateSet("Enable","Disable")] + $Mode, + [parameter(Mandatory=$true)] + [ValidateSet("Prerequisites","Validation")] + $Module + ) + Begin { + switch ($Mode) { + "Enable" { $TabPageButtonMode = $true } + "Disable" { $TabPageButtonMode = $false } + } + } + Process { + if ($Module -eq "Validation") { + foreach ($Control in $TabPageSiteRoles.Controls) { + if ($Control.GetType().ToString() -eq "System.Windows.Forms.ComboBox") { + $Control.Enabled = $TabPageButtonMode + } + } + } + if ($Module -eq "Prerequisites") { + foreach ($Control in $TabPageOther.Controls) { + if ($Control.GetType().ToString() -eq "System.Windows.Forms.CheckBox") { + $Control.Enabled = $TabPageRadioButtonMode + } + + } + } + } +} + +function Validate-RunChecks { + $ValidateCounter = 0 + <#if (Validate-PendingReboot) { + $ValidateCounter++ + }#> + if (Validate-System) { + $ValidateCounter++ + } + if (Validate-OSBuild) { + $ValidateCounter++ + } + <#if (Validate-PowerShellVer) { + $ValidateCounter++ + } + if (Validate-Elevated) { + $ValidateCounter++ + }#> + if (Validate-UEFICheck) { + $ValidateCounter++ + } + if ($ValidateCounter -ge 3) { + Interactive-TabPages -Mode Enable + Write-OutputBox -OutputBoxMessage "All validation checks passed successfully" -Type "INFO: " -Object Logging + $CBPrerequisitesOverride.Enabled = $false + } + else { + Interactive-TabPages -Mode Disable + Write-OutputBox -OutputBoxMessage "All validation checks did not pass successfully, remediate the errors and re-launch the tool or check the override checkbox to use the tool anyway" -Type "ERROR: " -Object Logging + } + If ($IgnorePrereqs){ + return $global:PreValidation = $true + } Else { + return $global:PreValidation = $ValidateCounter + } +} + +function Validate-BIOSChecks { + $ProgressBar.Value = 0 + $ProgressBar.Maximum = 11 + $ValidateCounter = 0 + $ProgressBar.PerformStep() + if (Load-SystemProvider) { + $ValidateCounter++ + } + $ProgressBar.PerformStep() + if (Validate-BIOSRevision) { + $ValidateCounter++ + } + $ProgressBar.PerformStep() + if (Validate-BIOSPassword) { + $ValidateCounter++ + } + $ProgressBar.PerformStep() + if (Validate-LegacyROM) { + $ValidateCounter++ + } + $ProgressBar.PerformStep() + if (Validate-SecureBoot) { + $ValidateCounter++ + } + $ProgressBar.PerformStep() + if (Validate-TPMModule) { + $ValidateCounter++ + } + $ProgressBar.PerformStep() + if (Validate-TPMEnabled) { + $ValidateCounter++ + } + $ProgressBar.PerformStep() + if (Validate-TPMActivated) { + $ValidateCounter++ + } + $ProgressBar.PerformStep() + if (Validate-VTFeature) { + $ValidateCounter++ + } + $ProgressBar.PerformStep() + if (Validate-VTDirectIO) { + $ValidateCounter++ + } + $ProgressBar.PerformStep() + if (Validate-VTTrustedExecution) { + $ValidateCounter++ + } + if ($ValidateCounter -ge 11) { + #Interactive-TabPages -Mode Enable + Write-OutputBox -OutputBoxMessage "BIOS checks passed successfully" -Type "INFO: " -Object Logging + $CBContinueOverride.Enabled = $false + } + else { + #Interactive-TabPages -Mode Disable + Write-OutputBox -OutputBoxMessage "BIOS checks did not pass successfully, system may not be compatible for Secure Host Baseline." -Type "ERROR: " -Object Logging + } +} + +Function Retrieve-SystemInfo + <# + .SYNOPSIS + Get Complete details of any server Local or remote + .DESCRIPTION + This function uses WMI class to connect to remote machine and get all related details + .PARAMETER COMPUTERNAMES + Just Pass computer name as Its parameter + .EXAMPLE + Retrieve-SystemInfo + .EXAMPLE + Retrieve-SystemInfo -ComputerName HQSPDBSP01 + .NOTES + To get help: + Get-Help Retrieve-SystemInfo + .LINK + http://sqlpowershell.wordpress.com + #> + + { + param( + [ValidateSet("Detail","Basic","NetInfo")] + [string]$DisplayType = "Detail", + [switch] $DisplayForm = $false, + [switch] $DisplayOutbox = $false, + [switch] $IgnorePing + ) + + # Declare main data hash to be populated later + $data = @{} + $data.' Computer Name:' = $env:ComputerName + + If($DisplayType -eq "Detail"){ + # Do a DNS lookup with a .NET class method. Suppress error messages. + $ErrorActionPreference = 'SilentlyContinue' + if ( $ips = [System.Net.Dns]::GetHostAddresses($env:ComputerName) | foreach { $_.IPAddressToString } ) { + $data.'IP Address(es) from DNS' = ($ips -join ', ') + } + else { + $data.'IP Address from DNS' = 'Could not resolve' + } + # Make errors visible again + $ErrorActionPreference = 'Continue' + + # We'll assume no ping reply means it's dead. Try this anyway if -IgnorePing is specified + if ($ping -or $ignorePing) { + $data.'WMI Data Collection Attempt' = 'Yes (ping reply or -IgnorePing)' + + # Get various info from the ComputerSystem WMI class + if ($wmi = Get-WmiObject -Class Win32_ComputerSystem -ErrorAction SilentlyContinue) { + $data.'Computer Hardware Manufacturer' = $wmi.Manufacturer + $data.'Computer Hardware Model' = $wmi.Model + $data.'Memory Physical in MB' = ($wmi.TotalPhysicalMemory/1MB).ToString('N') + $data.'Logged On User' = $wmi.Username + } + $wmi = $null + + # Get the free/total disk space from local disks (DriveType 3) + if ($wmi = Get-WmiObject -Class Win32_LogicalDisk -Filter 'DriveType=3' -ErrorAction SilentlyContinue) { + $wmi | Select 'DeviceID', 'Size', 'FreeSpace' | Foreach { + $data."Local disk $($_.DeviceID)" = ('' + ($_.FreeSpace/1MB).ToString('N') + ' MB free of ' + ($_.Size/1MB).ToString('N') + ' MB total space with ' + ($_.Size/1MB - $_.FreeSpace/1MB).ToString('N') +' MB Used Space') + } + } + $wmi = $null + + # Get IP addresses from all local network adapters through WMI + if ($wmi = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ErrorAction SilentlyContinue) { + $Ips = @{} + $wmi | Where { $_.IPAddress -match '\S+' } | Foreach { $Ips.$($_.IPAddress -join ', ') = $_.MACAddress } + $counter = 0 + $Ips.GetEnumerator() | Foreach { + $counter++; $data."IP Address $counter" = '' + $_.Name + ' (MAC: ' + $_.Value + ')' + } + } + $wmi = $null + + # Get CPU information with WMI + if ($wmi = Get-WmiObject -Class Win32_Processor -ErrorAction SilentlyContinue) { + $wmi | Foreach { + $maxClockSpeed = $_.MaxClockSpeed + $numberOfCores += $_.NumberOfCores + $description = $_.Description + $numberOfLogProc += $_.NumberOfLogicalProcessors + $socketDesignation = $_.SocketDesignation + $status = $_.Status + $manufacturer = $_.Manufacturer + $name = $_.Name + } + $data.'CPU Clock Speed' = $maxClockSpeed + $data.'CPU Cores' = $numberOfCores + $data.'CPU Description' = $description + $data.'CPU Logical Processors' = $numberOfLogProc + $data.'CPU Socket' = $socketDesignation + $data.'CPU Status' = $status + $data.'CPU Manufacturer' = $manufacturer + $data.'CPU Name' = $name -replace '\s+', ' ' + } + $wmi = $null + + # Get BIOS info from WMI + if ($wmi = Get-WmiObject -Class Win32_Bios -ErrorAction SilentlyContinue) { + $data.'BIOS Manufacturer' = $wmi.Manufacturer + $data.'BIOS Name' = $wmi.Name + $data.'BIOS Version' = $wmi.Version + $data.'BIOS SM Version:' = $wmi.SMBIOSBIOSVersion + } + $wmi = $null + + # Get operating system info from WMI + if ($wmi = Get-WmiObject -Class Win32_OperatingSystem -ErrorAction SilentlyContinue) { + $data.'OS Boot Time' = $wmi.ConvertToDateTime($wmi.LastBootUpTime) + $data.'OS System Drive' = $wmi.SystemDrive + $data.'OS System Device' = $wmi.SystemDevice + $data.'OS Language ' = $wmi.OSLanguage + $data.'OS Version' = $wmi.Version + $data.'OS Windows dir' = $wmi.WindowsDirectory + $data.'OS Name' = $wmi.Caption + $data.'OS Install Date' = $wmi.ConvertToDateTime($wmi.InstallDate) + $data.'OS Service Pack' = [string]$wmi.ServicePackMajorVersion + '.' + $wmi.ServicePackMinorVersion + } + # Scan for open ports + $ports = @{ + 'File shares/RPC' = '139' ; + 'File shares' = '445' ; + 'RDP' = '3389'; + #'Zenworks' = '1761'; + } + foreach ($service in $ports.Keys) { + $socket = New-Object Net.Sockets.TcpClient + # Suppress error messages + $ErrorActionPreference = 'SilentlyContinue' + # Try to connect + $socket.Connect($env:ComputerName, $ports.$service) + # Make error messages visible again + $ErrorActionPreference = 'Continue' + if ($socket.Connected) { + $data."Port $($ports.$service) ($service)" = 'Open' + $socket.Close() + } + else { + $data."Port $($ports.$service) ($service)" = 'Closed or filtered' + } + $socket = $null + } + } + else { + $data.'WMI Data Collected' = 'No (no ping reply and -IgnorePing not specified)' + } + $wmi = $null + + if ($wmi = Get-WmiObject -Class Win32_OperatingSystem -ErrorAction SilentlyContinue| Select-Object Name, TotalVisibleMemorySize, FreePhysicalMemory,TotalVirtualMemorySize,FreeVirtualMemory,FreeSpaceInPagingFiles,NumberofProcesses,NumberOfUsers ) { + $wmi | Foreach { + $TotalRAM = $_.TotalVisibleMemorySize/1MB + $FreeRAM = $_.FreePhysicalMemory/1MB + $UsedRAM = $_.TotalVisibleMemorySize/1MB - $_.FreePhysicalMemory/1MB + $TotalRAM = [Math]::Round($TotalRAM, 2) + $FreeRAM = [Math]::Round($FreeRAM, 2) + $UsedRAM = [Math]::Round($UsedRAM, 2) + $RAMPercentFree = ($FreeRAM / $TotalRAM) * 100 + $RAMPercentFree = [Math]::Round($RAMPercentFree, 2) + $TotalVirtualMemorySize = [Math]::Round($_.TotalVirtualMemorySize/1MB, 3) + $FreeVirtualMemory = [Math]::Round($_.FreeVirtualMemory/1MB, 3) + $FreeSpaceInPagingFiles = [Math]::Round($_.FreeSpaceInPagingFiles/1MB, 3) + $NumberofProcesses = $_.NumberofProcesses + $NumberOfUsers = $_.NumberOfUsers + } + $data.'Memory - Total RAM GB ' = $TotalRAM + $data.'Memory - RAM Free GB' = $FreeRAM + $data.'Memory - RAM Used GB' = $UsedRAM + $data.'Memory - Percentage Free'= $RAMPercentFree + $data.'Memory - TotalVirtualMemorySize' = $TotalVirtualMemorySize + $data.'Memory - FreeVirtualMemory' = $FreeVirtualMemory + $data.'Memory - FreeSpaceInPagingFiles' = $FreeSpaceInPagingFiles + $data.'NumberofProcesses'= $NumberofProcesses + $data.'NumberOfUsers' = $NumberOfUsers -replace '\s+', ' ' + } + # Output data + "#"*80 + "OS Complete Information" + "Generated $(get-date)" + "Generated from $(gc env:computername)" + "#"*80 + + } ElseIf ($DisplayType -eq "NetInfo"){ + + } Else { + # Get operating system info from WMI + if ($wmi = Get-WmiObject -Class Win32_OperatingSystem -ErrorAction SilentlyContinue) { + If(!$wmi.Caption){$Caption="WinPE"; $Name = "PE:"}Else{$Caption=$wmi.Caption; $Name = "OS:"} + $data." $Name" = "$Caption ("+$wmi.Version+")" + } + + # Get BIOS info from WMI + if ($wmi = Get-WmiObject -Class Win32_Bios -ErrorAction SilentlyContinue) { + $data.'BIOS Version:' = $wmi.SMBIOSBIOSVersion + } + $wmi = $null + + if ($wmi = Get-WmiObject -Class Win32_ComputerSystem -ErrorAction SilentlyContinue) { + $data.'Manufacturer:' = $wmi.Manufacturer + $data.'Model:' = $wmi.Model + } + $wmi = $null + + # Get IP addresses from all local network adapters through WMI + if ($wmi = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ErrorAction SilentlyContinue) { + $Ips = @{} + $wmi | Where { $_.IPAddress -match '\S+' } | Foreach { $Ips.$($_.IPAddress -join ', ' ) = $_.MACAddress } + $counter = 0 + $Ips.GetEnumerator() | Foreach { + $counter++; $data.("Net Address["+$counter+"]:") = '' + $_.Name + ' MAC['+$counter+']:' + $_.Value + '' + } + } + $wmi = $null + } + + $EnumeratedData = [system.String]::Join("`n", ($data.GetEnumerator()| Sort-Object 'Name' | Format-Table -HideTableHeaders -AutoSize | out-string)) + #$EnumeratedData = ($data.GetEnumerator()| Sort-Object 'Name' | format-table -HideTableHeaders | out-string) + If($DisplayOutbox){ + Write-OutputBox -OutputBoxMessage $EnumeratedData -Type " " -Object SysInfo + } Else{ + $data.GetEnumerator() | Sort-Object 'Name' | Format-Table -AutoSize + } + If($DisplayForm){$data.GetEnumerator() | Sort-Object 'Name' | Out-GridView -Title "$env:ComputerName Information"} +} + +function Load-SystemProvider { + If ($Manufacturer -eq "Dell Inc."){ + If ($UseDellCCTK -eq $true){ + If ($Is64Bit -and (Test-Path $DellCCTKPath)){ + $HAPI = "hapint64.exe" + Write-OutputBox -OutputBoxMessage "Dell Command | Configure Tool Kit loading driver: $HAPI" -Type "INFO: " -Object Logging + }ElseIf(Test-Path $DellCCTKPathX86) { + $HAPI = "hapint.exe" + Write-OutputBox -OutputBoxMessage "Dell Command | Configure Tool Kit loaded driver: $HAPI" -Type "INFO: " -Object Logging + }Else { + Write-OutputBox -OutputBoxMessage "Unable to find Dell Command | Configure Tool Kit HAPI driver" -Type "ERROR: " -Object Logging + } + + $private:returnCode = $null + $callexe = New-Object System.Diagnostics.ProcessStartInfo + $callexe.FileName = "$DellCCTKPath\HAPI\$HAPI" + $callexe.RedirectStandardError = $true + $callexe.RedirectStandardOutput = $true + $callexe.UseShellExecute = $false + $callexe.Arguments = "-i -k C-C-T-K -p ""$HAPI"" -q" + $callexe.WindowStyle = 'Minimized' + $process = New-Object System.Diagnostics.Process + $process.StartInfo = $callexe + $process.Start() | Out-Null + $process.WaitForExit() + $stdout = $process.StandardOutput.ReadToEnd() + $stderr = $process.StandardError.ReadToEnd() + Write-OutputBox -OutputBoxMessage ("Running: " + $callexe.FileName + " " + $callexe.Arguments) -Type "INFO: " -Object Logging + If ($process.ExitCode -eq 0){ + Write-OutputBox -OutputBoxMessage "Successfully installed CCTK HAPI drivers" -Type "INFO: " -Object Logging + }Else{ + Write-OutputBox -OutputBoxMessage ("Unable to install the CCTK HAPI drivers with errorcode: " + $process.ExitCode) -Type "ERROR: " -Object Logging + } + } + + If ($UseDellPSProvider -eq $true){ + If ($Is64Bit -and (Test-Path $DellPSProviderPath)){ + Import-Module "$DellPSProviderPath\DellBIOSProvider.PSM1" + Write-OutputBox -OutputBoxMessage "Dell Powershell Provider loaded" -Type "INFO: " -Object Logging + }ElseIf(Test-Path $DellPSProviderPathX86) { + Import-Module "$DellPSProviderPathX86\DellBIOSProvider.PSM1" + Write-OutputBox -OutputBoxMessage "Dell Powershell Provider loaded" -Type "INFO: " -Object Logging + }Else{ + Write-OutputBox -OutputBoxMessage "Unable to find Dell Powershell Provider" -Type "ERROR: " -Object Logging + } + } + + } ElseIf ($Manufacturer -eq "Hewlett Packard"){ + Write-OutputBox -OutputBoxMessage "Unable to load a system Provider, nothing provided" -Type "WARNING: " -Object Logging + } ElseIf ($Manufacturer -eq "System manufacturer"){ + Write-OutputBox -OutputBoxMessage "Unable to load a system Provider, nothing provided" -Type "WARNING: " -Object Logging + } Else { + Write-OutputBox -OutputBoxMessage "Unable to load a system Provider, unsupported hardware" -Type "ERROR: " -Object Logging + } +} + +Function Execute-DellCCTK{ + [CmdletBinding()] + Param ( + [Parameter(Mandatory=$true)] + [Alias('Arguments')] + [ValidateNotNullorEmpty()] + [string[]]$Parameters, + [Parameter(Mandatory=$false)] + [ValidateNotNullorEmpty()] + [string]$WorkingDirectory, + [Parameter(Mandatory=$false)] + [switch]$PassThru = $false, + [Parameter(Mandatory=$false)] + [switch]$DebugLog = $Global:LogDebugMode + ) + + Begin { + If ($Is64Bit -and (Test-Path $DellCCTKPath)){ + $Path = "$DellCCTKPath\cctk.exe" + Write-OutputBox -OutputBoxMessage "Dell Command | Configure Tool Kit loaded: $Path" -Type "INFO: " -Object Logging + }ElseIf(Test-Path $DellCCTKPathX86) { + $Path = "$DellCCTKPathX86\cctk.exe" + Write-OutputBox -OutputBoxMessage "Dell Command | Configure Tool Kit loaded: $Path" -Type "INFO: " -Object Logging + }Else { + Write-OutputBox -OutputBoxMessage "Unable to find Dell Command | Configure Tool Kit" -Type "ERROR: " -Object Logging + } + } + Process { + Try { + $private:returnCode = $null + ## Validate and find the fully qualified path for the $Path variable. + If (([IO.Path]::IsPathRooted($Path)) -and ([IO.Path]::HasExtension($Path))) { + If ($DebugLog){Write-OutputBox -OutputBoxMessage "[$Path] is a valid fully qualified path" -Type "INFO: " -Object Logging} + If (-not (Test-Path -LiteralPath $Path -PathType 'Leaf' -ErrorAction 'Stop')) { + Throw "File [$Path] not found." + } + } + Else { + # The first directory to search will be the 'Files' subdirectory of the script directory + [string]$PathFolders = $Path + # Add the current location of the console (Windows always searches this location first) + [string]$PathFolders = $PathFolders + ';' + (Get-Location -PSProvider 'FileSystem').Path + # Add the new path locations to the PATH environment variable + $env:PATH = $PathFolders + ';' + $env:PATH + + # Get the fully qualified path for the file. Get-Command searches PATH environment variable to find this value. + [string]$FullyQualifiedPath = Get-Command -Name $Path -CommandType 'Application' -TotalCount 1 -Syntax -ErrorAction 'Stop' + + # Revert the PATH environment variable to it's original value + $env:PATH = $env:PATH -replace [regex]::Escape($PathFolders + ';'), '' + + If ($FullyQualifiedPath) { + Write-OutputBox -OutputBoxMessage "[$Path] successfully resolved to fully qualified path [$FullyQualifiedPath]." -Type "INFO: " -Object Logging + $Path = $FullyQualifiedPath + } + Else { + Throw "[$Path] contains an invalid path or file name." + } + } + + ## Set the Working directory (if not specified) + If (-not $WorkingDirectory) { $WorkingDirectory = Split-Path -Path $Path -Parent -ErrorAction 'Stop' } + Try { + + + ## Disable Zone checking to prevent warnings when running executables + $env:SEE_MASK_NOZONECHECKS = 1 + + ## Define process + $CCTKStartInfo = New-Object -TypeName 'System.Diagnostics.ProcessStartInfo' -ErrorAction 'Stop' + $CCTKStartInfo.FileName = $Path + $CCTKStartInfo.WorkingDirectory = $WorkingDirectory + $CCTKStartInfo.UseShellExecute = $false + $CCTKStartInfo.ErrorDialog = $false + $CCTKStartInfo.RedirectStandardOutput = $true + $CCTKStartInfo.RedirectStandardError = $true + $CCTKStartInfo.CreateNoWindow = $false + If ($Parameters) { $CCTKStartInfo.Arguments = $Parameters } + $CCTKStartInfo.WindowStyle = 'Minimized' + $process = New-Object -TypeName 'System.Diagnostics.Process' -ErrorAction 'Stop' + $process.StartInfo = $CCTKStartInfo + + ## Add event handler to capture process's standard output redirection + [scriptblock]$processEventHandler = { If (-not [string]::IsNullOrEmpty($EventArgs.Data)) { $Event.MessageData.AppendLine($EventArgs.Data) } } + $stdOutBuilder = New-Object -TypeName 'System.Text.StringBuilder' -ArgumentList '' + $stdOutEvent = Register-ObjectEvent -InputObject $process -Action $processEventHandler -EventName 'OutputDataReceived' -MessageData $stdOutBuilder -ErrorAction 'Stop' + + ## Start Process + If ($DebugLog){Write-OutputBox -OutputBoxMessage "Working Directory is [$WorkingDirectory]." -Type "INFO: " -Object Logging} + If ($Parameters) { + Write-OutputBox -OutputBoxMessage "Executing [$Path $Parameters]" -Type "INFO: " -Object Logging + } Else { + Write-OutputBox -OutputBoxMessage "Executing [$Path]" -Type "INFO: " -Object Logging + } + [boolean]$processStarted = $process.Start() + + $process.BeginOutputReadLine() + $stdErr = $($process.StandardError.ReadToEnd()).ToString() -replace $null,'' + + ## Instructs the Process component to wait indefinitely for the associated process to exit. + $process.WaitForExit() + + ## HasExited indicates that the associated process has terminated, either normally or abnormally. Wait until HasExited returns $true. + While (-not ($process.HasExited)) { $process.Refresh(); Start-Sleep -Seconds 1 } + + ## Get the exit code for the process + Try { + [int32]$returnCode = $process.ExitCode + + } + Catch [System.Management.Automation.PSInvalidCastException] { + # Catch exit codes that are out of int32 range + [int32]$returnCode = 136 + } + + ## Unregister standard output event to retrieve process output + If ($stdOutEvent) { Unregister-Event -SourceIdentifier $stdOutEvent.Name -ErrorAction 'Stop'; $stdOutEvent = $null } + $stdOut = $stdOutBuilder.ToString() -replace $null,'' + + If ($stdErr.Length -gt 0) { + If ($DebugLog){Write-OutputBox -OutputBoxMessage "Standard error output from the process: $stdErr" -Type "WARNING: " -Object Logging} + } + } + Finally { + ## Make sure the standard output event is unregistered + If ($stdOutEvent) { Unregister-Event -SourceIdentifier $stdOutEvent.Name -ErrorAction 'Stop'} + + ## Free resources associated with the process, this does not cause process to exit + If ($process) { $process.Close() } + + ## Re-enable Zone checking + Remove-Item -LiteralPath 'env:SEE_MASK_NOZONECHECKS' -ErrorAction 'SilentlyContinue' + } + + + ## If the passthru switch is specified, return the exit code and any output from process + If ($PassThru) { + If ($DebugLog){Write-OutputBox -OutputBoxMessage "cctk completed with exit code [$returnCode]." -Type "INFO: " -Object Logging} + [psobject]$ExecutionResults = New-Object -TypeName 'PSObject' -Property @{ ExitCode = $returnCode; StdOut = $stdOut; StdErr = $stdErr } + Write-Output -InputObject $ExecutionResults + } Else { + If ($DebugLog){Write-Host "cctk completed with exit code [$returnCode]."} + $returnCode + } + } + Catch { + If ([string]::IsNullOrEmpty([string]$returnCode)) { + [int32]$returnCode = 136 + }Else { + If ($DebugLog){Write-OutputBox -OutputBoxMessage "cctk completed with exit code [$returnCode]. Function failed." -Type "ERROR: " -Object Logging} + } + + If ($PassThru) { + [psobject]$ExecutionResults = New-Object -TypeName 'PSObject' -Property @{ ExitCode = $returnCode; StdOut = If ($stdOut) { $stdOut } Else { '' }; StdErr = If ($stdErr) { $stdErr } Else { '' } } + Write-Output -InputObject $ExecutionResults + }Else { + If ($DebugLog){Write-Host "cctk completed with exit code [$returnCode]. Function failed."} + $returnCode + } + } + } +} + +Function Test-DellCCTK { + [CmdletBinding()] + Param ( + [Parameter(Mandatory=$false)] + [Alias('FilePath')] + [ValidateNotNullorEmpty()] + [string]$Path = $CCTK, + [Parameter(Mandatory=$true)] + [Alias('Arguments')] + [ValidateNotNullorEmpty()] + [string[]]$Parameters, + [Parameter(Mandatory=$false)] + [switch]$PassThru = $false + ) + $result = Execute-DellCCTK -Parameters "--Asset=TestCCTK" -PassThru + If ($DebugLog){Write-Host "[cctk --Asset=TestCCTK] exitcode: " $result.StdOut} + If ($result.ExitCode -eq 0){ + + } + Execute-DellCCTK -Parameters ($parameters + " --valsetuppwd=$BIOSpwd") -PassThru + + Execute-DellCCTK -Parameters "--setuppwd='' --valsetuppwd=$BIOSpwd" + If ($DebugLog){Write-Host "Cleared BIOS Password"} + +} + +function Run-DellPSProvider { + cd DellSmbios: + <# Examples + Set-Item Dellsmbios:\PostBehaviour\NumLock Enabled + + #Set BIOS Admin Password + Set-Item -Path Dellsmbios\Security\AdminPassword –Value dell123 + + #Change BIOS Admin Password + Set-Item -Path Dellsmbios\Security\AdminPassword –Value dell1234 –Password dell123 + + #Clear BIOS Admin Password + Set-Item -Path Dellsmbios\Security\AdminPassword –Value “” –Password dell123 + + #Disable Chassis Intrusion alert + Set-Item -Path Dellsmbios\Security\ChassisIntrusion -Value Disabled + + #Set Wake On Lancd + Set-Item -Path Dellsmbios:\PowerManagement\WakeOnLANorWLAN -Value "LANorWLAN" + + #Change Asset Tag + Set-Item –Path DellSmbios:\SystemInformation\AssetTag MyAssetTag -Password dell123 + + #Set WWAN Connection AutoSense + Set-Item -Path Dellsmbios:\PowerManagement\ControlWWANRadio -Value Enabled + + #Get Service Tag + Get-ChildItem DellSmbios:\SystemInformation\ServiceTag + + #Get Boot Sequence + Get-ChildItem DellSmbios:\BootSequence\Bootsequence + + #Enable PXE boot + Set-Item -Path Dellsmbios:\SystemConfiguration\"Integrated NIC" -Value "Enabled w PXE" + + #> + +} + + +function Validate-Elevated { + $UserIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent() + $UserWP = New-Object Security.Principal.WindowsPrincipal($UserIdentity) + $ErrorActionPreference = "Stop" + try { + if ($UserWP.IsInRole("S-1-5-32-544")) { + $PBUEFI.Image = $ValidatedImage + $LabelUEFI.Visible = $true + Write-OutputBox -OutputBoxMessage "User has local administrative rights, and the tool was launched elevated" -Type "INFO: " -Object Logging + return $true + } + else { + $PBUEFI.Image = $ErrorImage + $LabelUEFI.Visible = $true + Write-OutputBox -OutputBoxMessage "The tool requires local administrative rights and was not launched elevated" -Type "ERROR: " -Object Logging + return $false + } + } + catch [System.Exception] { + Write-OutputBox -OutputBoxMessage "An error occured when attempting to query for elevation, possible due to issues contacting the domain or the tool is launched in a sub-domain. If used in a sub-domain, check the override checkbox to enable this tool" -Type "WARNING: " -Object Logging + $PBUEFI.Image = $ErrorImage + $LabelUEFI.Visible = $true + $ErrorActionPreference = "Continue" + } +} + + +function Validate-System { + param( + [parameter(Mandatory=$false)] + $OutPutBox = $true + ) + Begin { + $ModelsArrayList = New-Object System.Collections.ArrayList + $ModelsArrayList.AddRange(@($SupportedModels)) + $ManufacturersArrayList = New-Object System.Collections.ArrayList + $ManufacturersArrayList.AddRange(@($SupportedManufacturers)) + } + Process { + If ($ManufacturersArrayList -eq $ComputerSystem.Manufacturer) { + if ($ModelsArrayList -eq $ComputerSystem.Model) { + If($OutPutBox){Write-OutputBox -OutputBoxMessage ("Supported model found (" + $ComputerSystem.Model + ")") -Type "INFO: " -Object Logging} + $PBModel.Image = $ValidatedImage + $LabelSupportedModel.Visible = $true + return $true + } Else { + If($OutPutBox){Write-OutputBox -OutputBoxMessage "The detected model is not supported." -Type "ERROR: " -Object Logging} + $PBModel.Image = $ErrorImage + $LabelSupportedModel.Visible = $true + return $false + } + } Else { + If($OutPutBox){Write-OutputBox -OutputBoxMessage ("The detected manufacturer (" + $ComputerSystem.Manufacturer + ") is not supported.") -Type "ERROR: " -Object Logging} + $PBModel.Image = $ErrorImage + $LabelSupportedModel.Visible = $true + return $false + } + } +} + +function Validate-BIOSPassword { + If ($global:PreValidation -eq $false){return $false; break} + $sTestVal = "TestAsset" + #sPrevAssetTag = oEnvironment.Item("AssetTag") + If ($UseDellCCTK){ + $result = Execute-DellCCTK -Parameters "--asset=" -PassThru + If ($DebugLog){Write-Host "[cctk --asset=] exitcode:" $result.ExitCode} + If ($DebugLog){Write-Host "[cctk --asset=] Error:" $result.StdErr} + If ($DebugLog){Write-Host "[cctk --asset=] Output:" $result.StdOut} + If ($result.ExitCode -eq 191 -or $result.ExitCode -eq 180){ + Write-OutputBox -OutputBoxMessage ("The BIOS password is set. Will try to guess password") -Type "ERROR: " -Object Logging + Foreach ($password in $BIOSKnownUsedpwd){ + $PlainPassword = Decrypt-String -Encrypted $password -Passphrase "SecureHostBaseline" + $result = Execute-DellCCTK -Parameters "--asset=$sTestVal --valsetuppwd=$PlainPassword" -PassThru + If ($result.ExitCode -eq 0){ + Write-OutputBox -OutputBoxMessage "Successfully able to access BIOS settings using a known BIOS password" -Type "INFO: " -Object Logging + $BIOSPasswordFound = $PlainPassword + Break + } Else { + Write-OutputBox -OutputBoxMessage ("Tried $password, The BIOS password is invalid. Will try to guess password again") -Type "ERROR: " -Object Logging + $BIOSPasswordFound = $Null + Continue + } + } + + } Elseif($result.ExitCode -eq 0) { + Write-OutputBox -OutputBoxMessage ("The BIOS password is blank. A password is required to be compliant.") -Type "WARNING: " -Object Logging + Execute-DellCCTK -Parameters "--asset=" + $BIOSPasswordFound = $Null + $PBBIOSPassword.Image = $WarningImage + $LabelBIOSPassword.Visible = $true + return $false + + } Else { + Write-OutputBox -OutputBoxMessage ("CCTK errored with exit code: " + $result.ExitCode) -Type "ERROR: " -Object Logging + $BIOSPasswordFound = $Null + $PBBIOSPassword.Image = $ErrorImage + $LabelBIOSPassword.Visible = $true + return $false + } + + + If ($BIOSPasswordFound){ + Write-OutputBox -OutputBoxMessage ("The BIOS password is has been fo") -Type "INFO: " -Object Logging + Execute-DellCCTK -Parameters "--asset= --valsetuppwd=$BIOSPasswordFound" + $PBBIOSPassword.Image = $ValidatedImage + $LabelBIOSPassword.Visible = $true + return $true + + }Else{ + Write-OutputBox -OutputBoxMessage ("The BIOS password is not known. BIOS configurations may have to be set manually") -Type "ERROR: " -Object Logging + $PBBIOSPassword.Image = $ErrorImage + $LabelBIOSPassword.Visible = $true + return $false + } + } + + If ($UseDellPSProvider){ + Write-OutputBox -OutputBoxMessage ("The BIOS password is not known. BIOS configurations may have to be set manually") -Type "ERROR: " -Object Logging + $BIOSPasswordFound = $Null + $PBBIOSPassword.Image = $ErrorImage + $LabelBIOSPassword.Visible = $true + return $false + } + + #Output current BIOS password + $global:BIOSCurrentPassword = $BIOSPasswordFound + If ($DebugLog){Write-Host "Current BIOS password is: $global:BIOSCurrentPassword"} +} + +function Validate-BIOSRevision { + Begin { + $DetectedBIOS = Get-WmiObject -Namespace "root\cimv2" -Class Win32_BIOS | Select-Object -ExpandProperty SMBIOSBIOSVersion + } + Process { + If (Validate-System -OutPutBox $false){ + foreach($system in $SupportedSystems){ + If ($Model -eq $system.model){ + if (($DetectedBIOS -eq $system.biosrev -or $system.biosrev -eq "any")) { + Write-OutputBox -OutputBoxMessage ("Supported BIOS (" + $DetectedBIOS + ") found for model (" + $system.model + ")") -Type "INFO: " -Object Logging + $ModelBIOSMatchFound = $true + $PBBIOSRevision.Image = $ValidatedImage + $LabelBIOSRevision.Visible = $true + return $true + } Else { + Write-OutputBox -OutputBoxMessage ("The detected BIOS Revision (" + $DetectedBIOS + "). The supported BIOS revision is: " + $system.biosrev) -Type "ERROR: " -Object Logging + $ModelBIOSMatchFound = $false + $PBBIOSRevision.Image = $WarningImage + $LabelBIOSRevision.Visible = $true + return $true + } + } Else{ + Write-OutputBox -OutputBoxMessage ("The model (" + $system.model + ") and BIOS (" + $DetectedBIOS + ") is not supported for Secure Host Baseline.") -Type "ERROR: " -Object Logging + $ModelBIOSMatchFound = $false + $PBBIOSRevision.Image = $ErrorImage + $LabelBIOSRevision.Visible = $true + return $false + } + } + } Else { + Write-OutputBox -OutputBoxMessage ("The detected system is not supported with CredGuard.") -Type "ERROR: " -Object Logging + $ModelBIOSMatchFound = $false + $PBBIOSRevision.Image = $ErrorImage + $LabelBIOSRevision.Visible = $true + return $false + } + }End { + + } +} + +function Validate-OSBuild { + if (($OSProductType -eq 1) -and ($OSBuildNumber -ge $MinimumOSversion)) { + $OSName = $SupportedOperatingSystems | Where-Object version -eq $OSBuildNumber + If(!$OSCaption){ + Write-OutputBox -OutputBoxMessage ("Supported WinPE version running (" + $OSBuildNumber + ")") -Type "INFO: " -Object Logging + } Else { + Write-OutputBox -OutputBoxMessage ("Supported operating system running (" + $OSCaption + ")") -Type "INFO: " -Object Logging + } + $PBOS.Image = $ValidatedImage + $LabelSupportedOS.Visible = $true + return $true + } + else { + if ($OSBuildNumber -lt $MinimumOSversion) { + Write-OutputBox -OutputBoxMessage "The detected operating system or WinPE is not supported. This tool is supported on Windows Server 2012 and above" -Type "ERROR: " -Object Logging + }Elseif ($OSProductType -eq 2) { + Write-OutputBox -OutputBoxMessage "The detected system is a Domain Controller. This tool is not supported on this platform" -Type "ERROR: " -Object Logging + }Elseif ($OSProductType -eq 3) { + Write-OutputBox -OutputBoxMessage "The detected operating system is a Server OS. This tool is not supported on this platform" -Type "ERROR: " -Object Logging + } + $PBOS.Image = $ErrorImage + $LabelSupportedOS.Visible = $true + return $false + } +} + + +function Validate-PowerShellVer { + if ($host.Version -ge "3.0") { + Write-OutputBox -OutputBoxMessage ("Supported version of PowerShell was detected (" + $host.Version + ")") -Type "INFO: " -Object Logging + $PBPS.Image = $ValidatedImage + $LabelPowerShell.Visible = $true + return $true + } + else { + Write-OutputBox -OutputBoxMessage ("Unsupported version of PowerShell detected (" + $host.Version + "). This tool requires PowerShell 3.0 and above") -Type "ERROR: " -Object Logging + $PBPS.Image = $ErrorImage + $LabelPowerShell.Visible = $true + return $false + } +} + + +Function IsUEFI { + <# + .Synopsis + Determines underlying firmware (BIOS) type and returns True for UEFI or False for legacy BIOS. + .DESCRIPTION + This function uses a complied Win32 API call to determine the underlying system firmware type. + .EXAMPLE + If (IsUEFI) { # System is running UEFI firmware... } + .OUTPUTS + [Bool] True = UEFI Firmware; False = Legacy BIOS + .FUNCTIONALITY + Determines underlying system firmware type + #> + + [OutputType([Bool])] + Param () + + Add-Type -Language CSharp -TypeDefinition @' + using System; + using System.Runtime.InteropServices; + public class GetUEFIMode + { + [DllImport("kernel32.dll", SetLastError=true)] + static extern UInt32 + GetFirmwareEnvironmentVariableA(string lpName, string lpGuid, IntPtr pBuffer, UInt32 nSize); + const int ERROR_INVALID_FUNCTION = 1; + public static bool IsUEFI() + { + // Try to call the GetFirmwareEnvironmentVariable API. This is invalid on legacy BIOS. + GetFirmwareEnvironmentVariableA("","{00000000-0000-0000-0000-000000000000}",IntPtr.Zero,0); + if (Marshal.GetLastWin32Error() == ERROR_INVALID_FUNCTION) + return false; // API not supported; this is a legacy BIOS + else + return true; // API error (expected) but call is supported. This is UEFI. + } + } +'@ -ErrorAction SilentlyContinue + [GetUEFIMode]::IsUEFI() +} + +Function GetFirmwareType { + <# + .Synopsis + Determines underlying firmware (BIOS) type and returns an integer indicating UEFI, Legacy BIOS or Unknown. + Supported on Windows 8/Server 2012 or later + .DESCRIPTION + This function uses a complied Win32 API call to determine the underlying system firmware type. + .EXAMPLE + If (Get-BiosType -eq 1) { # System is running UEFI firmware... } + .EXAMPLE + Switch (Get-BiosType) { + 1 {"Legacy BIOS"} + 2 {"UEFI"} + Default {"Unknown"} + } + .OUTPUTS + Integer indicating firmware type (1 = Legacy BIOS, 2 = UEFI, Other = Unknown) + .FUNCTIONALITY + Determines underlying system firmware type + #> + + [OutputType([UInt32])] + Param() + + Add-Type -Language CSharp -TypeDefinition @' + using System; + using System.Runtime.InteropServices; + public class FirmwareType + { + [DllImport("kernel32.dll")] + static extern bool GetFirmwareType(ref uint FirmwareType); + public static uint GetFirmwareType() + { + uint firmwaretype = 0; + if (GetFirmwareType(ref firmwaretype)) + return firmwaretype; + else + return 0; // API call failed, just return 'unknown' + } + } +'@ -IgnoreWarnings + [FirmwareType]::GetFirmwareType() +} + +Function Validate-UEFICheck { + Begin { + $ValidateUEFI = $false + $ValidateUEFI = IsUEFI + } + Process { + if ($ValidateUEFI) { + $PBUEFI.Image = $ValidatedImage + $LabelUEFI.Visible = $true + Write-OutputBox -OutputBoxMessage "UEFI is enabled" -Type "INFO: " -Object Logging + return $true + } + else { + $PBUEFI.Image = $ErrorImage + $LabelUEFI.Visible = $true + Write-OutputBox -OutputBoxMessage "UEFI is not enabled, will try to enable" -Type "ERROR: " -Object Logging + return $false + } + } +} + +Function Validate-LegacyROM { + Begin { + If ($global:PreValidation -eq $false){return $false; break} + } + Process { + $result = Execute-DellCCTK -Parameters "--legacyorom" -PassThru + If ($DebugLog){Write-Host "[cctk --legacyorom] exitcode: " $result.ExitCode} + If ($DebugLog){Write-Host "[cctk --legacyorom] output: " $result.StdOut} + + [string]$ResultOutput = ($result.StdOut).Trim() + $Global:LROM = $ResultOutput.Split("=")[1] + + If ($ResultOutput -eq "legacyorom=disable"){ + Write-OutputBox -OutputBoxMessage "Legacy Option ROM is disable!" -Type "INFO: " -Object Logging + $PBLEGACYOROM.Image = $ValidatedImage + $LabelLegacyROM.Visible = $true + return $true + } + ElseIf ($result.ExitCode -eq 0){ + Write-OutputBox -OutputBoxMessage "Legacy Option ROM is an option, but not disabled" -Type "WARNING: " -Object Logging + If ($BIOSCurrentPassword -ne $Null){ + $result = Execute-DellCCTK -Parameters "--legacyorom=disable --valsetuppwd=$BIOSCurrentPassword" -PassThru + If ($DebugLog){Write-Host "[cctk --legacyorom=disable --valsetuppwd=$BIOSCurrentPassword] exitcode: " $result.ExitCode} + } + Else { + $result = Execute-DellCCTK -Parameters "--legacyorom=disable" -PassThru + If ($DebugLog){Write-Host "[cctk --legacyorom=disable] exitcode: " $result.ExitCode} + } + + If ($result.ExitCode -eq 0){ + Write-OutputBox -OutputBoxMessage "Sucessfully disabled Legacy Option ROM" -Type "INFO: " -Object Logging + $PBLEGACYOROM.Image = $ValidatedImage + $LabelLegacyROM.Visible = $true + return $true + } + ElseIf($result.ExitCode -eq 192) { + Write-OutputBox -OutputBoxMessage "Unable to disable Legacy Option ROM, the BIOS password is unknown." -Type "ERROR: " -Object Logging + $PBLEGACYOROM.Image = $WarningImage + $LabelLegacyROM.Visible = $true + return $false + } + Else { + Write-OutputBox -OutputBoxMessage "Unable to disable Legacy Option ROM, setting must be disabled manually" -Type "ERROR: " -Object Logging + $PBLEGACYOROM.Image = $WarningImage + $LabelLegacyROM.Visible = $true + return $false + } + + } + Else { + Write-OutputBox -OutputBoxMessage "Legacy Boot ROM is not an option." -Type "ERROR: " -Object Logging + $PBLEGACYOROM.Image = $ErrorImage + $LabelLegacyROM.Visible = $true + return $false + } + } +} + +Function Validate-SecureBoot { + Begin { + If ($global:PreValidation -eq $false){return $false; break} + } + Process { + $result = Execute-DellCCTK -Parameters "--secureboot" -PassThru + If ($DebugLog){Write-Host "[cctk --secureboot] exitcode: " $result.ExitCode} + If ($DebugLog){Write-Host "[cctk --secureboot] output: " $result.StdOut} + + [string]$ResultOutput = ($result.StdOut).Trim() + $Global:SB = $ResultOutput.Split("=")[1] + + If ($ResultOutput -eq "secureboot=enable"){ + Write-OutputBox -OutputBoxMessage "Secure Boot is already enabled!" -Type "INFO: " -Object Logging + $PBSECUREBOOT.Image = $ValidatedImage + $LabelLegacyROM.Visible = $true + return $true + } + ElseIf ($result.ExitCode -eq 257){ + Write-OutputBox -OutputBoxMessage "Secure Boot is an option, but not disabled" -Type "WARNING: " -Object Logging + If ($BIOSCurrentPassword -ne $Null){ + $result2 = Execute-DellCCTK -Parameters "--secureboot=enable --valsetuppwd=$BIOSCurrentPassword" -PassThru + If ($DebugLog){Write-Host "[cctk --secureboot=enable --valsetuppwd=$BIOSCurrentPassword] exitcode: " $result2.ExitCode} + } + Else { + $result2 = Execute-DellCCTK -Parameters "--secureboot=enable" -PassThru + If ($DebugLog){Write-Host "[cctk --secureboot=enable] exitcode: " $result2.ExitCode} + } + + If ($result2.ExitCode -eq 0){ + Write-OutputBox -OutputBoxMessage "Sucessfully enabled Secure Boot" -Type "INFO: " -Object Logging + $PBSECUREBOOT.Image = $ValidatedImage + $LabelLegacyROM.Visible = $true + return $true + } + ElseIf($result2.ExitCode -eq 192) { + Write-OutputBox -OutputBoxMessage "Unable to enable Secure Boot, the BIOS password is unknown." -Type "ERROR: " -Object Logging + $PBSECUREBOOT.Image = $WarningImage + $LabelLegacyROM.Visible = $true + return $false + } + Else { + Write-OutputBox -OutputBoxMessage "Unable to enable Secure Boot, setting must be enabled manually" -Type "ERROR: " -Object Logging + $PBSECUREBOOT.Image = $WarningImage + $LabelLegacyROM.Visible = $true + return $false + } + + } + Else { + Write-OutputBox -OutputBoxMessage "Secure Boot is not an option." -Type "ERROR: " -Object Logging + $PBSECUREBOOT.Image = $ErrorImage + $LabelLegacyROM.Visible = $true + return $false + } + } + End { + } +} + +Function Validate-TPMModule{ + Begin{ + If ($global:PreValidation -eq $false){return $false; break} + } + Process { + If($OSCaption){ + $TPMStatus = Get-Tpm | Select-Object -ExpandProperty TpmPresent -ErrorAction SilentlyContinue + } + Else{ + $TPMStatus = Get-WmiObject -Namespace "root\cimv2\Security\MicrosoftTPM" -Class Win32_TPM -ErrorAction SilentlyContinue + } + + if ($TPMStatus) { + Write-OutputBox -OutputBoxMessage "TPM is present" -Type "INFO: " -Object Logging + $PBBIOSTPM.Image = $ValidatedImage + $LabelBIOSTPM.Visible = $true + $Global:TPM = $true + return $true + } + Else { + Write-OutputBox -OutputBoxMessage "TPM is not available for this system." -Type "ERROR: " -Object Logging + $PBBIOSTPM.Image = $ErrorImage + $LabelBIOSTPM.Visible = $true + $Global:TPM = $false + return $false + } + + + } + End { + } + } + + +Function Validate-TPMEnabled{ + Begin{ + If ($Global:TPM -eq $false){return $false; break} + If ($global:PreValidation -eq $false){return $false; break} + } + Process { + If($OSCaption){ + Try { + $TPMStatus = Get-Tpm | Select-Object -ExpandProperty TpmReady + if ($TPMStatus) { + Write-OutputBox -OutputBoxMessage "TPM is ready" -Type "INFO: " -Object Logging + $PBBIOSTPMON.Image = $ValidatedImage + $LabelBIOSTPMEnabled.Visible = $true + return $true + } Else { + $TPMPresent = Get-Tpm | Select-Object -ExpandProperty TpmPresent + if ($TPMPresent) { + Write-OutputBox -OutputBoxMessage "TPM is present, but not ready" -Type "WARNING: " -Object Logging + $PBBIOSTPMON.Image = $ValidatedImage + $LabelBIOSTPMEnabled.Visible = $true + return $true + } Else { + Write-OutputBox -OutputBoxMessage "TPM is not available for this system." -Type "ERROR: " -Object Logging + $PBBIOSTPMON.Image = $ErrorImage + $LabelBIOSTPMEnabled.Visible = $true + return $false + } + } + } + Catch { + Write-OutputBox -OutputBoxMessage "TPM is not available for this system." -Type "ERROR: " -Object Logging + $PBBIOSTPMON.Image = $ErrorImage + $LabelBIOSTPMEnabled.Visible = $true + return $false + } + } Else{ + Write-OutputBox -OutputBoxMessage "WinPE detected, OS deployment process will enable TPM" -Type "IGNORE: " -Object Logging + $PBBIOSTPMON.Image = $WarningImage + $LabelBIOSTPMEnabled.Visible = $true + return $true + } + } + End { + } +} + + +Function Validate-TPMActivated { + Begin{ + If ($Global:TPM -eq $false){return $false; break} + If ($global:PreValidation -eq $false){return $false; break} + } + Process { + If($OSCaption){ + $result = Execute-DellCCTK -Parameters "--tpmactivation" -PassThru + If ($DebugLog){Write-Host "[cctk --tpmactivation] exitcode: "$result.ExitCode} + If ($DebugLog){Write-Host "[cctk --tpmactivation] output: " $result.StdOut} + + [string]$ResultOutput = ($result.StdOut).Trim() + $Global:TPMACT = $ResultOutput.Split("=")[1] + + If ($ResultOutput -eq "tpmactivation=activate"){ + Write-OutputBox -OutputBoxMessage "TPM is activated!" -Type "INFO: " -Object Logging + $PBBIOSTPMACT.Image = $ValidateImage + $LabelBIOSTPMActive.Visible = $true + return $true + } + ElseIf ($result.ExitCode -eq 0){ + Write-OutputBox -OutputBoxMessage "TPM is available for this system, but is not activated" -Type "WARNING: " -Object Logging + If ($BIOSCurrentPassword -ne $Null){ + $result2 = Execute-DellCCTK -Parameters "----tpmactivation=activate --valsetuppwd=$BIOSCurrentPassword" -PassThru + If ($DebugLog){Write-Host "[cctk --tpmactivation=activate --valsetuppwd=$BIOSCurrentPassword] exitcode: " $result2.ExitCode} + } + Else { + $result2 = Execute-DellCCTK -Parameters "--tpmactivation=activate" -PassThru + If ($DebugLog){Write-Host "[cctk --tpmactivation=activate] exitcode: " $result2.ExitCode} + } + + If ($result2.ExitCode -eq 0){ + Write-OutputBox -OutputBoxMessage "Sucessfully activated the TPM Module" -Type "INFO: " -Object Logging + $PBBIOSTPMACT.Image = $ValidateImage + $LabelBIOSTPMActive.Visible = $true + return $true + } + ElseIf($result2.ExitCode -eq 192) { + Write-OutputBox -OutputBoxMessage "Unable to activate the TPM module, the BIOS password is unknown." -Type "ERROR: " -Object Logging + $PBBIOSTPMACT.Image = $WarningImage + $LabelBIOSTPMActive.Visible = $true + return $false + } + Else { + Write-OutputBox -OutputBoxMessage "Unable to activate the TPM module, setting must activated manually" -Type "ERROR: " -Object Logging + $PBBIOSTPMACT.Image = $WarningImage + $LabelBIOSTPMActive.Visible = $true + return $false + } + + } + Else { + Write-OutputBox -OutputBoxMessage "A TPM module is not available for this system." -Type "ERROR: " -Object Logging + $PBBIOSTPMACT.Image = $ErrorImage + $LabelBIOSTPMActive.Visible = $true + return $false + } + } + Else{ + Write-OutputBox -OutputBoxMessage "WinPE detected, OS deployment process will activate TPM" -Type "IGNORE: " -Object Logging + $PBBIOSTPMACT.Image = $WarningImage + $LabelBIOSTPMActive.Visible = $true + return $true + } + } +} + +Function Validate-VTFeature { + Begin{ + If ($global:PreValidation -eq $false){return $false; break} + } + Process { + $result = Execute-DellCCTK -Parameters "--virtualization" -PassThru + If ($DebugLog){Write-Host "[cctk --virtualization] exitcode: " $result.ExitCode} + If ($DebugLog){Write-Host "[cctk --virtualization] output: " $result.StdOut} + + [string]$ResultOutput = ($result.StdOut).Trim() + $Global:VT = $ResultOutput.Split("=")[1] + + If ($ResultOutput -eq "virtualization=enable"){ + Write-OutputBox -OutputBoxMessage "Virtualization Technology is available for this system and is enabled!" -Type "INFO: " -Object Logging + $PBBIOSVT.Image = $ValidatedImage + $LabelBIOSVT.Visible = $true + return $true + } + ElseIf ($result.ExitCode -eq 0){ + Write-OutputBox -OutputBoxMessage "Virtualization Technology is available for this system, but is not enabled" -Type "WARNING: " -Object Logging + If ($BIOSCurrentPassword -ne $Null){ + $result2 = Execute-DellCCTK -Parameters "--virtualization=enable --valsetuppwd=$BIOSCurrentPassword" -PassThru + If ($DebugLog){Write-Host "[cctk --virtualization=enable --valsetuppwd=$BIOSCurrentPassword] exitcode: " $result2.ExitCode} + } + Else { + $result2 = Execute-DellCCTK -Parameters "--virtualization=enable" -PassThru + If ($DebugLog){Write-Host "[cctk --virtualization=enable] exitcode: " $result2.ExitCode} + } + + If ($result2.ExitCode -eq 0){ + Write-OutputBox -OutputBoxMessage "Sucessfully enabled Virtualization Technology" -Type "INFO: " -Object Logging + $PBBIOSVT.Image = $ValidatedImage + $LabelBIOSVT.Visible = $true + return $true + } + ElseIf($result2.ExitCode -eq 192) { + Write-OutputBox -OutputBoxMessage "Unable to enable Virtualization Technology, the BIOS password is unknown." -Type "ERROR: " -Object Logging + $PBBIOSVT.Image = $WarningImage + $LabelBIOSVT.Visible = $true + return $false + } + Else { + Write-OutputBox -OutputBoxMessage "Unable to enable Virtualization Technology, setting must be enabled manually" -Type "ERROR: " -Object Logging + $PBBIOSVT.Image = $WarningImage + $LabelBIOSVT.Visible = $true + return $false + } + } + Else { + Write-OutputBox -OutputBoxMessage "Virtualization Technology is not available for this system." -Type "ERROR: " -Object Logging + $PBBIOSVT.Image = $ErrorImage + $LabelBIOSVT.Visible = $true + return $false + } + } + End { + } +} + +Function Validate-VTDirectIO { + Begin { + If (!$Global:VT){return $false; break} + If ($global:PreValidation -eq $false){return $false; break} + } + Process { + $result = Execute-DellCCTK -Parameters "--vtfordirectio" -PassThru + If ($DebugLog){Write-Host "[cctk --vtfordirectio] exitcode: " $result.ExitCode} + If ($DebugLog){Write-Host "[cctk --vtfordirectio] output: " $result.StdOut} + + [string]$ResultOutput = ($result.StdOut).Trim() + [string]$Global:VTDIO = $ResultOutput.Split("=")[1] + + If ($ResultOutput -eq "vtfordirectio=on"){ + Write-OutputBox -OutputBoxMessage "Virtualization Direct IO is available for this system and is enabled!" -Type "INFO: " -Object Logging + $PBBIOSVTDirectIO.Image = $ValidatedImage + $LabelBIOSVTDirectIO.Visible = $true + return $true + } + ElseIf ($result.ExitCode -eq 0){ + Write-OutputBox -OutputBoxMessage "Virtualization Direct IO is available for this system, but is not enabled" -Type "WARNING: " -Object Logging + If ($BIOSCurrentPassword -ne $Null){ + $result2 = Execute-DellCCTK -Parameters "--vtfordirectio=on --valsetuppwd=$BIOSCurrentPassword" -PassThru + If ($DebugLog){Write-Host "[cctk --vtfordirectio=on --valsetuppwd=$BIOSCurrentPassword] exitcode: " $result2.ExitCode} + } + Else { + $result2 = Execute-DellCCTK -Parameters "--vtfordirectio=on" -PassThru + If ($DebugLog){Write-Host "[cctk vtfordirectio=on] exitcode: " $result2.ExitCode} + } + + If ($result2.ExitCode -eq 0){ + Write-OutputBox -OutputBoxMessage "Sucessfully enabled Virtualization Direct IO" -Type "INFO: " -Object Logging + $PBBIOSVTDirectIO.Image = $ValidatedImage + $LabelBIOSVTDirectIO.Visible = $true + return $true + } + ElseIf($result2.ExitCode -eq 192) { + Write-OutputBox -OutputBoxMessage "Unable to enable Virtualization Direct IO, the BIOS password is unkown." -Type "ERROR: " -Object Logging + $PBBIOSVTDirectIO.Image = $WarningImage + $LabelBIOSVTDirectIO.Visible = $true + return $false + } + Else { + Write-OutputBox -OutputBoxMessage "Unable to enable Virtualization Direct IO, setting must enabled manually" -Type "ERROR: " -Object Logging + $PBBIOSVTDirectIO.Image = $WarningImage + $LabelBIOSVTDirectIO.Visible = $true + return $false + } + + } + Else { + Write-OutputBox -OutputBoxMessage "Virtualization Direct IO is not enabled or is not available for this system." -Type "ERROR: " -Object Logging + $PBBIOSVTDirectIO.Image = $ErrorImage + $LabelBIOSVTDirectIO.Visible = $true + return $false + } + } + End { + } +} + +Function Validate-VTTrustedExecution { + Begin { + If (!$Global:VT){return $false; break} + If ($global:PreValidation -eq $false){return $false; break} + } + Process { + $result = Execute-DellCCTK -Parameters "--trustexecution" -PassThru + If ($DebugLog){Write-Host "[cctk --trustexecution] exitcode: " $result.ExitCode} + If ($DebugLog){Write-Host "[cctk --trustexecution] output: " $result.StdOut} + + [string]$ResultOutput = ($result.StdOut).Trim() + $Global:VTTE = $ResultOutput.Split("=")[1] + + If ($ResultOutput -eq "trustexecution=on"){ + Write-OutputBox -OutputBoxMessage "Virtualization Trusted Execution is available for this system and is enabled!" -Type "INFO: " -Object Logging + $PBBIOSVTTE.Image = $ValidatedImage + $LabelBIOSVTTE.Visible = $true + return $true + } + ElseIf ($result.ExitCode -eq 0){ + Write-OutputBox -OutputBoxMessage "Virtualization Trusted Execution is available for this system, but is not enabled" -Type "WARNING: " -Object Logging + If ($BIOSCurrentPassword -ne $Null){ + $result2 = Execute-DellCCTK -Parameters "--trustexecution=on --valsetuppwd=$BIOSCurrentPassword" -PassThru + If ($DebugLog){Write-Host "[cctk --trustexecution=on --valsetuppwd=$BIOSCurrentPassword] exitcode: " $result2.ExitCode} + } + Else { + $result2 = Execute-DellCCTK -Parameters "--vtfordirectio=on" -PassThru + If ($DebugLog){Write-Host "[cctk trustexecution=on] exitcode: " $result2.ExitCode} + } + + If ($result2.ExitCode -eq 0){ + Write-OutputBox -OutputBoxMessage "Sucessfully enabled Virtualization Trusted Execution" -Type "INFO: " -Object Logging + $PBBIOSVTTE.Image = $ValidatedImage + $LabelBIOSVTTE.Visible = $true + return $true + } + ElseIf($result2.ExitCode -eq 192) { + Write-OutputBox -OutputBoxMessage "Unable to enable Virtualization Trusted Execution, the BIOS password is unknown." -Type "ERROR: " -Object Logging + $PBBIOSVTTE.Image = $WarningImage + $LabelBIOSVTTE.Visible = $true + return $false + } + Else { + Write-OutputBox -OutputBoxMessage "Unable to enable Virtualization Trusted Execution, setting must enabled manually" -Type "ERROR: " -Object Logging + $PBBIOSVTTE.Image = $WarningImage + $LabelBIOSVTTE.Visible = $true + return $false + } + + } + Else { + Write-OutputBox -OutputBoxMessage "Virtualization Trusted Execution is not enabled or is not available for this system." -Type "ERROR: " -Object Logging + $PBBIOSVTTE.Image = $ErrorImage + $LabelBIOSVTTE.Visible = $true + return $false + } + } + End { + } +} + +function Encrypt-String($String, $Passphrase, $salt="SaltCrypto", $init="IV_Password", [switch]$arrayOutput) +{ + # Create a COM Object for RijndaelManaged Cryptography + $r = new-Object System.Security.Cryptography.RijndaelManaged + # Convert the Passphrase to UTF8 Bytes + $pass = [Text.Encoding]::UTF8.GetBytes($Passphrase) + # Convert the Salt to UTF Bytes + $salt = [Text.Encoding]::UTF8.GetBytes($salt) + + # Create the Encryption Key using the passphrase, salt and SHA1 algorithm at 256 bits + $r.Key = (new-Object Security.Cryptography.PasswordDeriveBytes $pass, $salt, "SHA1", 5).GetBytes(32) #256/8 + # Create the Intersecting Vector Cryptology Hash with the init + $r.IV = (new-Object Security.Cryptography.SHA1Managed).ComputeHash( [Text.Encoding]::UTF8.GetBytes($init) )[0..15] + + # Starts the New Encryption using the Key and IV + $c = $r.CreateEncryptor() + # Creates a MemoryStream to do the encryption in + $ms = new-Object IO.MemoryStream + # Creates the new Cryptology Stream --> Outputs to $MS or Memory Stream + $cs = new-Object Security.Cryptography.CryptoStream $ms,$c,"Write" + # Starts the new Cryptology Stream + $sw = new-Object IO.StreamWriter $cs + # Writes the string in the Cryptology Stream + $sw.Write($String) + # Stops the stream writer + $sw.Close() + # Stops the Cryptology Stream + $cs.Close() + # Stops writing to Memory + $ms.Close() + # Clears the IV and HASH from memory to prevent memory read attacks + $r.Clear() + # Takes the MemoryStream and puts it to an array + [byte[]]$result = $ms.ToArray() + # Converts the array from Base 64 to a string and returns + return [Convert]::ToBase64String($result) +} + +function Decrypt-String($Encrypted, $Passphrase, $salt="SaltCrypto", $init="IV_Password") +{ + # If the value in the Encrypted is a string, convert it to Base64 + if($Encrypted -is [string]){ + $Encrypted = [Convert]::FromBase64String($Encrypted) + } + + # Create a COM Object for RijndaelManaged Cryptography + $r = new-Object System.Security.Cryptography.RijndaelManaged + # Convert the Passphrase to UTF8 Bytes + $pass = [Text.Encoding]::UTF8.GetBytes($Passphrase) + # Convert the Salt to UTF Bytes + $salt = [Text.Encoding]::UTF8.GetBytes($salt) + + # Create the Encryption Key using the passphrase, salt and SHA1 algorithm at 256 bits + $r.Key = (new-Object Security.Cryptography.PasswordDeriveBytes $pass, $salt, "SHA1", 5).GetBytes(32) #256/8 + # Create the Intersecting Vector Cryptology Hash with the init + $r.IV = (new-Object Security.Cryptography.SHA1Managed).ComputeHash( [Text.Encoding]::UTF8.GetBytes($init) )[0..15] + + + # Create a new Decryptor + $d = $r.CreateDecryptor() + # Create a New memory stream with the encrypted value. + $ms = new-Object IO.MemoryStream @(,$Encrypted) + # Read the new memory stream and read it in the cryptology stream + $cs = new-Object Security.Cryptography.CryptoStream $ms,$d,"Read" + # Read the new decrypted stream + $sr = new-Object IO.StreamReader $cs + # Return from the function the stream + Write-Output $sr.ReadToEnd() + # Stops the stream + $sr.Close() + # Stops the crypology stream + $cs.Close() + # Stops the memory stream + $ms.Close() + # Clears the RijndaelManaged Cryptology IV and Key + $r.Clear() +} + + +function Clear-OutputBox { + $OutputBox.ResetText() +} + +function Write-OutputBox { + param( + [parameter(Mandatory=$true)] + [string]$OutputBoxMessage, + [ValidateSet("WARNING: ","ERROR: ","INFO: ","IGNORE: "," ")] + [string]$Type, + [parameter(Mandatory=$true)] + [ValidateSet("SHB","Logging","SysInfo")] + [string]$Object + ) + Process { + if ($Object -like "SHB") { + if ($OutputBoxSHB.Text.Length -eq 0) { + $OutputBoxSHB.Text = "$($Type)$($OutputBoxMessage)" + [System.Windows.Forms.Application]::DoEvents() + $OutputBoxSHB.ScrollToCaret() + } + else { + $OutputBoxSHB.AppendText("`n$($Type)$($OutputBoxMessage)") + [System.Windows.Forms.Application]::DoEvents() + $OutputBoxSHB.ScrollToCaret() + } + } + if ($Object -like "Logging") { + if ($OutputBoxLogging.Text.Length -eq 0) { + $OutputBoxLogging.Text = "$($Type)$($OutputBoxMessage)" + [System.Windows.Forms.Application]::DoEvents() + $OutputBoxLogging.ScrollToCaret() + } + else { + $OutputBoxLogging.AppendText("`n$($Type)$($OutputBoxMessage)") + [System.Windows.Forms.Application]::DoEvents() + $OutputBoxLogging.ScrollToCaret() + } + } + if ($Object -like "SysInfo") { + if ($OutputBoxSysInfo.Text.Length -eq 0) { + $OutputBoxSysInfo.Text = "$($Type)$($OutputBoxMessage)" + [System.Windows.Forms.Application]::DoEvents() + $OutputBoxSysInfo.ScrollToCaret() + } + else { + $OutputBoxSysInfo.AppendText("`n$($Type)$($OutputBoxMessage)") + [System.Windows.Forms.Application]::DoEvents() + $OutputBoxSysInfo.ScrollToCaret() + } + } + } +} + +##*============================================= +##* ASSEMBLIES +##*============================================= +Add-Type -AssemblyName "System.Drawing" +Add-Type -AssemblyName "System.Windows.Forms" +Add-Type -AssemblyName "System.DirectoryServices" + +##*============================================= +##* FORM +##*============================================= +#Get Screen Resolution +$FormWidth = 805 +$FormHeight = 530 + +<#$Image = [system.drawing.image]::FromFile("$($Env:Public)\Pictures\Sample Pictures\Oryx Antelope.jpg") +$Form.BackgroundImage = $Image +$Form.BackgroundImageLayout = "None" + # None, Tile, Center, Stretch, Zoom +#> +$Form = New-Object System.Windows.Forms.Form +$Form.Size = New-Object System.Drawing.Size($FormWidth,$FormHeight) +$Form.MinimumSize = New-Object System.Drawing.Size($FormWidth,$FormHeight) +$Form.MaximumSize = New-Object System.Drawing.Size($FormWidth,$FormHeight) +$Form.MinimizeBox = $False +$Form.MaximizeBox = $False +#$Form.ControlBox = $false +$Form.ShowInTaskbar = $False +$Form.SizeGripStyle = "Hide" +$Form.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($PSHome + "\powershell.exe") +$Form.Text = ($apptitle + " (" + $appversion + ")") +$Form.StartPosition = "CenterScreen" +#$Form.FormBorderStyle = "Fixed Single" + +$Form.Topmost = $True + # CenterScreen, Manual, WindowsDefaultLocation, WindowsDefaultBounds, CenterParent +# Base64 +$ValidatedBase64String = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAJMSURBVDhPlZJdSJNhFMcftFAjdSXdRBcFFlGRa6zUlm7pKrMuqpskKKQLK/pECppR +vYRzjpb7cDq3nO87ZLbRcG02nS4Soi6kQsG5wtgmkkPmxy5G1/8e7SU01rIfPDwX5zzP+f/POeS/ +MJPtGZYMNtuaPZzP5bFbugsEfGQNmImAPo6eGzqNmx/qcJbe23q2DvPRf5NpyWQqfVLoJ5qh+Hwb ++pAae1yF4MPpWf98nVDA5ePZhBL1n+qWj+6Lin6wa20f5FDPt0auoHVSjasfL8AaMeLiu/Mo6t2r +5VP+zoaunFqRuwjclAn3g9fRHtZAGXwIoXtfVPRqP9/ENiIkJlJLOui9glx2o4B2O2GglVsjKmjC +DGzTHZD1SyD2CGW/stqIttC+Ayf75SjgNoF2+7cs6pu99L4GPTOdaI40oDdux7WRyzjkPbBCejtB +09gjaGmDWkJNWJKb1ZnFbrYJZLtf7oRrthvG7yq45mwwRjUo9oqipX3iFfM3ERjoSB6M3gEzfm/Z +64nBCtAlgfrrEzjiVrBxAzwLL1AVqMTh1wdX2STUt7bEI4b5mw7KkAJPJx/DEWPBBBXoW3Cia06P +N0kv7o7dwBFfMcO/Ws3Sekp9EtimOqANN0JF/XrnHbDPmzGQdIGNmVDmKxnl01OTx+WypwLH4Yxx +sMy0QB9rhDNhxWDSjTNvq3F0QPKH9BTQ3WZpJThnObgWOQz/8KFhvB6V/rLU0lNB15OtDsjhXXTC +PK2D3F+eXnoq6KiYcl9p4phfGq0aqkgjnZCf1ZM3pZ8/L2UAAAAASUVORK5CYII=" +$ValidatedImageBytes = [Convert]::FromBase64String($ValidatedBase64String) +$ValidatedMemoryStream = New-Object -TypeName IO.MemoryStream($ValidatedImageBytes, 0, $ValidatedImageBytes.Length) +$ValidatedMemoryStream.Write($ValidatedImageBytes, 0, $ValidatedImageBytes.Length) +$ValidatedImage = [System.Drawing.Image]::FromStream($ValidatedMemoryStream, $true) + +$WarningBase64String = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ +bWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp +bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 +eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1 +MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo +dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw +dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv +IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS +ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD +cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJ +RD0ieG1wLmlpZDozRjc3RkMyQzEyMkUxMUU2QTkwQ0QyNTc2NzhGQjE0QyIgeG1wTU06RG9jdW1l +bnRJRD0ieG1wLmRpZDozRjc3RkMyRDEyMkUxMUU2QTkwQ0QyNTc2NzhGQjE0QyI+IDx4bXBNTTpE +ZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjNGNzdGQzJBMTIyRTExRTZBOTBD +RDI1NzY3OEZCMTRDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjNGNzdGQzJCMTIyRTExRTZB +OTBDRDI1NzY3OEZCMTRDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBt +ZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+qs7huQAAAh5JREFUeNqMkt9rUnEYxh93jm7Mgz/wB8s1 +SiUWO5BDi2zBwLLVRTiKVoHDFSNz1G4GttqKXdTfEMQuSpCguy66r9ZFUHZR1KKLrlqbTl3+XGrH +8/adaSnM2Jfzgfd73vd54LznAdocQakUXgd8H9+Mn/6sUSo1zT2n0wkiqtHRziDoGLzmnuoXD4Xs ++6+K4nS7uW0NrFqdbXbCOwu3ETiqR/iiO2wXNPt2bDB/fHjB7LPovyX0+LoiwHTGoJ0fci3syGC4 +x+KZPN8f+FQs4nGkjIcPJLzNlXH5wh6/x2A+8V8Djj13joj3MLKJUmUDqWQC+dwP/KIiMFrBbZf1 +LhvjZba8xuGbDcZNPZPeUdUQ9ClYSpvIZpWQJAl9u34ChiyOneMP+5fUwZf5wv1YLFbTKBpiIzrM +L0bs78Qnxt3QqVGtdiEU4plBFYuLZfB8AcjmsOxLr3qW4q51ULzlE6538jfFSwUmTrFbChyXhE63 +zkgy8da7DUCbwUCwYJnmMNeyCBEYXPWiRJKKZUPP6GVYKRq1UyRiY3Ufw8ToJqoqKH4SFQdw8K/B +IzWe0vNGuBQMVW04HhdobU1gdReDa4SP6BUoKuBZTXwW8Gev4F+ziQMO0IAIkrfp5adAY0AA7/di +hZbrjSpDrsPut8KgGzNNQrk+s1V/AX2w4TuflpFJzqBXlgFq2ouC/Z+57j914hTrUWuAOBaatITM +bwEGAF7CG6ZJhs9jAAAAAElFTkSuQmCC" +$WarningImageBytes = [Convert]::FromBase64String($WarningBase64String) +$WarningMemoryStream = New-Object -TypeName IO.MemoryStream($WarningImageBytes, 0, $WarningImageBytes.Length) +$WarningMemoryStream.Write($WarningImageBytes, 0, $WarningImageBytes.Length) +$WarningImage = [System.Drawing.Image]::FromStream($WarningMemoryStream, $true) + +$ErrorBase64String = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACx +jwv8YQUAAAJ0SURBVDhPdZPNTxphEMb35DeCioAgYPhGFPzCjxiNJurBxGiC+g940Zsa/w+u3ji3 +VdfWGlywWO3uIqb1pTWx1V5M2nhp00PTpMen865gsdhJ5rLwm2eemXmFYuSXluJnsZi4azYbCp/K +QmxpMZzOzYnK9HS88OkuLlZWErebm3g7P49UKMR2LZayIgWYfdrYgDw4iHQwmNB+4MoaHItBHR+H +MjoKKRBgHND+QLFjtRqyHF5fhxKNQu7p0TLl98cF3jZXLsLK8DDkoSFIPh/boSL38NoalN5eKF1d +93ng8YjCc/LM2y6F5f5+yH19OPB6WXZ2ll2trkIlRTUSgRoOI0speTxsm4prLXLPvO1SWCGAq3xc +Xka2u1uDTilznZ2Q3G62bbM9nBP3zNsuhbmiEghAbmuD4nRCpUwRvPUvXAzumbctk9Kx3Y5MfT1e +U54YDFCamnBgsbCt1tbHYR58YMrUFGMzM3hVV6fBbxoaoBqNyJlMSNls7Nn/CnB1meD84iIOCTwq +gc/MZryzWvHe4UDG4WBP7fZy//LkJMsvLCBNyhnKY71eaztH8LnNhg/k/9LlwpXXi2OX62+RIswI +lmprka6pwZFOp6lzz2lqmytfut347PfjJhTCF5qRQgN/4nAYBHliQjynQ0pWV0OqqsIhFeHekyaT +NjDuOeN0smufDzcdHbillX6ja/xO684Gg6JwNDAQ36+sRLKiAikqwoe339z8YFW83RNa31daKwd/ +0sH9GhlBPhy+e1QvdLpEscBLo7H8SCh4EdXvZz/oIf0eG8N1NHr3mIqxp9fH9xobxfvzfCS451x7 +u3gRiRSesyD8Adwnbx6z9nmyAAAAAElFTkSuQmCC" +$ErrorImageBytes = [Convert]::FromBase64String($ErrorBase64String) +$ErrorMemoryStream = New-Object -TypeName IO.MemoryStream($ErrorImageBytes, 0, $ErrorImageBytes.Length) +$ErrorMemoryStream.Write($ErrorImageBytes, 0, $ErrorImageBytes.Length) +$ErrorImage = [System.Drawing.Image]::FromStream($ErrorMemoryStream, $true) + +# PictureBoxes +$PBReboot = New-Object -TypeName System.Windows.Forms.PictureBox +$PBReboot.Location = New-Object -TypeName System.Drawing.Size(203,50) +$PBReboot.Size = New-Object -TypeName System.Drawing.Size(16,16) + +$PBModel = New-Object -TypeName System.Windows.Forms.PictureBox +$PBModel.Location = New-Object -TypeName System.Drawing.Size(203,50) +$PBModel.Size = New-Object -TypeName System.Drawing.Size(16,16) + +$PBOS = New-Object -TypeName System.Windows.Forms.PictureBox +$PBOS.Location = New-Object -TypeName System.Drawing.Size(203,90) +$PBOS.Size = New-Object -TypeName System.Drawing.Size(16,16) + +$PBPS = New-Object -TypeName System.Windows.Forms.PictureBox +$PBPS.Location = New-Object -TypeName System.Drawing.Size(203,130) +$PBPS.Size = New-Object -TypeName System.Drawing.Size(16,16) + +$PBUEFI = New-Object -TypeName System.Windows.Forms.PictureBox +$PBUEFI.Location = New-Object -TypeName System.Drawing.Size(203,170) +$PBUEFI.Size = New-Object -TypeName System.Drawing.Size(16,16) + +$PBBIOSRevision = New-Object -TypeName System.Windows.Forms.PictureBox +$PBBIOSRevision.Location = New-Object -TypeName System.Drawing.Size(444,72) +$PBBIOSRevision.Size = New-Object -TypeName System.Drawing.Size(16,16) + +$PBBIOSPassword = New-Object -TypeName System.Windows.Forms.PictureBox +$PBBIOSPassword.Location = New-Object -TypeName System.Drawing.Size(444,112) +$PBBIOSPassword.Size = New-Object -TypeName System.Drawing.Size(16,16) + +$PBBIOSTPM = New-Object -TypeName System.Windows.Forms.PictureBox +$PBBIOSTPM.Location = New-Object -TypeName System.Drawing.Size(444,192) +$PBBIOSTPM.Size = New-Object -TypeName System.Drawing.Size(16,16) + +$PBBIOSTPMON = New-Object -TypeName System.Windows.Forms.PictureBox +$PBBIOSTPMON.Location = New-Object -TypeName System.Drawing.Size(444,232) +$PBBIOSTPMON.Size = New-Object -TypeName System.Drawing.Size(16,16) + +$PBBIOSTPMACT = New-Object -TypeName System.Windows.Forms.PictureBox +$PBBIOSTPMACT.Location = New-Object -TypeName System.Drawing.Size(444,272) +$PBBIOSTPMACT.Size = New-Object -TypeName System.Drawing.Size(16,16) + +$PBBIOSVT = New-Object -TypeName System.Windows.Forms.PictureBox +$PBBIOSVT.Location = New-Object -TypeName System.Drawing.Size(720,72) +$PBBIOSVT.Size = New-Object -TypeName System.Drawing.Size(16,16) + +$PBBIOSVTDirectIO = New-Object -TypeName System.Windows.Forms.PictureBox +$PBBIOSVTDirectIO.Location = New-Object -TypeName System.Drawing.Size(720,112) +$PBBIOSVTDirectIO.Size = New-Object -TypeName System.Drawing.Size(16,16) + +$PBBIOSVTTE = New-Object -TypeName System.Windows.Forms.PictureBox +$PBBIOSVTTE.Location = New-Object -TypeName System.Drawing.Size(720,152) +$PBBIOSVTTE.Size = New-Object -TypeName System.Drawing.Size(16,16) + +$PBLEGACYOROM = New-Object -TypeName System.Windows.Forms.PictureBox +$PBLEGACYOROM.Location = New-Object -TypeName System.Drawing.Size(720,232) +$PBLEGACYOROM.Size = New-Object -TypeName System.Drawing.Size(16,16) + +$PBSECUREBOOT = New-Object -TypeName System.Windows.Forms.PictureBox +$PBSECUREBOOT.Location = New-Object -TypeName System.Drawing.Size(720,272) +$PBSECUREBOOT.Size = New-Object -TypeName System.Drawing.Size(16,16) + + +# ListBoxes +$LBOSVersions = New-Object -TypeName System.Windows.Forms.ListBox +$LBOSVersions.Location = New-Object -TypeName System.Drawing.Size(30,390) +$LBOSVersions.Size = New-Object -TypeName System.Drawing.Size(200,56) +$LBOSVersions.SelectionMode = "None" +$LBOSVersions.Items.AddRange(@($SupportedOperatingSystems.name)) + +# TabPages +$TabSHBPage = New-Object System.Windows.Forms.TabPage +$TabSHBPage.Location = New-Object System.Drawing.Size(10,50) +$TabSHBPage.Size = New-Object System.Drawing.Size(300,300) +$TabSHBPage.Text = "SHB" +$TabSHBPage.Name = "SHB" +$TabSHBPage.Padding = "0,0,0,0" +$TabSHBPage.BackColor = "Control" + +$TabLoggingPage = New-Object System.Windows.Forms.TabPage +$TabLoggingPage.Location = New-Object System.Drawing.Size(10,50) +$TabLoggingPage.Size = New-Object System.Drawing.Size(300,300) +$TabLoggingPage.Text = "Logging" +$TabLoggingPage.Name = "Logging" +$TabLoggingPage.Padding = "0,0,0,0" +$TabLoggingPage.BackColor = "Control" + +$TabControl = New-Object System.Windows.Forms.TabControl +$TabControl.Location = New-Object System.Drawing.Size(0,0) +$TabControl.Size = New-Object System.Drawing.Size(805,530) +$TabControl.Anchor = "Top, Bottom, Left, Right" +$TabControl.Name = "Global" +$TabControl.SelectedIndex = 0 +$TabControl.Add_Selected([System.Windows.Forms.TabControlEventHandler]{ + if ($TabControl.SelectedTab.Name -like "Logging") { + Load-LoggingPage + if ($TabControl.SelectedTab.Enabled -eq $true) { + if (-not($OutputBoxLogging.Text.Length -ge 1)) { + $OutputBoxLogging.ResetText() + Write-OutputBox -OutputBoxMessage "Addtionally you can choose to output a log file to your desktop" -Type "INFO: " -Object SysInfo + } + } + } +}) + +# ProgressBars +$ProgressBar = New-Object System.Windows.Forms.ProgressBar +$ProgressBar.Location = New-Object System.Drawing.Size(260,340) +$ProgressBar.Size = New-Object System.Drawing.Size(495,30) +$ProgressBar.Step = 1 +$ProgressBar.Value = 0 + +# OutputBoxes +$OutputBoxSysInfo = New-Object System.Windows.Forms.RichTextBox +$OutputBoxSysInfo.Location = New-Object System.Drawing.Size(30,250) +$OutputBoxSysInfo.Size = New-Object System.Drawing.Size(200,115) +$OutputBoxSysInfo.BackColor = "white" +$OutputBoxSysInfo.ReadOnly = $true +$OutputBoxSysInfo.MultiLine = $True + +$OutputBoxLogging = New-Object System.Windows.Forms.RichTextBox +$OutputBoxLogging.Location = New-Object System.Drawing.Size(10,10) +$OutputBoxLogging.Size = New-Object System.Drawing.Size(763,350) +$OutputBoxLogging.Font = "Courier New" +$OutputBoxLogging.BackColor = "white" +$OutputBoxLogging.ReadOnly = $true +$OutputBoxLogging.MultiLine = $True + +# Buttons +$ButtonExportLogging = New-Object System.Windows.Forms.Button +$ButtonExportLogging.Location = New-Object System.Drawing.Size(673,420) +$ButtonExportLogging.Size = New-Object System.Drawing.Size(100,30) +$ButtonExportLogging.Text = "Export" +$ButtonExportLogging.Name = "ExportBtn" +$ButtonExportLogging.TabIndex = "1" +$ButtonExportLogging.Add_Click({Get-SystemInfo}) + +$ButtonContinueExit = New-Object System.Windows.Forms.Button +$ButtonContinueExit.Location = New-Object System.Drawing.Size(655,420) +$ButtonContinueExit.Size = New-Object System.Drawing.Size(100,30) +$ButtonContinueExit.Text = "Continue" +$ButtonExportLogging.Name = "ContinueBtn" +$ButtonContinueExit.Add_Click( + {$Looping=$False + $Form.Close() + #[environment]::exit(0) + [System.Windows.Forms.Application]::Exit($null) + }) +$Form.Controls.Add($ButtonContinueExit) + +# Labels +$LabelHeader = New-Object System.Windows.Forms.Label +$LabelHeader.Location = New-Object System.Drawing.Size(240,10) +$LabelHeader.Size = New-Object System.Drawing.Size(500,30) +$LabelHeader.Text = $apptitle +$LabelHeader.Font = New-Object System.Drawing.Font("Verdana",12,[System.Drawing.FontStyle]::Bold) +$LabelHeader.TextAlign = 'TopRight' + +$LabelPendingRestart = New-Object System.Windows.Forms.Label +$LabelPendingRestart.Size = New-Object System.Drawing.Size(150,15) +$LabelPendingRestart.Location = New-Object System.Drawing.Size(38,52) +$LabelPendingRestart.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) +$LabelPendingRestart.Text = "Reboot Required" + +$LabelSupportedModel = New-Object System.Windows.Forms.Label +$LabelSupportedModel.Size = New-Object System.Drawing.Size(150,15) +$LabelSupportedModel.Location = New-Object System.Drawing.Size(38,52) +$LabelSupportedModel.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) +$LabelSupportedModel.Text = "Supported Model" + +$LabelSupportedOS = New-Object System.Windows.Forms.Label +$LabelSupportedOS.Size = New-Object System.Drawing.Size(160,15) +$LabelSupportedOS.Location = New-Object System.Drawing.Size(38,92) +$LabelSupportedOS.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) +$LabelSupportedOS.Text = "Operating System" + +$LabelPowerShell = New-Object System.Windows.Forms.Label +$LabelPowerShell.Size = New-Object System.Drawing.Size(160,15) +$LabelPowerShell.Location = New-Object System.Drawing.Size(38,132) +$LabelPowerShell.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) +$LabelPowerShell.Text = "PowerShell Version" + +$LabelUEFI = New-Object System.Windows.Forms.Label +$LabelUEFI.Size = New-Object System.Drawing.Size(160,15) +$LabelUEFI.Location = New-Object System.Drawing.Size(38,172) +$LabelUEFI.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) +$LabelUEFI.Text = "UEFI Enabled" + +$LabelBIOSRevision = New-Object System.Windows.Forms.Label +$LabelBIOSRevision.Size = New-Object System.Drawing.Size(150,15) +$LabelBIOSRevision.Location = New-Object System.Drawing.Size(278,74) +$LabelBIOSRevision.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) +$LabelBIOSRevision.Text = "Revision" + +$LabelBIOSPassword = New-Object System.Windows.Forms.Label +$LabelBIOSPassword.Size = New-Object System.Drawing.Size(150,15) +$LabelBIOSPassword.Location = New-Object System.Drawing.Size(278,114) +$LabelBIOSPassword.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) +$LabelBIOSPassword.Text = "Password Known" + +$LabelBIOSTPM = New-Object System.Windows.Forms.Label +$LabelBIOSTPM.Size = New-Object System.Drawing.Size(150,15) +$LabelBIOSTPM.Location = New-Object System.Drawing.Size(278,194) +$LabelBIOSTPM.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) +$LabelBIOSTPM.Text = "TPM Exist" + +$LabelBIOSTPMEnabled = New-Object System.Windows.Forms.Label +$LabelBIOSTPMEnabled.Size = New-Object System.Drawing.Size(150,15) +$LabelBIOSTPMEnabled.Location = New-Object System.Drawing.Size(278,234) +$LabelBIOSTPMEnabled.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) +$LabelBIOSTPMEnabled.Text = "TPM Enabled" + +$LabelBIOSTPMActive = New-Object System.Windows.Forms.Label +$LabelBIOSTPMActive.Size = New-Object System.Drawing.Size(150,15) +$LabelBIOSTPMActive.Location = New-Object System.Drawing.Size(278,274) +$LabelBIOSTPMActive.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) +$LabelBIOSTPMActive.Text = "TPM Activated" + +$LabelBIOSVT = New-Object System.Windows.Forms.Label +$LabelBIOSVT.Size = New-Object System.Drawing.Size(150,15) +$LabelBIOSVT.Location = New-Object System.Drawing.Size(554,74) +$LabelBIOSVT.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) +$LabelBIOSVT.Text = "Virtualization Support" + +$LabelBIOSVTDirectIO = New-Object System.Windows.Forms.Label +$LabelBIOSVTDirectIO.Size = New-Object System.Drawing.Size(150,15) +$LabelBIOSVTDirectIO.Location = New-Object System.Drawing.Size(554,114) +$LabelBIOSVTDirectIO.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) +$LabelBIOSVTDirectIO.Text = "Direct I/O" + +$LabelBIOSVTTE = New-Object System.Windows.Forms.Label +$LabelBIOSVTTE.Size = New-Object System.Drawing.Size(150,15) +$LabelBIOSVTTE.Location = New-Object System.Drawing.Size(554,154) +$LabelBIOSVTTE.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) +$LabelBIOSVTTE.Text = "Trusted Execution" + +$LabelLegacyROM = New-Object System.Windows.Forms.Label +$LabelLegacyROM.Size = New-Object System.Drawing.Size(150,15) +$LabelLegacyROM.Location = New-Object System.Drawing.Size(554,234) +$LabelLegacyROM.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) +$LabelLegacyROM.Text = "Legacy ROM Disabled" + +$LabelSecureBoot = New-Object System.Windows.Forms.Label +$LabelSecureBoot.Size = New-Object System.Drawing.Size(150,15) +$LabelSecureBoot.Location = New-Object System.Drawing.Size(554,274) +$LabelSecureBoot.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) +$LabelSecureBoot.Text = "Secure Boot Enabled" + +# CheckBoxes +$CBPrerequisitesOverride = New-Object System.Windows.Forms.CheckBox +$CBPrerequisitesOverride.Location = New-Object System.Drawing.Size(30,205) +$CBPrerequisitesOverride.Size = New-Object System.Drawing.Size(180,20) +$CBPrerequisitesOverride.Text = "Override Prerequisites" +$CBPrerequisitesOverride.Name = "PrerequisitesOverride" +$CBPrerequisitesOverride.Add_CheckedChanged({ + switch ($CBPrerequisitesOverride.Checked) { + $true { Interactive-TabPages -Mode Enable } + $false { Interactive-TabPages -Mode Disable } + } +}) + +$CBContinueOverride = New-Object System.Windows.Forms.CheckBox +$CBContinueOverride.Location = New-Object System.Drawing.Size(455,426) +$CBContinueOverride.Size = New-Object System.Drawing.Size(180,20) +$CBContinueOverride.Text = "Override validation results" +$CBContinueOverride.Name = "validationOverride" +$CBContinueOverride.Add_CheckedChanged({ + switch ($CBContinueOverride.Checked) { + $true { Interactive-Buttons -Mode Enable } + $false { Interactive-Buttons -Mode Disable } + } +}) + + +# GroupBoxes +$GBSystemValidation = New-Object System.Windows.Forms.GroupBox +$GBSystemValidation.Location = New-Object System.Drawing.Size(20,20) +$GBSystemValidation.Size = New-Object System.Drawing.Size(220,210) +$GBSystemValidation.Text = "Pre-Load Validation" + +$GBSystemModel = New-Object System.Windows.Forms.GroupBox +$GBSystemModel.Location = New-Object System.Drawing.Size(20,234) +$GBSystemModel.Size = New-Object System.Drawing.Size(220,138) +$GBSystemModel.Text = "System Information" + +$GBOSVersion = New-Object System.Windows.Forms.GroupBox +$GBOSVersion.Location = New-Object System.Drawing.Size(20,375) +$GBOSVersion.Size = New-Object System.Drawing.Size(220,78) +$GBOSVersion.Text = "Supported Operating Systems" + +$GBBIOSInfo = New-Object System.Windows.Forms.GroupBox +$GBBIOSInfo.Location = New-Object System.Drawing.Size(260,45) +$GBBIOSInfo.Size = New-Object System.Drawing.Size(220,106) +$GBBIOSInfo.Text = "BIOS Info" + +$GBTPMSettings = New-Object System.Windows.Forms.GroupBox +$GBTPMSettings.Location = New-Object System.Drawing.Size(260,164) +$GBTPMSettings.Size = New-Object System.Drawing.Size(220,146) +$GBTPMSettings.Text = "TPM Settings" + +$GBVTSettings = New-Object System.Windows.Forms.GroupBox +$GBVTSettings.Location = New-Object System.Drawing.Size(535,45) +$GBVTSettings.Size = New-Object System.Drawing.Size(220,146) +$GBVTSettings.Text = "Virtualization Settings" + +$GBBootSettings = New-Object System.Windows.Forms.GroupBox +$GBBootSettings.Location = New-Object System.Drawing.Size(535,204) +$GBBootSettings.Size = New-Object System.Drawing.Size(220,106) +$GBBootSettings.Text = "Boot Settings" + +$GBModel = New-Object System.Windows.Forms.GroupBox +$GBModel.Location = New-Object System.Drawing.Size(30,35) +$GBModel.Size = New-Object System.Drawing.Size(200,40) + +$GBOS = New-Object System.Windows.Forms.GroupBox +$GBOS.Location = New-Object System.Drawing.Size(30,75) +$GBOS.Size = New-Object System.Drawing.Size(200,40) + +$GBPS = New-Object System.Windows.Forms.GroupBox +$GBPS.Location = New-Object System.Drawing.Size(30,115) +$GBPS.Size = New-Object System.Drawing.Size(200,40) + +$GBUEFI = New-Object System.Windows.Forms.GroupBox +$GBUEFI.Location = New-Object System.Drawing.Size(30,155) +$GBUEFI.Size = New-Object System.Drawing.Size(200,40) + +$GBBIOSRevision = New-Object System.Windows.Forms.GroupBox +$GBBIOSRevision.Location = New-Object System.Drawing.Size(270,58) +$GBBIOSRevision.Size = New-Object System.Drawing.Size(200,40) + +$GBBIOSPassword = New-Object System.Windows.Forms.GroupBox +$GBBIOSPassword.Location = New-Object System.Drawing.Size(270,98) +$GBBIOSPassword.Size = New-Object System.Drawing.Size(200,40) + +$GBBIOSTPM = New-Object System.Windows.Forms.GroupBox +$GBBIOSTPM.Location = New-Object System.Drawing.Size(270,178) +$GBBIOSTPM.Size = New-Object System.Drawing.Size(200,40) + +$GBBIOSTPMON = New-Object System.Windows.Forms.GroupBox +$GBBIOSTPMON.Location = New-Object System.Drawing.Size(270,218) +$GBBIOSTPMON.Size = New-Object System.Drawing.Size(200,40) + +$GBBIOSTPMACT = New-Object System.Windows.Forms.GroupBox +$GBBIOSTPMACT.Location = New-Object System.Drawing.Size(270,258) +$GBBIOSTPMACT.Size = New-Object System.Drawing.Size(200,40) + +$GBBIOSVT = New-Object System.Windows.Forms.GroupBox +$GBBIOSVT.Location = New-Object System.Drawing.Size(545,58) +$GBBIOSVT.Size = New-Object System.Drawing.Size(200,40) + +$GBBIOSVTDirectIO = New-Object System.Windows.Forms.GroupBox +$GBBIOSVTDirectIO.Location = New-Object System.Drawing.Size(545,98) +$GBBIOSVTDirectIO.Size = New-Object System.Drawing.Size(200,40) + +$GBBIOSVTTE = New-Object System.Windows.Forms.GroupBox +$GBBIOSVTTE.Location = New-Object System.Drawing.Size(545,138) +$GBBIOSVTTE.Size = New-Object System.Drawing.Size(200,40) + +$GBLEGACYROM = New-Object System.Windows.Forms.GroupBox +$GBLEGACYROM.Location = New-Object System.Drawing.Size(545,218) +$GBLEGACYROM.Size = New-Object System.Drawing.Size(200,40) + +$GBSECUREBOOT = New-Object System.Windows.Forms.GroupBox +$GBSECUREBOOT.Location = New-Object System.Drawing.Size(545,258) +$GBSECUREBOOT.Size = New-Object System.Drawing.Size(200,40) + +$GBLogging = New-Object System.Windows.Forms.GroupBox +$GBLogging.Location = New-Object System.Drawing.Size(10,10) +$GBLogging.Size = New-Object System.Drawing.Size(190,350) +$GBLogging.Text = "Logging" +$GBLogging.Name = "Logging" + + +##*============================================= +##* MAIN +##*============================================= +Load-Form diff --git a/OSD-BIOSPrerequisitesTool/OSD-BIOSPrerequisitesTool.ps1 b/OSD-BIOSPrerequisitesTool/OSD-BIOSPrerequisitesTool.ps1 deleted file mode 100644 index 030b65b453ef9067837507af7a79d1e58315d7e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202030 zcmeFa=~EoXv-iteorwGDd3$dJ2N5Cp*r3hYe2z~Xv}0>CAj!7u@FNK%A)ytt`SjpVe`jax=i+_cGJ=5K#nU|sE+nH^(e>v#E zp!ggydw=G=px+eCzs}sBSrN>SHJ1&|en;QF(hL?gr|mGC7c&oa?~_`7qo3=#`#{g# zQ#&wvTc6&Bryi))O?`TyevZz}&8+H~ZQa?>H;ej2@9)%>=RWEF7XvIE7XI#rUN-fY zu{QJ^R9e*&w12H9W_SCZRV%Pv-UkvO+7A8R4`cK6%b6#FeO{kqZ{BuRTtBOOHw4kL zT7s2Fp&!QrcP{GN7y7Yr7iTUB!pEU!=3*_Ob@!N#8yoY!#=9lFI3$MMtLk}2ytWyz z;7>TNUj;6{Jo8a);Ii$(*hgDtXBh5=svOIpTNTc?)ccO)$swH0{%^zQf;a?;dEA2v zE5hq5jj{JJff3#CQoYqF0Uto!=b9B9k@FT@aCFA7ztG@DX703@ojKCVEl0%Di{a@l zQEDS_edIas0r*Ta0Ldfa`CZT*@b$WWB2OVvv+Ad$w{iHga17LIYJr@!QL5yQi1jb^ z{1HLd`QT73;jMg?v0{

&wotOn~P)2 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 From 25b5d86b435ba044c319789834712e246b269e74 Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Wed, 28 Mar 2018 23:20:28 -0400 Subject: [PATCH 10/21] Delete README.md --- OSD-BIOSPrerequisitesTool/README.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 OSD-BIOSPrerequisitesTool/README.md diff --git a/OSD-BIOSPrerequisitesTool/README.md b/OSD-BIOSPrerequisitesTool/README.md deleted file mode 100644 index 8b13789..0000000 --- a/OSD-BIOSPrerequisitesTool/README.md +++ /dev/null @@ -1 +0,0 @@ - From f6ccec182ca66b22271eb27c23abb46e9fbdadae Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Wed, 28 Mar 2018 23:20:58 -0400 Subject: [PATCH 11/21] Rename Set-ComputerName/Set-OSDComputerName.ps1 to ComputerName/Set-OSDComputerName.ps1 --- .../Set-OSDComputerName.ps1 | 286 +++++++++--------- 1 file changed, 143 insertions(+), 143 deletions(-) rename {Set-ComputerName => ComputerName}/Set-OSDComputerName.ps1 (98%) diff --git a/Set-ComputerName/Set-OSDComputerName.ps1 b/ComputerName/Set-OSDComputerName.ps1 similarity index 98% rename from Set-ComputerName/Set-OSDComputerName.ps1 rename to ComputerName/Set-OSDComputerName.ps1 index 17d1139..f966f09 100644 --- a/Set-ComputerName/Set-OSDComputerName.ps1 +++ b/ComputerName/Set-OSDComputerName.ps1 @@ -9,11 +9,11 @@ $BIOSInfo = get-wmiobject Win32_BIOS [string]$SerialNumber = $BIOSInfo.SerialNumber [boolean]$Is64Bit = [boolean]((Get-WmiObject -Class 'Win32_Processor' | Where-Object { $_.DeviceID -eq 'CPU0' } | Select-Object -ExpandProperty 'AddressWidth') -eq 64) -If ($Is64Bit) { [string]$envOSArchitecture = '64-bit' } Else { [string]$envOSArchitecture = '32-bit' } - - -Function Load-Form -{ +If ($Is64Bit) { [string]$envOSArchitecture = '64-bit' } Else { [string]$envOSArchitecture = '32-bit' } + + +Function Load-Form +{ $Form.Controls.AddRange(@( $LabelManufacturer, $LabelModel, @@ -28,15 +28,15 @@ Function Load-Form $TBComputerName, $GBComputerName, $ButtonOK - )) - #$Form.Add_Shown({Retrieve-SystemInfo -DisplayType "Basic" -DisplayOutbox -IgnorePing}) - $Form.Add_Shown({Get-SystemImage}) - $Form.Add_Shown({$Form.Activate()}) - [void] $Form.ShowDialog() - -} - -Function Get-SystemImage{ + )) + #$Form.Add_Shown({Retrieve-SystemInfo -DisplayType "Basic" -DisplayOutbox -IgnorePing}) + $Form.Add_Shown({Get-SystemImage}) + $Form.Add_Shown({$Form.Activate()}) + [void] $Form.ShowDialog() + +} + +Function Get-SystemImage{ $system = Get-WMIObject -class Win32_systemenclosure $type = $system.chassistypes @@ -67,67 +67,67 @@ Function Get-SystemImage{ "23" {$type = "Rack Mount Chassis";$PBDELLCHASSIS.Image = $Null} "24" {$type = "Sealed-Case PC";$PBDELLCHASSIS.Image = $Null} Default {$type = "Unknown";$PBDELLCHASSIS.Image = $Null} - } - $LabelModel.Visible = $true -} - -Function Get-OSDComputerName{ - If ($ComputerName.StartsWith('MININT')) { - If ($serialNumber.StartsWith('System')){ - return "[Unit]-[identifier]" - } - Else{ - return "[Unit]-" + $serialNumber - } - } - ElseIf ($ComputerName.StartsWith('MINWINPC')) { - If ($serialNumber.StartsWith('System')){ - return "[Unit]-[identifier]" - } - Else{ - return "[Unit]-" + $serialNumber - } - } - Else { - return $ComputerName - } -} -Function Set-OSDComputerName -{ - $ErrorProvider.Clear() - $ErrorProvider.SetIconPadding($GBComputerName, 10) - $ErrorProvider.SetIconAlignment($GBComputerName, "MiddleRight") - - if ($TBComputerName.Text.Length -eq 0) - { - $ErrorProvider.SetError($GBComputerName, "Please enter a computer name.") - } - - elseif ($TBComputerName.Text.Length -gt 15) - { - $ErrorProvider.SetError($GBComputerName, "Computer name cannot be more than 15 characters.") - } - - elseif ($TBComputerName.Text -eq $serialNumber) - { - $ErrorProvider.SetError($GBComputerName, "Computer name cannot be just the serial number.") - } - - #Validation Rule for computer names. - elseif ($TBComputerName.Text -match "^[-_]|[^a-zA-Z0-9-_]") - { - $ErrorProvider.SetError($GBComputerName, "Computer name invalid, please correct the computer name.") - } - - else - { - $OSDComputerName = $TBComputerName.Text.ToUpper() - $TSEnv = New-Object -COMObject Microsoft.SMS.TSEnvironment - $TSEnv.Value("OSDComputerName") = "$($OSDComputerName)" - $Form.Close() - } -} - + } + $LabelModel.Visible = $true +} + +Function Get-OSDComputerName{ + If ($ComputerName.StartsWith('MININT')) { + If ($serialNumber.StartsWith('System')){ + return "[Unit]-[identifier]" + } + Else{ + return "[Unit]-" + $serialNumber + } + } + ElseIf ($ComputerName.StartsWith('MINWINPC')) { + If ($serialNumber.StartsWith('System')){ + return "[Unit]-[identifier]" + } + Else{ + return "[Unit]-" + $serialNumber + } + } + Else { + return $ComputerName + } +} +Function Set-OSDComputerName +{ + $ErrorProvider.Clear() + $ErrorProvider.SetIconPadding($GBComputerName, 10) + $ErrorProvider.SetIconAlignment($GBComputerName, "MiddleRight") + + if ($TBComputerName.Text.Length -eq 0) + { + $ErrorProvider.SetError($GBComputerName, "Please enter a computer name.") + } + + elseif ($TBComputerName.Text.Length -gt 15) + { + $ErrorProvider.SetError($GBComputerName, "Computer name cannot be more than 15 characters.") + } + + elseif ($TBComputerName.Text -eq $serialNumber) + { + $ErrorProvider.SetError($GBComputerName, "Computer name cannot be just the serial number.") + } + + #Validation Rule for computer names. + elseif ($TBComputerName.Text -match "^[-_]|[^a-zA-Z0-9-_]") + { + $ErrorProvider.SetError($GBComputerName, "Computer name invalid, please correct the computer name.") + } + + else + { + $OSDComputerName = $TBComputerName.Text.ToUpper() + $TSEnv = New-Object -COMObject Microsoft.SMS.TSEnvironment + $TSEnv.Value("OSDComputerName") = "$($OSDComputerName)" + $Form.Close() + } +} + Function Retrieve-SystemInfo <# .SYNOPSIS @@ -353,8 +353,8 @@ Function Retrieve-SystemInfo $data.GetEnumerator() | Sort-Object 'Name' | Format-Table -AutoSize } If($DisplayForm){$data.GetEnumerator() | Sort-Object 'Name' | Out-GridView -Title "$env:ComputerName Information"} -} - +} + function Clear-OutputBox { $OutputBox.ResetText() } @@ -384,31 +384,31 @@ function Write-OutputBox { } } } - - + + ##*============================================= ##* ASSEMBLIES ##*============================================= Add-Type -AssemblyName "System.Drawing" -Add-Type -AssemblyName "System.Windows.Forms" - -$Global:ErrorProvider = New-Object System.Windows.Forms.ErrorProvider - +Add-Type -AssemblyName "System.Windows.Forms" + +$Global:ErrorProvider = New-Object System.Windows.Forms.ErrorProvider + $FormWidth = 805 -$FormHeight = 530 - -$Form = New-Object System.Windows.Forms.Form +$FormHeight = 530 + +$Form = New-Object System.Windows.Forms.Form $Form.Size = New-Object System.Drawing.Size($FormWidth,$FormHeight) $Form.MinimumSize = New-Object System.Drawing.Size($FormWidth,$FormHeight) -$Form.MaximumSize = New-Object System.Drawing.Size($FormWidth,$FormHeight) -$Form.StartPosition = "CenterScreen" -$Form.SizeGripStyle = "Hide" -$Form.Text = "Enter Computer Name" -$Form.ControlBox = $false -$Form.TopMost = $true - -#Pictures +$Form.MaximumSize = New-Object System.Drawing.Size($FormWidth,$FormHeight) +$Form.StartPosition = "CenterScreen" +$Form.SizeGripStyle = "Hide" +$Form.Text = "Enter Computer Name" +$Form.ControlBox = $false +$Form.TopMost = $true + +#Pictures $DesktopBase64String = "iVBORw0KGgoAAAANSUhEUgAAANwAAAChCAYAAACs5tGeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAAw9pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 @@ -806,8 +806,8 @@ YII=" $DesktopImageBytes = [Convert]::FromBase64String($DesktopBase64String) $DesktopMemoryStream = New-Object -TypeName IO.MemoryStream($DesktopImageBytes, 0, $DesktopImageBytes.Length) $DesktopMemoryStream.Write($DesktopImageBytes, 0, $DesktopImageBytes.Length) -$DesktopImage = [System.Drawing.Image]::FromStream($DesktopMemoryStream, $true) - +$DesktopImage = [System.Drawing.Image]::FromStream($DesktopMemoryStream, $true) + $LaptopBase64String = "iVBORw0KGgoAAAANSUhEUgAAANwAAAChCAYAAACs5tGeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAAw9pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 @@ -1112,13 +1112,13 @@ C+uKj634nMG+ffsqpVRklgi4d8f7CmZjlXQfg+Q/YLArk56O08lafkuib5hQLY4dWQuwxC6SmFo4 nEbU2dCDKhkjMjg2zJiBhAkTwMW2ktxTCZDz74zPu7m6uvpvlpaW6vi1I+AiRYqAixQpUgRcpEgR cJEiRcBFihQpAi5SpAi4SJEiRcBFihQBFylSBFykSJEi4CJFioCLFClSBFykSBFwkSJFioCLFCkC LlKkCLhIkSJFwEWKFAEXKVKkCLhIkSLgIkWKgIsUKVIEXKRIEXCRIkWKgIsUKQIuUqRIEXCRIkXA -RYoUARcpUqQIuEiRIuAiRYoUARcp0v1A/0eAAQCjhIFTZsTX9AAAAABJRU5ErkJggg==" +RYoUARcpUqQIuEiRIuAiRYoUARcp0v1A/0eAAQCjhIFTZsTX9AAAAABJRU5ErkJggg==" $LaptopImageBytes = [Convert]::FromBase64String($LaptopBase64String) $LaptopMemoryStream = New-Object -TypeName IO.MemoryStream($LaptopImageBytes, 0, $LaptopImageBytes.Length) $LaptopMemoryStream.Write($LaptopImageBytes, 0, $LaptopImageBytes.Length) -$LaptopImage = [System.Drawing.Image]::FromStream($LaptopMemoryStream, $true) - - +$LaptopImage = [System.Drawing.Image]::FromStream($LaptopMemoryStream, $true) + + $VMBase64String = "iVBORw0KGgoAAAANSUhEUgAAANwAAAChCAYAAACs5tGeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAAw9pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 @@ -1239,73 +1239,73 @@ nreImO1vz58//yF3JoMAXF7U1dV1t6+v749ra2t31dTUHC0rK9svBt4a8VThCxnWPoAMa54s5c+4 cRgyLP75TfF9/LKjo+N/BgcH0escwOVfU1NTVltb23W+4duAAFye9N5778mdcLiX5MtMQHzTFBYT Tk5O0uHDhzGY/N8ZBg4EvTxhWgCCABwEATgIggAcBAE4CIIAHAQBOAgCcBAEATgIAnAQBAE4CAJw EATgIAgCcBAE4CAIAnAQBOAgCAJwEATgIAjAQRAE4CAIwEEQBOAgCMBBEICDIAjAQRCAgyAIwEEQ -gIMgCMBBEICDIAAHQRCAgyAAB0EQgIMgAAdBAA6CoBem/xdgAKqN9AhMwYoOAAAAAElFTkSuQmCC" +gIMgCMBBEICDIAAHQRCAgyAAB0EQgIMgAAdBAA6CoBem/xdgAKqN9AhMwYoOAAAAAElFTkSuQmCC" $VMImageBytes = [Convert]::FromBase64String($VMBase64String) $VMMemoryStream = New-Object -TypeName IO.MemoryStream($VMImageBytes, 0, $VMImageBytes.Length) $VMMemoryStream.Write($VMImageBytes, 0, $VMImageBytes.Length) -$VMImage = [System.Drawing.Image]::FromStream($VMMemoryStream, $true) - +$VMImage = [System.Drawing.Image]::FromStream($VMMemoryStream, $true) + # PictureBoxes $PBDELLCHASSIS = New-Object -TypeName System.Windows.Forms.PictureBox $PBDELLCHASSIS.Location = New-Object -TypeName System.Drawing.Size(38,20) -$PBDELLCHASSIS.Size = New-Object -TypeName System.Drawing.Size(220,160) - +$PBDELLCHASSIS.Size = New-Object -TypeName System.Drawing.Size(220,160) + $LabelManufacturer = New-Object System.Windows.Forms.Label $LabelManufacturer.Location = New-Object System.Drawing.Size(38,210) $LabelManufacturer.Size = New-Object System.Drawing.Size(160,15) -$LabelManufacturer.Text = $Manufacturer - +$LabelManufacturer.Text = $Manufacturer + $LabelModel = New-Object System.Windows.Forms.Label $LabelModel.Location = New-Object System.Drawing.Size(38,235) $LabelModel.Size = New-Object System.Drawing.Size(160,15) -$LabelModel.Text = $Model - +$LabelModel.Text = $Model + $LabelSerial = New-Object System.Windows.Forms.Label $LabelSerial.Location = New-Object System.Drawing.Size(38,260) $LabelSerial.Size = New-Object System.Drawing.Size(160,15) -$LabelSerial.Text = $SerialNumber - +$LabelSerial.Text = $SerialNumber + $GBModel = New-Object System.Windows.Forms.GroupBox $GBModel.Location = New-Object System.Drawing.Size(20,180) -$GBModel.Size = New-Object System.Drawing.Size(220,120) -$GBModel.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) -$GBModel.Text = "Model" - +$GBModel.Size = New-Object System.Drawing.Size(220,120) +$GBModel.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) +$GBModel.Text = "Model" + $GBSystemInfo = New-Object System.Windows.Forms.GroupBox $GBSystemInfo.Location = New-Object System.Drawing.Size(20,324) $GBSystemInfo.Size = New-Object System.Drawing.Size(220,138) $GBSystemInfo.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) -$GBSystemInfo.Text = "System Information" +$GBSystemInfo.Text = "System Information" $OutputBoxSysInfo = New-Object System.Windows.Forms.RichTextBox $OutputBoxSysInfo.Location = New-Object System.Drawing.Size(30,340) $OutputBoxSysInfo.Size = New-Object System.Drawing.Size(200,115) $OutputBoxSysInfo.BackColor = "white" $OutputBoxSysInfo.ReadOnly = $true -$OutputBoxSysInfo.MultiLine = $True - -$TBComputerName = New-Object System.Windows.Forms.TextBox -$TBComputerName.Location = New-Object System.Drawing.Size(310,80) -$TBComputerName.Size = New-Object System.Drawing.Size(390,80) -$TBComputerName.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","18",[System.Drawing.FontStyle]::Bold) -$TBComputerName.TabIndex = "1" -$TBComputerName.Text = Get-OSDComputerName - -$GBComputerName = New-Object System.Windows.Forms.GroupBox -$GBComputerName.Location = New-Object System.Drawing.Size(290,50) -$GBComputerName.Size = New-Object System.Drawing.Size(440,90) -$GBComputerName.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","10",[System.Drawing.FontStyle]::Bold) -$GBComputerName.Text = "Computer name:" - -$ButtonOK = New-Object System.Windows.Forms.Button -$ButtonOK.Location = New-Object System.Drawing.Size(655,400) -$ButtonOK.Size = New-Object System.Drawing.Size(100,60) -$ButtonOK.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","10",[System.Drawing.FontStyle]::Bold) -$ButtonOK.Text = "Set" -$ButtonOK.TabIndex = "2" -$ButtonOK.Add_Click({Set-OSDComputerName}) - -$Form.KeyPreview = $True -$Form.Add_KeyDown({if ($_.KeyCode -eq "Enter"){Set-OSDComputerName}}) - -Load-Form \ No newline at end of file +$OutputBoxSysInfo.MultiLine = $True + +$TBComputerName = New-Object System.Windows.Forms.TextBox +$TBComputerName.Location = New-Object System.Drawing.Size(310,80) +$TBComputerName.Size = New-Object System.Drawing.Size(390,80) +$TBComputerName.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","18",[System.Drawing.FontStyle]::Bold) +$TBComputerName.TabIndex = "1" +$TBComputerName.Text = Get-OSDComputerName + +$GBComputerName = New-Object System.Windows.Forms.GroupBox +$GBComputerName.Location = New-Object System.Drawing.Size(290,50) +$GBComputerName.Size = New-Object System.Drawing.Size(440,90) +$GBComputerName.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","10",[System.Drawing.FontStyle]::Bold) +$GBComputerName.Text = "Computer name:" + +$ButtonOK = New-Object System.Windows.Forms.Button +$ButtonOK.Location = New-Object System.Drawing.Size(655,400) +$ButtonOK.Size = New-Object System.Drawing.Size(100,60) +$ButtonOK.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","10",[System.Drawing.FontStyle]::Bold) +$ButtonOK.Text = "Set" +$ButtonOK.TabIndex = "2" +$ButtonOK.Add_Click({Set-OSDComputerName}) + +$Form.KeyPreview = $True +$Form.Add_KeyDown({if ($_.KeyCode -eq "Enter"){Set-OSDComputerName}}) + +Load-Form From 2dbc31208ebbcf8a0325c64aecb32549bb764cec Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Wed, 28 Mar 2018 23:21:11 -0400 Subject: [PATCH 12/21] Create RE --- ComputerName/RE | 1 + 1 file changed, 1 insertion(+) create mode 100644 ComputerName/RE diff --git a/ComputerName/RE b/ComputerName/RE new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/ComputerName/RE @@ -0,0 +1 @@ + From 35b5c8ed7fb157a0723c6bcdd1d1f536ab2b8242 Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Wed, 28 Mar 2018 23:21:24 -0400 Subject: [PATCH 13/21] Update and rename RE to README.md --- ComputerName/{RE => README.md} | 1 + 1 file changed, 1 insertion(+) rename ComputerName/{RE => README.md} (50%) diff --git a/ComputerName/RE b/ComputerName/README.md similarity index 50% rename from ComputerName/RE rename to ComputerName/README.md index 8b13789..139597f 100644 --- a/ComputerName/RE +++ b/ComputerName/README.md @@ -1 +1,2 @@ + From 729fc895eb123499bb8ee491877ab64964f5edcc Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Wed, 28 Mar 2018 23:21:41 -0400 Subject: [PATCH 14/21] Delete README --- Set-ComputerName/README | 1 - 1 file changed, 1 deletion(-) delete mode 100644 Set-ComputerName/README diff --git a/Set-ComputerName/README b/Set-ComputerName/README deleted file mode 100644 index 8b13789..0000000 --- a/Set-ComputerName/README +++ /dev/null @@ -1 +0,0 @@ - From 9f8493c835a061854837a9b6d6e8efa5fee4fe12 Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Wed, 28 Mar 2018 23:42:52 -0400 Subject: [PATCH 15/21] Delete REA --- BIOSPrerequisitesTool/REA | 1 - 1 file changed, 1 deletion(-) delete mode 100644 BIOSPrerequisitesTool/REA diff --git a/BIOSPrerequisitesTool/REA b/BIOSPrerequisitesTool/REA deleted file mode 100644 index 8b13789..0000000 --- a/BIOSPrerequisitesTool/REA +++ /dev/null @@ -1 +0,0 @@ - From e396139952cca960275a7e5d6301c4e938177469 Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Wed, 28 Mar 2018 23:43:01 -0400 Subject: [PATCH 16/21] Delete OSD-BIOSPrerequisitesTool.ps1 --- .../OSD-BIOSPrerequisitesTool.ps1 | 2264 ----------------- 1 file changed, 2264 deletions(-) delete mode 100644 BIOSPrerequisitesTool/OSD-BIOSPrerequisitesTool.ps1 diff --git a/BIOSPrerequisitesTool/OSD-BIOSPrerequisitesTool.ps1 b/BIOSPrerequisitesTool/OSD-BIOSPrerequisitesTool.ps1 deleted file mode 100644 index ced8e67..0000000 --- a/BIOSPrerequisitesTool/OSD-BIOSPrerequisitesTool.ps1 +++ /dev/null @@ -1,2264 +0,0 @@ -#======================================================================== -# -# Created: 2016-04-22 -# Author: Richard tracy -# Idea From: Nickolaj Andersen -# -#======================================================================== -[void][Reflection.Assembly]::LoadWithPartialName("System.Security") -## Variables: Script Name and Script Paths -[string]$scriptPath = $MyInvocation.MyCommand.Definition -[string]$scriptName = [IO.Path]::GetFileNameWithoutExtension($scriptPath) -[string]$scriptFileName = Split-Path -Path $scriptPath -Leaf -[string]$scriptRoot = Split-Path -Path $scriptPath -Parent -[string]$invokingScript = (Get-Variable -Name 'MyInvocation').Value.ScriptName - -#include additional extensions -If (Test-Path -Path ($scriptRoot + '.\PowershellModules\functions.ps1')){ -. ($scriptRoot + '.\PowershellModules\functions.ps1') -} -# Get the invoking script directory -If ($invokingScript) { - # If this script was invoked by another script - [string]$scriptParentPath = Split-Path -Path $invokingScript -Parent -} -Else { - # If this script was not invoked by another script, fall back to the directory one level above this script - [string]$scriptParentPath = (Get-Item -LiteralPath $scriptRoot).Parent.FullName -} - -##*============================================= -##* READ CONFIG.XML FILE -##*============================================= -[string]$ConfigFile = Join-Path -Path $scriptRoot -ChildPath 'OSD-BIOSConfig.xml' -[xml]$XmlConfigFile = Get-Content $ConfigFile -$UseRemoteInstead = $XmlConfigFile.app.configs.useRemote.remote -If ($UseRemoteInstead -eq $true){ - $remoteConfig = $XmlConfigFile.app.configs.useRemote.path - If (Test-Path $remoteConfig){ - [xml]$XmlConfigFile = Get-Content $remoteConfig - } -} -$apptitle = $XmlConfigFile.app.title -$appversion = $XmlConfigFile.app.version -$TabPageConfigs = $XmlConfigFile.app.configs.pagetabs.tab - -$SupportedOperatingSystems = $XmlConfigFile.app.supported.OSbuilds.OS -$MinimumOS = $SupportedOperatingSystems | Where-Object id -eq "minimum" -[int]$MinimumOSversion = $MinimumOS.version - -$SupportedSystems = $XmlConfigFile.app.supported.hardwarePlatforms.system -$SupportedManufacturers = $SupportedSystems.manufacturer | sort -Unique -$SupportedModels = $SupportedSystems.model - -[Xml.XmlElement]$XMLAdditionalProviders = $XmlConfigFile.app.configs.additionalProviders -[array]$DellProviders = $XMLAdditionalProviders.provider | Where-Object {$_.platformsupport -eq "Dell Inc."} -Foreach ($provider in $DellProviders){ - #write-host $provider.name - #write-host $provider.enabled - If ($provider.name -eq "Dell Command | Configure Toolkit"){ - If ($provider.enabled -eq "true") { - $UseDellCCTK = $true - }Else { - $UseDellCCTK = $false - } - - [string]$DellCCTKPath = $provider.path_x64 - [string]$DellCCTKPathx86 = $provider.path_x86 - - } - If ($provider.name -eq "DellBIOSPowershell"){ - If ($provider.enabled -eq "true") { - $UseDellPSProvider = $true - }Else { - $UseDellPSProvider = $false - } - [string]$DellPSProviderPath = $provider.path_x64 - [string]$DellPSProviderPathX86 = $provider.path_x86 - } - -} - - -#[array]$BIOSKnownUsedpwd = @($XmlConfigFile.app.configs.knownBIOSPasswords.password) -[array]$BIOSKnownUsedpwd = @($XmlConfigFile.app.configs.knownBIOSPasswords.cryptpassword) -#to encrypt load Encrypt-String and then run it, copy the results in config file -#Encrypt-String -String -Passphrase "" - -If ($XmlConfigFile.app.configs.debugmode -eq 'true'){ - [Boolean]$Global:LogDebugMode = $True -} Else { - [Boolean]$Global:LogDebugMode = $False -} - -If ($XmlConfigFile.app.configs.alwaysCheckBIOS -eq 'true'){ - [Boolean]$Global:IgnorePrereqs = $true -} Else { - [Boolean]$Global:IgnorePrereqs = $false -} -##*============================================= -##* VARIABLE DECLARATION -##*============================================= - -$Global:SMCSharedData = 0 -$ComputerName = $env:COMPUTERNAME -$ComputerSystem = Get-WmiObject -Namespace "root\cimv2" -Class Win32_ComputerSystem -[string]$Manufacturer = $ComputerSystem.Manufacturer -[string]$Model = $ComputerSystem.Model -[int]$OSProductType = Get-WmiObject -Namespace "root\cimv2" -Class Win32_OperatingSystem | Select-Object -ExpandProperty ProductType -[string]$OSCaption = Get-WmiObject -Namespace "root\cimv2" -Class Win32_OperatingSystem | Select-Object -ExpandProperty Caption -[int]$OSMajor = ([System.Environment]::OSVersion.Version).Major -[int]$OSBuildNumber = ([System.Environment]::OSVersion.Version).Build - - -[boolean]$Is64Bit = [boolean]((Get-WmiObject -Class 'Win32_Processor' | Where-Object { $_.DeviceID -eq 'CPU0' } | Select-Object -ExpandProperty 'AddressWidth') -eq 64) -If ($Is64Bit) { [string]$envOSArchitecture = '64-bit' } Else { [string]$envOSArchitecture = '32-bit' } - - -##*============================================= -##* FUNCTIONS -##*============================================= -function Load-Form { - $Form.Controls.Add($TabControl) - $TabControl.Controls.AddRange(@( - $TabSHBPage, - $TabLoggingPage - )) - $TabSHBPage.Controls.AddRange(@( - $ProgressBar, - $LabelHeader, - $LabelSupportedModel, - $LabelSupportedOS, - #$LabelPowerShell, - $LabelUEFI, - $OutputBoxSysInfo, - - $LabelBIOSRevision, - $LabelBIOSPassword, - $LabelBIOSTPM, - $LabelBIOSTPMEnabled, - $LabelBIOSTPMActive, - $LabelBIOSVT, - $LabelBIOSVTTE, - $LabelBIOSVTDirectIO, - $LabelLegacyROM, - $LabelSecureBoot, - - #$PBReboot, - $PBModel, - $PBOS, - #$PBPS, - $PBUEFI, - - #$GBReboot, - $GBModel, - $GBOS, - #$GBPS, - $GBUEFI, - - $PBBIOSRevision, - $PBBIOSPassword, - $PBBIOSTPM, - $PBBIOSTPMON, - $PBBIOSTPMACT, - $PBBIOSVT, - $PBBIOSVTDirectIO, - $PBBIOSVTTE, - $PBLEGACYOROM, - $PBSECUREBOOT, - - $LBOSVersions, - $GBOSVersion, - $GBSystemModel, - - $GBBIOSRevision, - $GBBIOSPassword, - $GBBIOSTPM, - $GBBIOSTPMON, - $GBBIOSTPMACT, - $GBBIOSVT, - $GBBIOSVTDirectIO, - $GBBIOSVTTE, - $GBLEGACYROM, - $GBSECUREBOOT, - - $GBBIOSInfo, - $GBTPMSettings, - $GBVTSettings, - $GBBootSettings, - - $CBPrerequisitesOverride, - $GBSystemValidation, - - #$CBContinueOverride, - $ButtonContinueExit - )) - $Form.Add_Shown({Retrieve-SystemInfo -DisplayType "Basic" -DisplayOutbox -IgnorePing}) - $Form.Add_Shown({Validate-RunChecks}) - $Form.Add_Shown({Validate-BIOSChecks}) - $Form.Add_Shown({$Form.Activate()}) - [void]$Form.ShowDialog() -} - -function Load-LoggingPage { - if (-not(($TabLoggingPage.Controls | Measure-Object).Count -ge 1)) { - $TabLoggingPage.Controls.Clear() - $TabLoggingPage.Controls.AddRange(@( - $OutputBoxLogging, - $ButtonExportLogging - )) - } - if ($ButtonExportLogging.Enabled -eq $false) { - $ButtonExportLogging.Enabled = $true - } -} - -function Interactive-TabPages { - param( - [parameter(Mandatory=$true)] - [ValidateSet("Enable","Disable")] - $Mode - ) - Begin { - $CurrentTabPage = $TabControl.SelectedTab.Name - switch ($Mode) { - "Enable" { $TabPageMode = $true } - "Disable" { $TabPageMode = $false } - } - $TabNameArrayList = New-Object -TypeName System.Collections.ArrayList - foreach ($TabNameArrayListObject in (($TabControl.TabPages.Name))) { - $TabNameArrayList.Add($TabNameArrayListObject) - } - } - Process { - foreach ($TabPageObject in $TabNameArrayList) { - if ($Mode -like "Disable") { - if ($CurrentTabPage -like "SHB") { - $TabLoggingPage.Enabled = $TabPageMode - } - } - else { - $TabSHBPage.Enabled = $TabPageMode - $TabLoggingPage.Enabled = $TabPageMode - } - } - } -} - -function Interactive-Buttons { - param( - [parameter(Mandatory=$true)] - [ValidateSet("Enable","Disable")] - $Mode, - [parameter(Mandatory=$true)] - [ValidateSet("Prerequisites","Validation")] - $Module - ) - Begin { - switch ($Mode) { - "Enable" { $TabPageButtonMode = $true } - "Disable" { $TabPageButtonMode = $false } - } - } - Process { - if ($Module -eq "Validation") { - foreach ($Control in $TabPageSiteRoles.Controls) { - if ($Control.GetType().ToString() -eq "System.Windows.Forms.ComboBox") { - $Control.Enabled = $TabPageButtonMode - } - } - } - if ($Module -eq "Prerequisites") { - foreach ($Control in $TabPageOther.Controls) { - if ($Control.GetType().ToString() -eq "System.Windows.Forms.CheckBox") { - $Control.Enabled = $TabPageRadioButtonMode - } - - } - } - } -} - -function Validate-RunChecks { - $ValidateCounter = 0 - <#if (Validate-PendingReboot) { - $ValidateCounter++ - }#> - if (Validate-System) { - $ValidateCounter++ - } - if (Validate-OSBuild) { - $ValidateCounter++ - } - <#if (Validate-PowerShellVer) { - $ValidateCounter++ - } - if (Validate-Elevated) { - $ValidateCounter++ - }#> - if (Validate-UEFICheck) { - $ValidateCounter++ - } - if ($ValidateCounter -ge 3) { - Interactive-TabPages -Mode Enable - Write-OutputBox -OutputBoxMessage "All validation checks passed successfully" -Type "INFO: " -Object Logging - $CBPrerequisitesOverride.Enabled = $false - } - else { - Interactive-TabPages -Mode Disable - Write-OutputBox -OutputBoxMessage "All validation checks did not pass successfully, remediate the errors and re-launch the tool or check the override checkbox to use the tool anyway" -Type "ERROR: " -Object Logging - } - If ($IgnorePrereqs){ - return $global:PreValidation = $true - } Else { - return $global:PreValidation = $ValidateCounter - } -} - -function Validate-BIOSChecks { - $ProgressBar.Value = 0 - $ProgressBar.Maximum = 11 - $ValidateCounter = 0 - $ProgressBar.PerformStep() - if (Load-SystemProvider) { - $ValidateCounter++ - } - $ProgressBar.PerformStep() - if (Validate-BIOSRevision) { - $ValidateCounter++ - } - $ProgressBar.PerformStep() - if (Validate-BIOSPassword) { - $ValidateCounter++ - } - $ProgressBar.PerformStep() - if (Validate-LegacyROM) { - $ValidateCounter++ - } - $ProgressBar.PerformStep() - if (Validate-SecureBoot) { - $ValidateCounter++ - } - $ProgressBar.PerformStep() - if (Validate-TPMModule) { - $ValidateCounter++ - } - $ProgressBar.PerformStep() - if (Validate-TPMEnabled) { - $ValidateCounter++ - } - $ProgressBar.PerformStep() - if (Validate-TPMActivated) { - $ValidateCounter++ - } - $ProgressBar.PerformStep() - if (Validate-VTFeature) { - $ValidateCounter++ - } - $ProgressBar.PerformStep() - if (Validate-VTDirectIO) { - $ValidateCounter++ - } - $ProgressBar.PerformStep() - if (Validate-VTTrustedExecution) { - $ValidateCounter++ - } - if ($ValidateCounter -ge 11) { - #Interactive-TabPages -Mode Enable - Write-OutputBox -OutputBoxMessage "BIOS checks passed successfully" -Type "INFO: " -Object Logging - $CBContinueOverride.Enabled = $false - } - else { - #Interactive-TabPages -Mode Disable - Write-OutputBox -OutputBoxMessage "BIOS checks did not pass successfully, system may not be compatible for Secure Host Baseline." -Type "ERROR: " -Object Logging - } -} - -Function Retrieve-SystemInfo - <# - .SYNOPSIS - Get Complete details of any server Local or remote - .DESCRIPTION - This function uses WMI class to connect to remote machine and get all related details - .PARAMETER COMPUTERNAMES - Just Pass computer name as Its parameter - .EXAMPLE - Retrieve-SystemInfo - .EXAMPLE - Retrieve-SystemInfo -ComputerName HQSPDBSP01 - .NOTES - To get help: - Get-Help Retrieve-SystemInfo - .LINK - http://sqlpowershell.wordpress.com - #> - - { - param( - [ValidateSet("Detail","Basic","NetInfo")] - [string]$DisplayType = "Detail", - [switch] $DisplayForm = $false, - [switch] $DisplayOutbox = $false, - [switch] $IgnorePing - ) - - # Declare main data hash to be populated later - $data = @{} - $data.' Computer Name:' = $env:ComputerName - - If($DisplayType -eq "Detail"){ - # Do a DNS lookup with a .NET class method. Suppress error messages. - $ErrorActionPreference = 'SilentlyContinue' - if ( $ips = [System.Net.Dns]::GetHostAddresses($env:ComputerName) | foreach { $_.IPAddressToString } ) { - $data.'IP Address(es) from DNS' = ($ips -join ', ') - } - else { - $data.'IP Address from DNS' = 'Could not resolve' - } - # Make errors visible again - $ErrorActionPreference = 'Continue' - - # We'll assume no ping reply means it's dead. Try this anyway if -IgnorePing is specified - if ($ping -or $ignorePing) { - $data.'WMI Data Collection Attempt' = 'Yes (ping reply or -IgnorePing)' - - # Get various info from the ComputerSystem WMI class - if ($wmi = Get-WmiObject -Class Win32_ComputerSystem -ErrorAction SilentlyContinue) { - $data.'Computer Hardware Manufacturer' = $wmi.Manufacturer - $data.'Computer Hardware Model' = $wmi.Model - $data.'Memory Physical in MB' = ($wmi.TotalPhysicalMemory/1MB).ToString('N') - $data.'Logged On User' = $wmi.Username - } - $wmi = $null - - # Get the free/total disk space from local disks (DriveType 3) - if ($wmi = Get-WmiObject -Class Win32_LogicalDisk -Filter 'DriveType=3' -ErrorAction SilentlyContinue) { - $wmi | Select 'DeviceID', 'Size', 'FreeSpace' | Foreach { - $data."Local disk $($_.DeviceID)" = ('' + ($_.FreeSpace/1MB).ToString('N') + ' MB free of ' + ($_.Size/1MB).ToString('N') + ' MB total space with ' + ($_.Size/1MB - $_.FreeSpace/1MB).ToString('N') +' MB Used Space') - } - } - $wmi = $null - - # Get IP addresses from all local network adapters through WMI - if ($wmi = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ErrorAction SilentlyContinue) { - $Ips = @{} - $wmi | Where { $_.IPAddress -match '\S+' } | Foreach { $Ips.$($_.IPAddress -join ', ') = $_.MACAddress } - $counter = 0 - $Ips.GetEnumerator() | Foreach { - $counter++; $data."IP Address $counter" = '' + $_.Name + ' (MAC: ' + $_.Value + ')' - } - } - $wmi = $null - - # Get CPU information with WMI - if ($wmi = Get-WmiObject -Class Win32_Processor -ErrorAction SilentlyContinue) { - $wmi | Foreach { - $maxClockSpeed = $_.MaxClockSpeed - $numberOfCores += $_.NumberOfCores - $description = $_.Description - $numberOfLogProc += $_.NumberOfLogicalProcessors - $socketDesignation = $_.SocketDesignation - $status = $_.Status - $manufacturer = $_.Manufacturer - $name = $_.Name - } - $data.'CPU Clock Speed' = $maxClockSpeed - $data.'CPU Cores' = $numberOfCores - $data.'CPU Description' = $description - $data.'CPU Logical Processors' = $numberOfLogProc - $data.'CPU Socket' = $socketDesignation - $data.'CPU Status' = $status - $data.'CPU Manufacturer' = $manufacturer - $data.'CPU Name' = $name -replace '\s+', ' ' - } - $wmi = $null - - # Get BIOS info from WMI - if ($wmi = Get-WmiObject -Class Win32_Bios -ErrorAction SilentlyContinue) { - $data.'BIOS Manufacturer' = $wmi.Manufacturer - $data.'BIOS Name' = $wmi.Name - $data.'BIOS Version' = $wmi.Version - $data.'BIOS SM Version:' = $wmi.SMBIOSBIOSVersion - } - $wmi = $null - - # Get operating system info from WMI - if ($wmi = Get-WmiObject -Class Win32_OperatingSystem -ErrorAction SilentlyContinue) { - $data.'OS Boot Time' = $wmi.ConvertToDateTime($wmi.LastBootUpTime) - $data.'OS System Drive' = $wmi.SystemDrive - $data.'OS System Device' = $wmi.SystemDevice - $data.'OS Language ' = $wmi.OSLanguage - $data.'OS Version' = $wmi.Version - $data.'OS Windows dir' = $wmi.WindowsDirectory - $data.'OS Name' = $wmi.Caption - $data.'OS Install Date' = $wmi.ConvertToDateTime($wmi.InstallDate) - $data.'OS Service Pack' = [string]$wmi.ServicePackMajorVersion + '.' + $wmi.ServicePackMinorVersion - } - # Scan for open ports - $ports = @{ - 'File shares/RPC' = '139' ; - 'File shares' = '445' ; - 'RDP' = '3389'; - #'Zenworks' = '1761'; - } - foreach ($service in $ports.Keys) { - $socket = New-Object Net.Sockets.TcpClient - # Suppress error messages - $ErrorActionPreference = 'SilentlyContinue' - # Try to connect - $socket.Connect($env:ComputerName, $ports.$service) - # Make error messages visible again - $ErrorActionPreference = 'Continue' - if ($socket.Connected) { - $data."Port $($ports.$service) ($service)" = 'Open' - $socket.Close() - } - else { - $data."Port $($ports.$service) ($service)" = 'Closed or filtered' - } - $socket = $null - } - } - else { - $data.'WMI Data Collected' = 'No (no ping reply and -IgnorePing not specified)' - } - $wmi = $null - - if ($wmi = Get-WmiObject -Class Win32_OperatingSystem -ErrorAction SilentlyContinue| Select-Object Name, TotalVisibleMemorySize, FreePhysicalMemory,TotalVirtualMemorySize,FreeVirtualMemory,FreeSpaceInPagingFiles,NumberofProcesses,NumberOfUsers ) { - $wmi | Foreach { - $TotalRAM = $_.TotalVisibleMemorySize/1MB - $FreeRAM = $_.FreePhysicalMemory/1MB - $UsedRAM = $_.TotalVisibleMemorySize/1MB - $_.FreePhysicalMemory/1MB - $TotalRAM = [Math]::Round($TotalRAM, 2) - $FreeRAM = [Math]::Round($FreeRAM, 2) - $UsedRAM = [Math]::Round($UsedRAM, 2) - $RAMPercentFree = ($FreeRAM / $TotalRAM) * 100 - $RAMPercentFree = [Math]::Round($RAMPercentFree, 2) - $TotalVirtualMemorySize = [Math]::Round($_.TotalVirtualMemorySize/1MB, 3) - $FreeVirtualMemory = [Math]::Round($_.FreeVirtualMemory/1MB, 3) - $FreeSpaceInPagingFiles = [Math]::Round($_.FreeSpaceInPagingFiles/1MB, 3) - $NumberofProcesses = $_.NumberofProcesses - $NumberOfUsers = $_.NumberOfUsers - } - $data.'Memory - Total RAM GB ' = $TotalRAM - $data.'Memory - RAM Free GB' = $FreeRAM - $data.'Memory - RAM Used GB' = $UsedRAM - $data.'Memory - Percentage Free'= $RAMPercentFree - $data.'Memory - TotalVirtualMemorySize' = $TotalVirtualMemorySize - $data.'Memory - FreeVirtualMemory' = $FreeVirtualMemory - $data.'Memory - FreeSpaceInPagingFiles' = $FreeSpaceInPagingFiles - $data.'NumberofProcesses'= $NumberofProcesses - $data.'NumberOfUsers' = $NumberOfUsers -replace '\s+', ' ' - } - # Output data - "#"*80 - "OS Complete Information" - "Generated $(get-date)" - "Generated from $(gc env:computername)" - "#"*80 - - } ElseIf ($DisplayType -eq "NetInfo"){ - - } Else { - # Get operating system info from WMI - if ($wmi = Get-WmiObject -Class Win32_OperatingSystem -ErrorAction SilentlyContinue) { - If(!$wmi.Caption){$Caption="WinPE"; $Name = "PE:"}Else{$Caption=$wmi.Caption; $Name = "OS:"} - $data." $Name" = "$Caption ("+$wmi.Version+")" - } - - # Get BIOS info from WMI - if ($wmi = Get-WmiObject -Class Win32_Bios -ErrorAction SilentlyContinue) { - $data.'BIOS Version:' = $wmi.SMBIOSBIOSVersion - } - $wmi = $null - - if ($wmi = Get-WmiObject -Class Win32_ComputerSystem -ErrorAction SilentlyContinue) { - $data.'Manufacturer:' = $wmi.Manufacturer - $data.'Model:' = $wmi.Model - } - $wmi = $null - - # Get IP addresses from all local network adapters through WMI - if ($wmi = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ErrorAction SilentlyContinue) { - $Ips = @{} - $wmi | Where { $_.IPAddress -match '\S+' } | Foreach { $Ips.$($_.IPAddress -join ', ' ) = $_.MACAddress } - $counter = 0 - $Ips.GetEnumerator() | Foreach { - $counter++; $data.("Net Address["+$counter+"]:") = '' + $_.Name + ' MAC['+$counter+']:' + $_.Value + '' - } - } - $wmi = $null - } - - $EnumeratedData = [system.String]::Join("`n", ($data.GetEnumerator()| Sort-Object 'Name' | Format-Table -HideTableHeaders -AutoSize | out-string)) - #$EnumeratedData = ($data.GetEnumerator()| Sort-Object 'Name' | format-table -HideTableHeaders | out-string) - If($DisplayOutbox){ - Write-OutputBox -OutputBoxMessage $EnumeratedData -Type " " -Object SysInfo - } Else{ - $data.GetEnumerator() | Sort-Object 'Name' | Format-Table -AutoSize - } - If($DisplayForm){$data.GetEnumerator() | Sort-Object 'Name' | Out-GridView -Title "$env:ComputerName Information"} -} - -function Load-SystemProvider { - If ($Manufacturer -eq "Dell Inc."){ - If ($UseDellCCTK -eq $true){ - If ($Is64Bit -and (Test-Path $DellCCTKPath)){ - $HAPI = "hapint64.exe" - Write-OutputBox -OutputBoxMessage "Dell Command | Configure Tool Kit loading driver: $HAPI" -Type "INFO: " -Object Logging - }ElseIf(Test-Path $DellCCTKPathX86) { - $HAPI = "hapint.exe" - Write-OutputBox -OutputBoxMessage "Dell Command | Configure Tool Kit loaded driver: $HAPI" -Type "INFO: " -Object Logging - }Else { - Write-OutputBox -OutputBoxMessage "Unable to find Dell Command | Configure Tool Kit HAPI driver" -Type "ERROR: " -Object Logging - } - - $private:returnCode = $null - $callexe = New-Object System.Diagnostics.ProcessStartInfo - $callexe.FileName = "$DellCCTKPath\HAPI\$HAPI" - $callexe.RedirectStandardError = $true - $callexe.RedirectStandardOutput = $true - $callexe.UseShellExecute = $false - $callexe.Arguments = "-i -k C-C-T-K -p ""$HAPI"" -q" - $callexe.WindowStyle = 'Minimized' - $process = New-Object System.Diagnostics.Process - $process.StartInfo = $callexe - $process.Start() | Out-Null - $process.WaitForExit() - $stdout = $process.StandardOutput.ReadToEnd() - $stderr = $process.StandardError.ReadToEnd() - Write-OutputBox -OutputBoxMessage ("Running: " + $callexe.FileName + " " + $callexe.Arguments) -Type "INFO: " -Object Logging - If ($process.ExitCode -eq 0){ - Write-OutputBox -OutputBoxMessage "Successfully installed CCTK HAPI drivers" -Type "INFO: " -Object Logging - }Else{ - Write-OutputBox -OutputBoxMessage ("Unable to install the CCTK HAPI drivers with errorcode: " + $process.ExitCode) -Type "ERROR: " -Object Logging - } - } - - If ($UseDellPSProvider -eq $true){ - If ($Is64Bit -and (Test-Path $DellPSProviderPath)){ - Import-Module "$DellPSProviderPath\DellBIOSProvider.PSM1" - Write-OutputBox -OutputBoxMessage "Dell Powershell Provider loaded" -Type "INFO: " -Object Logging - }ElseIf(Test-Path $DellPSProviderPathX86) { - Import-Module "$DellPSProviderPathX86\DellBIOSProvider.PSM1" - Write-OutputBox -OutputBoxMessage "Dell Powershell Provider loaded" -Type "INFO: " -Object Logging - }Else{ - Write-OutputBox -OutputBoxMessage "Unable to find Dell Powershell Provider" -Type "ERROR: " -Object Logging - } - } - - } ElseIf ($Manufacturer -eq "Hewlett Packard"){ - Write-OutputBox -OutputBoxMessage "Unable to load a system Provider, nothing provided" -Type "WARNING: " -Object Logging - } ElseIf ($Manufacturer -eq "System manufacturer"){ - Write-OutputBox -OutputBoxMessage "Unable to load a system Provider, nothing provided" -Type "WARNING: " -Object Logging - } Else { - Write-OutputBox -OutputBoxMessage "Unable to load a system Provider, unsupported hardware" -Type "ERROR: " -Object Logging - } -} - -Function Execute-DellCCTK{ - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$true)] - [Alias('Arguments')] - [ValidateNotNullorEmpty()] - [string[]]$Parameters, - [Parameter(Mandatory=$false)] - [ValidateNotNullorEmpty()] - [string]$WorkingDirectory, - [Parameter(Mandatory=$false)] - [switch]$PassThru = $false, - [Parameter(Mandatory=$false)] - [switch]$DebugLog = $Global:LogDebugMode - ) - - Begin { - If ($Is64Bit -and (Test-Path $DellCCTKPath)){ - $Path = "$DellCCTKPath\cctk.exe" - Write-OutputBox -OutputBoxMessage "Dell Command | Configure Tool Kit loaded: $Path" -Type "INFO: " -Object Logging - }ElseIf(Test-Path $DellCCTKPathX86) { - $Path = "$DellCCTKPathX86\cctk.exe" - Write-OutputBox -OutputBoxMessage "Dell Command | Configure Tool Kit loaded: $Path" -Type "INFO: " -Object Logging - }Else { - Write-OutputBox -OutputBoxMessage "Unable to find Dell Command | Configure Tool Kit" -Type "ERROR: " -Object Logging - } - } - Process { - Try { - $private:returnCode = $null - ## Validate and find the fully qualified path for the $Path variable. - If (([IO.Path]::IsPathRooted($Path)) -and ([IO.Path]::HasExtension($Path))) { - If ($DebugLog){Write-OutputBox -OutputBoxMessage "[$Path] is a valid fully qualified path" -Type "INFO: " -Object Logging} - If (-not (Test-Path -LiteralPath $Path -PathType 'Leaf' -ErrorAction 'Stop')) { - Throw "File [$Path] not found." - } - } - Else { - # The first directory to search will be the 'Files' subdirectory of the script directory - [string]$PathFolders = $Path - # Add the current location of the console (Windows always searches this location first) - [string]$PathFolders = $PathFolders + ';' + (Get-Location -PSProvider 'FileSystem').Path - # Add the new path locations to the PATH environment variable - $env:PATH = $PathFolders + ';' + $env:PATH - - # Get the fully qualified path for the file. Get-Command searches PATH environment variable to find this value. - [string]$FullyQualifiedPath = Get-Command -Name $Path -CommandType 'Application' -TotalCount 1 -Syntax -ErrorAction 'Stop' - - # Revert the PATH environment variable to it's original value - $env:PATH = $env:PATH -replace [regex]::Escape($PathFolders + ';'), '' - - If ($FullyQualifiedPath) { - Write-OutputBox -OutputBoxMessage "[$Path] successfully resolved to fully qualified path [$FullyQualifiedPath]." -Type "INFO: " -Object Logging - $Path = $FullyQualifiedPath - } - Else { - Throw "[$Path] contains an invalid path or file name." - } - } - - ## Set the Working directory (if not specified) - If (-not $WorkingDirectory) { $WorkingDirectory = Split-Path -Path $Path -Parent -ErrorAction 'Stop' } - Try { - - - ## Disable Zone checking to prevent warnings when running executables - $env:SEE_MASK_NOZONECHECKS = 1 - - ## Define process - $CCTKStartInfo = New-Object -TypeName 'System.Diagnostics.ProcessStartInfo' -ErrorAction 'Stop' - $CCTKStartInfo.FileName = $Path - $CCTKStartInfo.WorkingDirectory = $WorkingDirectory - $CCTKStartInfo.UseShellExecute = $false - $CCTKStartInfo.ErrorDialog = $false - $CCTKStartInfo.RedirectStandardOutput = $true - $CCTKStartInfo.RedirectStandardError = $true - $CCTKStartInfo.CreateNoWindow = $false - If ($Parameters) { $CCTKStartInfo.Arguments = $Parameters } - $CCTKStartInfo.WindowStyle = 'Minimized' - $process = New-Object -TypeName 'System.Diagnostics.Process' -ErrorAction 'Stop' - $process.StartInfo = $CCTKStartInfo - - ## Add event handler to capture process's standard output redirection - [scriptblock]$processEventHandler = { If (-not [string]::IsNullOrEmpty($EventArgs.Data)) { $Event.MessageData.AppendLine($EventArgs.Data) } } - $stdOutBuilder = New-Object -TypeName 'System.Text.StringBuilder' -ArgumentList '' - $stdOutEvent = Register-ObjectEvent -InputObject $process -Action $processEventHandler -EventName 'OutputDataReceived' -MessageData $stdOutBuilder -ErrorAction 'Stop' - - ## Start Process - If ($DebugLog){Write-OutputBox -OutputBoxMessage "Working Directory is [$WorkingDirectory]." -Type "INFO: " -Object Logging} - If ($Parameters) { - Write-OutputBox -OutputBoxMessage "Executing [$Path $Parameters]" -Type "INFO: " -Object Logging - } Else { - Write-OutputBox -OutputBoxMessage "Executing [$Path]" -Type "INFO: " -Object Logging - } - [boolean]$processStarted = $process.Start() - - $process.BeginOutputReadLine() - $stdErr = $($process.StandardError.ReadToEnd()).ToString() -replace $null,'' - - ## Instructs the Process component to wait indefinitely for the associated process to exit. - $process.WaitForExit() - - ## HasExited indicates that the associated process has terminated, either normally or abnormally. Wait until HasExited returns $true. - While (-not ($process.HasExited)) { $process.Refresh(); Start-Sleep -Seconds 1 } - - ## Get the exit code for the process - Try { - [int32]$returnCode = $process.ExitCode - - } - Catch [System.Management.Automation.PSInvalidCastException] { - # Catch exit codes that are out of int32 range - [int32]$returnCode = 136 - } - - ## Unregister standard output event to retrieve process output - If ($stdOutEvent) { Unregister-Event -SourceIdentifier $stdOutEvent.Name -ErrorAction 'Stop'; $stdOutEvent = $null } - $stdOut = $stdOutBuilder.ToString() -replace $null,'' - - If ($stdErr.Length -gt 0) { - If ($DebugLog){Write-OutputBox -OutputBoxMessage "Standard error output from the process: $stdErr" -Type "WARNING: " -Object Logging} - } - } - Finally { - ## Make sure the standard output event is unregistered - If ($stdOutEvent) { Unregister-Event -SourceIdentifier $stdOutEvent.Name -ErrorAction 'Stop'} - - ## Free resources associated with the process, this does not cause process to exit - If ($process) { $process.Close() } - - ## Re-enable Zone checking - Remove-Item -LiteralPath 'env:SEE_MASK_NOZONECHECKS' -ErrorAction 'SilentlyContinue' - } - - - ## If the passthru switch is specified, return the exit code and any output from process - If ($PassThru) { - If ($DebugLog){Write-OutputBox -OutputBoxMessage "cctk completed with exit code [$returnCode]." -Type "INFO: " -Object Logging} - [psobject]$ExecutionResults = New-Object -TypeName 'PSObject' -Property @{ ExitCode = $returnCode; StdOut = $stdOut; StdErr = $stdErr } - Write-Output -InputObject $ExecutionResults - } Else { - If ($DebugLog){Write-Host "cctk completed with exit code [$returnCode]."} - $returnCode - } - } - Catch { - If ([string]::IsNullOrEmpty([string]$returnCode)) { - [int32]$returnCode = 136 - }Else { - If ($DebugLog){Write-OutputBox -OutputBoxMessage "cctk completed with exit code [$returnCode]. Function failed." -Type "ERROR: " -Object Logging} - } - - If ($PassThru) { - [psobject]$ExecutionResults = New-Object -TypeName 'PSObject' -Property @{ ExitCode = $returnCode; StdOut = If ($stdOut) { $stdOut } Else { '' }; StdErr = If ($stdErr) { $stdErr } Else { '' } } - Write-Output -InputObject $ExecutionResults - }Else { - If ($DebugLog){Write-Host "cctk completed with exit code [$returnCode]. Function failed."} - $returnCode - } - } - } -} - -Function Test-DellCCTK { - [CmdletBinding()] - Param ( - [Parameter(Mandatory=$false)] - [Alias('FilePath')] - [ValidateNotNullorEmpty()] - [string]$Path = $CCTK, - [Parameter(Mandatory=$true)] - [Alias('Arguments')] - [ValidateNotNullorEmpty()] - [string[]]$Parameters, - [Parameter(Mandatory=$false)] - [switch]$PassThru = $false - ) - $result = Execute-DellCCTK -Parameters "--Asset=TestCCTK" -PassThru - If ($DebugLog){Write-Host "[cctk --Asset=TestCCTK] exitcode: " $result.StdOut} - If ($result.ExitCode -eq 0){ - - } - Execute-DellCCTK -Parameters ($parameters + " --valsetuppwd=$BIOSpwd") -PassThru - - Execute-DellCCTK -Parameters "--setuppwd='' --valsetuppwd=$BIOSpwd" - If ($DebugLog){Write-Host "Cleared BIOS Password"} - -} - -function Run-DellPSProvider { - cd DellSmbios: - <# Examples - Set-Item Dellsmbios:\PostBehaviour\NumLock Enabled - - #Set BIOS Admin Password - Set-Item -Path Dellsmbios\Security\AdminPassword –Value dell123 - - #Change BIOS Admin Password - Set-Item -Path Dellsmbios\Security\AdminPassword –Value dell1234 –Password dell123 - - #Clear BIOS Admin Password - Set-Item -Path Dellsmbios\Security\AdminPassword –Value “” –Password dell123 - - #Disable Chassis Intrusion alert - Set-Item -Path Dellsmbios\Security\ChassisIntrusion -Value Disabled - - #Set Wake On Lancd - Set-Item -Path Dellsmbios:\PowerManagement\WakeOnLANorWLAN -Value "LANorWLAN" - - #Change Asset Tag - Set-Item –Path DellSmbios:\SystemInformation\AssetTag MyAssetTag -Password dell123 - - #Set WWAN Connection AutoSense - Set-Item -Path Dellsmbios:\PowerManagement\ControlWWANRadio -Value Enabled - - #Get Service Tag - Get-ChildItem DellSmbios:\SystemInformation\ServiceTag - - #Get Boot Sequence - Get-ChildItem DellSmbios:\BootSequence\Bootsequence - - #Enable PXE boot - Set-Item -Path Dellsmbios:\SystemConfiguration\"Integrated NIC" -Value "Enabled w PXE" - - #> - -} - - -function Validate-Elevated { - $UserIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent() - $UserWP = New-Object Security.Principal.WindowsPrincipal($UserIdentity) - $ErrorActionPreference = "Stop" - try { - if ($UserWP.IsInRole("S-1-5-32-544")) { - $PBUEFI.Image = $ValidatedImage - $LabelUEFI.Visible = $true - Write-OutputBox -OutputBoxMessage "User has local administrative rights, and the tool was launched elevated" -Type "INFO: " -Object Logging - return $true - } - else { - $PBUEFI.Image = $ErrorImage - $LabelUEFI.Visible = $true - Write-OutputBox -OutputBoxMessage "The tool requires local administrative rights and was not launched elevated" -Type "ERROR: " -Object Logging - return $false - } - } - catch [System.Exception] { - Write-OutputBox -OutputBoxMessage "An error occured when attempting to query for elevation, possible due to issues contacting the domain or the tool is launched in a sub-domain. If used in a sub-domain, check the override checkbox to enable this tool" -Type "WARNING: " -Object Logging - $PBUEFI.Image = $ErrorImage - $LabelUEFI.Visible = $true - $ErrorActionPreference = "Continue" - } -} - - -function Validate-System { - param( - [parameter(Mandatory=$false)] - $OutPutBox = $true - ) - Begin { - $ModelsArrayList = New-Object System.Collections.ArrayList - $ModelsArrayList.AddRange(@($SupportedModels)) - $ManufacturersArrayList = New-Object System.Collections.ArrayList - $ManufacturersArrayList.AddRange(@($SupportedManufacturers)) - } - Process { - If ($ManufacturersArrayList -eq $ComputerSystem.Manufacturer) { - if ($ModelsArrayList -eq $ComputerSystem.Model) { - If($OutPutBox){Write-OutputBox -OutputBoxMessage ("Supported model found (" + $ComputerSystem.Model + ")") -Type "INFO: " -Object Logging} - $PBModel.Image = $ValidatedImage - $LabelSupportedModel.Visible = $true - return $true - } Else { - If($OutPutBox){Write-OutputBox -OutputBoxMessage "The detected model is not supported." -Type "ERROR: " -Object Logging} - $PBModel.Image = $ErrorImage - $LabelSupportedModel.Visible = $true - return $false - } - } Else { - If($OutPutBox){Write-OutputBox -OutputBoxMessage ("The detected manufacturer (" + $ComputerSystem.Manufacturer + ") is not supported.") -Type "ERROR: " -Object Logging} - $PBModel.Image = $ErrorImage - $LabelSupportedModel.Visible = $true - return $false - } - } -} - -function Validate-BIOSPassword { - If ($global:PreValidation -eq $false){return $false; break} - $sTestVal = "TestAsset" - #sPrevAssetTag = oEnvironment.Item("AssetTag") - If ($UseDellCCTK){ - $result = Execute-DellCCTK -Parameters "--asset=" -PassThru - If ($DebugLog){Write-Host "[cctk --asset=] exitcode:" $result.ExitCode} - If ($DebugLog){Write-Host "[cctk --asset=] Error:" $result.StdErr} - If ($DebugLog){Write-Host "[cctk --asset=] Output:" $result.StdOut} - If ($result.ExitCode -eq 191 -or $result.ExitCode -eq 180){ - Write-OutputBox -OutputBoxMessage ("The BIOS password is set. Will try to guess password") -Type "ERROR: " -Object Logging - Foreach ($password in $BIOSKnownUsedpwd){ - $PlainPassword = Decrypt-String -Encrypted $password -Passphrase "SecureHostBaseline" - $result = Execute-DellCCTK -Parameters "--asset=$sTestVal --valsetuppwd=$PlainPassword" -PassThru - If ($result.ExitCode -eq 0){ - Write-OutputBox -OutputBoxMessage "Successfully able to access BIOS settings using a known BIOS password" -Type "INFO: " -Object Logging - $BIOSPasswordFound = $PlainPassword - Break - } Else { - Write-OutputBox -OutputBoxMessage ("Tried $password, The BIOS password is invalid. Will try to guess password again") -Type "ERROR: " -Object Logging - $BIOSPasswordFound = $Null - Continue - } - } - - } Elseif($result.ExitCode -eq 0) { - Write-OutputBox -OutputBoxMessage ("The BIOS password is blank. A password is required to be compliant.") -Type "WARNING: " -Object Logging - Execute-DellCCTK -Parameters "--asset=" - $BIOSPasswordFound = $Null - $PBBIOSPassword.Image = $WarningImage - $LabelBIOSPassword.Visible = $true - return $false - - } Else { - Write-OutputBox -OutputBoxMessage ("CCTK errored with exit code: " + $result.ExitCode) -Type "ERROR: " -Object Logging - $BIOSPasswordFound = $Null - $PBBIOSPassword.Image = $ErrorImage - $LabelBIOSPassword.Visible = $true - return $false - } - - - If ($BIOSPasswordFound){ - Write-OutputBox -OutputBoxMessage ("The BIOS password is has been fo") -Type "INFO: " -Object Logging - Execute-DellCCTK -Parameters "--asset= --valsetuppwd=$BIOSPasswordFound" - $PBBIOSPassword.Image = $ValidatedImage - $LabelBIOSPassword.Visible = $true - return $true - - }Else{ - Write-OutputBox -OutputBoxMessage ("The BIOS password is not known. BIOS configurations may have to be set manually") -Type "ERROR: " -Object Logging - $PBBIOSPassword.Image = $ErrorImage - $LabelBIOSPassword.Visible = $true - return $false - } - } - - If ($UseDellPSProvider){ - Write-OutputBox -OutputBoxMessage ("The BIOS password is not known. BIOS configurations may have to be set manually") -Type "ERROR: " -Object Logging - $BIOSPasswordFound = $Null - $PBBIOSPassword.Image = $ErrorImage - $LabelBIOSPassword.Visible = $true - return $false - } - - #Output current BIOS password - $global:BIOSCurrentPassword = $BIOSPasswordFound - If ($DebugLog){Write-Host "Current BIOS password is: $global:BIOSCurrentPassword"} -} - -function Validate-BIOSRevision { - Begin { - $DetectedBIOS = Get-WmiObject -Namespace "root\cimv2" -Class Win32_BIOS | Select-Object -ExpandProperty SMBIOSBIOSVersion - } - Process { - If (Validate-System -OutPutBox $false){ - foreach($system in $SupportedSystems){ - If ($Model -eq $system.model){ - if (($DetectedBIOS -eq $system.biosrev -or $system.biosrev -eq "any")) { - Write-OutputBox -OutputBoxMessage ("Supported BIOS (" + $DetectedBIOS + ") found for model (" + $system.model + ")") -Type "INFO: " -Object Logging - $ModelBIOSMatchFound = $true - $PBBIOSRevision.Image = $ValidatedImage - $LabelBIOSRevision.Visible = $true - return $true - } Else { - Write-OutputBox -OutputBoxMessage ("The detected BIOS Revision (" + $DetectedBIOS + "). The supported BIOS revision is: " + $system.biosrev) -Type "ERROR: " -Object Logging - $ModelBIOSMatchFound = $false - $PBBIOSRevision.Image = $WarningImage - $LabelBIOSRevision.Visible = $true - return $true - } - } Else{ - Write-OutputBox -OutputBoxMessage ("The model (" + $system.model + ") and BIOS (" + $DetectedBIOS + ") is not supported for Secure Host Baseline.") -Type "ERROR: " -Object Logging - $ModelBIOSMatchFound = $false - $PBBIOSRevision.Image = $ErrorImage - $LabelBIOSRevision.Visible = $true - return $false - } - } - } Else { - Write-OutputBox -OutputBoxMessage ("The detected system is not supported with CredGuard.") -Type "ERROR: " -Object Logging - $ModelBIOSMatchFound = $false - $PBBIOSRevision.Image = $ErrorImage - $LabelBIOSRevision.Visible = $true - return $false - } - }End { - - } -} - -function Validate-OSBuild { - if (($OSProductType -eq 1) -and ($OSBuildNumber -ge $MinimumOSversion)) { - $OSName = $SupportedOperatingSystems | Where-Object version -eq $OSBuildNumber - If(!$OSCaption){ - Write-OutputBox -OutputBoxMessage ("Supported WinPE version running (" + $OSBuildNumber + ")") -Type "INFO: " -Object Logging - } Else { - Write-OutputBox -OutputBoxMessage ("Supported operating system running (" + $OSCaption + ")") -Type "INFO: " -Object Logging - } - $PBOS.Image = $ValidatedImage - $LabelSupportedOS.Visible = $true - return $true - } - else { - if ($OSBuildNumber -lt $MinimumOSversion) { - Write-OutputBox -OutputBoxMessage "The detected operating system or WinPE is not supported. This tool is supported on Windows Server 2012 and above" -Type "ERROR: " -Object Logging - }Elseif ($OSProductType -eq 2) { - Write-OutputBox -OutputBoxMessage "The detected system is a Domain Controller. This tool is not supported on this platform" -Type "ERROR: " -Object Logging - }Elseif ($OSProductType -eq 3) { - Write-OutputBox -OutputBoxMessage "The detected operating system is a Server OS. This tool is not supported on this platform" -Type "ERROR: " -Object Logging - } - $PBOS.Image = $ErrorImage - $LabelSupportedOS.Visible = $true - return $false - } -} - - -function Validate-PowerShellVer { - if ($host.Version -ge "3.0") { - Write-OutputBox -OutputBoxMessage ("Supported version of PowerShell was detected (" + $host.Version + ")") -Type "INFO: " -Object Logging - $PBPS.Image = $ValidatedImage - $LabelPowerShell.Visible = $true - return $true - } - else { - Write-OutputBox -OutputBoxMessage ("Unsupported version of PowerShell detected (" + $host.Version + "). This tool requires PowerShell 3.0 and above") -Type "ERROR: " -Object Logging - $PBPS.Image = $ErrorImage - $LabelPowerShell.Visible = $true - return $false - } -} - - -Function IsUEFI { - <# - .Synopsis - Determines underlying firmware (BIOS) type and returns True for UEFI or False for legacy BIOS. - .DESCRIPTION - This function uses a complied Win32 API call to determine the underlying system firmware type. - .EXAMPLE - If (IsUEFI) { # System is running UEFI firmware... } - .OUTPUTS - [Bool] True = UEFI Firmware; False = Legacy BIOS - .FUNCTIONALITY - Determines underlying system firmware type - #> - - [OutputType([Bool])] - Param () - - Add-Type -Language CSharp -TypeDefinition @' - using System; - using System.Runtime.InteropServices; - public class GetUEFIMode - { - [DllImport("kernel32.dll", SetLastError=true)] - static extern UInt32 - GetFirmwareEnvironmentVariableA(string lpName, string lpGuid, IntPtr pBuffer, UInt32 nSize); - const int ERROR_INVALID_FUNCTION = 1; - public static bool IsUEFI() - { - // Try to call the GetFirmwareEnvironmentVariable API. This is invalid on legacy BIOS. - GetFirmwareEnvironmentVariableA("","{00000000-0000-0000-0000-000000000000}",IntPtr.Zero,0); - if (Marshal.GetLastWin32Error() == ERROR_INVALID_FUNCTION) - return false; // API not supported; this is a legacy BIOS - else - return true; // API error (expected) but call is supported. This is UEFI. - } - } -'@ -ErrorAction SilentlyContinue - [GetUEFIMode]::IsUEFI() -} - -Function GetFirmwareType { - <# - .Synopsis - Determines underlying firmware (BIOS) type and returns an integer indicating UEFI, Legacy BIOS or Unknown. - Supported on Windows 8/Server 2012 or later - .DESCRIPTION - This function uses a complied Win32 API call to determine the underlying system firmware type. - .EXAMPLE - If (Get-BiosType -eq 1) { # System is running UEFI firmware... } - .EXAMPLE - Switch (Get-BiosType) { - 1 {"Legacy BIOS"} - 2 {"UEFI"} - Default {"Unknown"} - } - .OUTPUTS - Integer indicating firmware type (1 = Legacy BIOS, 2 = UEFI, Other = Unknown) - .FUNCTIONALITY - Determines underlying system firmware type - #> - - [OutputType([UInt32])] - Param() - - Add-Type -Language CSharp -TypeDefinition @' - using System; - using System.Runtime.InteropServices; - public class FirmwareType - { - [DllImport("kernel32.dll")] - static extern bool GetFirmwareType(ref uint FirmwareType); - public static uint GetFirmwareType() - { - uint firmwaretype = 0; - if (GetFirmwareType(ref firmwaretype)) - return firmwaretype; - else - return 0; // API call failed, just return 'unknown' - } - } -'@ -IgnoreWarnings - [FirmwareType]::GetFirmwareType() -} - -Function Validate-UEFICheck { - Begin { - $ValidateUEFI = $false - $ValidateUEFI = IsUEFI - } - Process { - if ($ValidateUEFI) { - $PBUEFI.Image = $ValidatedImage - $LabelUEFI.Visible = $true - Write-OutputBox -OutputBoxMessage "UEFI is enabled" -Type "INFO: " -Object Logging - return $true - } - else { - $PBUEFI.Image = $ErrorImage - $LabelUEFI.Visible = $true - Write-OutputBox -OutputBoxMessage "UEFI is not enabled, will try to enable" -Type "ERROR: " -Object Logging - return $false - } - } -} - -Function Validate-LegacyROM { - Begin { - If ($global:PreValidation -eq $false){return $false; break} - } - Process { - $result = Execute-DellCCTK -Parameters "--legacyorom" -PassThru - If ($DebugLog){Write-Host "[cctk --legacyorom] exitcode: " $result.ExitCode} - If ($DebugLog){Write-Host "[cctk --legacyorom] output: " $result.StdOut} - - [string]$ResultOutput = ($result.StdOut).Trim() - $Global:LROM = $ResultOutput.Split("=")[1] - - If ($ResultOutput -eq "legacyorom=disable"){ - Write-OutputBox -OutputBoxMessage "Legacy Option ROM is disable!" -Type "INFO: " -Object Logging - $PBLEGACYOROM.Image = $ValidatedImage - $LabelLegacyROM.Visible = $true - return $true - } - ElseIf ($result.ExitCode -eq 0){ - Write-OutputBox -OutputBoxMessage "Legacy Option ROM is an option, but not disabled" -Type "WARNING: " -Object Logging - If ($BIOSCurrentPassword -ne $Null){ - $result = Execute-DellCCTK -Parameters "--legacyorom=disable --valsetuppwd=$BIOSCurrentPassword" -PassThru - If ($DebugLog){Write-Host "[cctk --legacyorom=disable --valsetuppwd=$BIOSCurrentPassword] exitcode: " $result.ExitCode} - } - Else { - $result = Execute-DellCCTK -Parameters "--legacyorom=disable" -PassThru - If ($DebugLog){Write-Host "[cctk --legacyorom=disable] exitcode: " $result.ExitCode} - } - - If ($result.ExitCode -eq 0){ - Write-OutputBox -OutputBoxMessage "Sucessfully disabled Legacy Option ROM" -Type "INFO: " -Object Logging - $PBLEGACYOROM.Image = $ValidatedImage - $LabelLegacyROM.Visible = $true - return $true - } - ElseIf($result.ExitCode -eq 192) { - Write-OutputBox -OutputBoxMessage "Unable to disable Legacy Option ROM, the BIOS password is unknown." -Type "ERROR: " -Object Logging - $PBLEGACYOROM.Image = $WarningImage - $LabelLegacyROM.Visible = $true - return $false - } - Else { - Write-OutputBox -OutputBoxMessage "Unable to disable Legacy Option ROM, setting must be disabled manually" -Type "ERROR: " -Object Logging - $PBLEGACYOROM.Image = $WarningImage - $LabelLegacyROM.Visible = $true - return $false - } - - } - Else { - Write-OutputBox -OutputBoxMessage "Legacy Boot ROM is not an option." -Type "ERROR: " -Object Logging - $PBLEGACYOROM.Image = $ErrorImage - $LabelLegacyROM.Visible = $true - return $false - } - } -} - -Function Validate-SecureBoot { - Begin { - If ($global:PreValidation -eq $false){return $false; break} - } - Process { - $result = Execute-DellCCTK -Parameters "--secureboot" -PassThru - If ($DebugLog){Write-Host "[cctk --secureboot] exitcode: " $result.ExitCode} - If ($DebugLog){Write-Host "[cctk --secureboot] output: " $result.StdOut} - - [string]$ResultOutput = ($result.StdOut).Trim() - $Global:SB = $ResultOutput.Split("=")[1] - - If ($ResultOutput -eq "secureboot=enable"){ - Write-OutputBox -OutputBoxMessage "Secure Boot is already enabled!" -Type "INFO: " -Object Logging - $PBSECUREBOOT.Image = $ValidatedImage - $LabelLegacyROM.Visible = $true - return $true - } - ElseIf ($result.ExitCode -eq 257){ - Write-OutputBox -OutputBoxMessage "Secure Boot is an option, but not disabled" -Type "WARNING: " -Object Logging - If ($BIOSCurrentPassword -ne $Null){ - $result2 = Execute-DellCCTK -Parameters "--secureboot=enable --valsetuppwd=$BIOSCurrentPassword" -PassThru - If ($DebugLog){Write-Host "[cctk --secureboot=enable --valsetuppwd=$BIOSCurrentPassword] exitcode: " $result2.ExitCode} - } - Else { - $result2 = Execute-DellCCTK -Parameters "--secureboot=enable" -PassThru - If ($DebugLog){Write-Host "[cctk --secureboot=enable] exitcode: " $result2.ExitCode} - } - - If ($result2.ExitCode -eq 0){ - Write-OutputBox -OutputBoxMessage "Sucessfully enabled Secure Boot" -Type "INFO: " -Object Logging - $PBSECUREBOOT.Image = $ValidatedImage - $LabelLegacyROM.Visible = $true - return $true - } - ElseIf($result2.ExitCode -eq 192) { - Write-OutputBox -OutputBoxMessage "Unable to enable Secure Boot, the BIOS password is unknown." -Type "ERROR: " -Object Logging - $PBSECUREBOOT.Image = $WarningImage - $LabelLegacyROM.Visible = $true - return $false - } - Else { - Write-OutputBox -OutputBoxMessage "Unable to enable Secure Boot, setting must be enabled manually" -Type "ERROR: " -Object Logging - $PBSECUREBOOT.Image = $WarningImage - $LabelLegacyROM.Visible = $true - return $false - } - - } - Else { - Write-OutputBox -OutputBoxMessage "Secure Boot is not an option." -Type "ERROR: " -Object Logging - $PBSECUREBOOT.Image = $ErrorImage - $LabelLegacyROM.Visible = $true - return $false - } - } - End { - } -} - -Function Validate-TPMModule{ - Begin{ - If ($global:PreValidation -eq $false){return $false; break} - } - Process { - If($OSCaption){ - $TPMStatus = Get-Tpm | Select-Object -ExpandProperty TpmPresent -ErrorAction SilentlyContinue - } - Else{ - $TPMStatus = Get-WmiObject -Namespace "root\cimv2\Security\MicrosoftTPM" -Class Win32_TPM -ErrorAction SilentlyContinue - } - - if ($TPMStatus) { - Write-OutputBox -OutputBoxMessage "TPM is present" -Type "INFO: " -Object Logging - $PBBIOSTPM.Image = $ValidatedImage - $LabelBIOSTPM.Visible = $true - $Global:TPM = $true - return $true - } - Else { - Write-OutputBox -OutputBoxMessage "TPM is not available for this system." -Type "ERROR: " -Object Logging - $PBBIOSTPM.Image = $ErrorImage - $LabelBIOSTPM.Visible = $true - $Global:TPM = $false - return $false - } - - - } - End { - } - } - - -Function Validate-TPMEnabled{ - Begin{ - If ($Global:TPM -eq $false){return $false; break} - If ($global:PreValidation -eq $false){return $false; break} - } - Process { - If($OSCaption){ - Try { - $TPMStatus = Get-Tpm | Select-Object -ExpandProperty TpmReady - if ($TPMStatus) { - Write-OutputBox -OutputBoxMessage "TPM is ready" -Type "INFO: " -Object Logging - $PBBIOSTPMON.Image = $ValidatedImage - $LabelBIOSTPMEnabled.Visible = $true - return $true - } Else { - $TPMPresent = Get-Tpm | Select-Object -ExpandProperty TpmPresent - if ($TPMPresent) { - Write-OutputBox -OutputBoxMessage "TPM is present, but not ready" -Type "WARNING: " -Object Logging - $PBBIOSTPMON.Image = $ValidatedImage - $LabelBIOSTPMEnabled.Visible = $true - return $true - } Else { - Write-OutputBox -OutputBoxMessage "TPM is not available for this system." -Type "ERROR: " -Object Logging - $PBBIOSTPMON.Image = $ErrorImage - $LabelBIOSTPMEnabled.Visible = $true - return $false - } - } - } - Catch { - Write-OutputBox -OutputBoxMessage "TPM is not available for this system." -Type "ERROR: " -Object Logging - $PBBIOSTPMON.Image = $ErrorImage - $LabelBIOSTPMEnabled.Visible = $true - return $false - } - } Else{ - Write-OutputBox -OutputBoxMessage "WinPE detected, OS deployment process will enable TPM" -Type "IGNORE: " -Object Logging - $PBBIOSTPMON.Image = $WarningImage - $LabelBIOSTPMEnabled.Visible = $true - return $true - } - } - End { - } -} - - -Function Validate-TPMActivated { - Begin{ - If ($Global:TPM -eq $false){return $false; break} - If ($global:PreValidation -eq $false){return $false; break} - } - Process { - If($OSCaption){ - $result = Execute-DellCCTK -Parameters "--tpmactivation" -PassThru - If ($DebugLog){Write-Host "[cctk --tpmactivation] exitcode: "$result.ExitCode} - If ($DebugLog){Write-Host "[cctk --tpmactivation] output: " $result.StdOut} - - [string]$ResultOutput = ($result.StdOut).Trim() - $Global:TPMACT = $ResultOutput.Split("=")[1] - - If ($ResultOutput -eq "tpmactivation=activate"){ - Write-OutputBox -OutputBoxMessage "TPM is activated!" -Type "INFO: " -Object Logging - $PBBIOSTPMACT.Image = $ValidateImage - $LabelBIOSTPMActive.Visible = $true - return $true - } - ElseIf ($result.ExitCode -eq 0){ - Write-OutputBox -OutputBoxMessage "TPM is available for this system, but is not activated" -Type "WARNING: " -Object Logging - If ($BIOSCurrentPassword -ne $Null){ - $result2 = Execute-DellCCTK -Parameters "----tpmactivation=activate --valsetuppwd=$BIOSCurrentPassword" -PassThru - If ($DebugLog){Write-Host "[cctk --tpmactivation=activate --valsetuppwd=$BIOSCurrentPassword] exitcode: " $result2.ExitCode} - } - Else { - $result2 = Execute-DellCCTK -Parameters "--tpmactivation=activate" -PassThru - If ($DebugLog){Write-Host "[cctk --tpmactivation=activate] exitcode: " $result2.ExitCode} - } - - If ($result2.ExitCode -eq 0){ - Write-OutputBox -OutputBoxMessage "Sucessfully activated the TPM Module" -Type "INFO: " -Object Logging - $PBBIOSTPMACT.Image = $ValidateImage - $LabelBIOSTPMActive.Visible = $true - return $true - } - ElseIf($result2.ExitCode -eq 192) { - Write-OutputBox -OutputBoxMessage "Unable to activate the TPM module, the BIOS password is unknown." -Type "ERROR: " -Object Logging - $PBBIOSTPMACT.Image = $WarningImage - $LabelBIOSTPMActive.Visible = $true - return $false - } - Else { - Write-OutputBox -OutputBoxMessage "Unable to activate the TPM module, setting must activated manually" -Type "ERROR: " -Object Logging - $PBBIOSTPMACT.Image = $WarningImage - $LabelBIOSTPMActive.Visible = $true - return $false - } - - } - Else { - Write-OutputBox -OutputBoxMessage "A TPM module is not available for this system." -Type "ERROR: " -Object Logging - $PBBIOSTPMACT.Image = $ErrorImage - $LabelBIOSTPMActive.Visible = $true - return $false - } - } - Else{ - Write-OutputBox -OutputBoxMessage "WinPE detected, OS deployment process will activate TPM" -Type "IGNORE: " -Object Logging - $PBBIOSTPMACT.Image = $WarningImage - $LabelBIOSTPMActive.Visible = $true - return $true - } - } -} - -Function Validate-VTFeature { - Begin{ - If ($global:PreValidation -eq $false){return $false; break} - } - Process { - $result = Execute-DellCCTK -Parameters "--virtualization" -PassThru - If ($DebugLog){Write-Host "[cctk --virtualization] exitcode: " $result.ExitCode} - If ($DebugLog){Write-Host "[cctk --virtualization] output: " $result.StdOut} - - [string]$ResultOutput = ($result.StdOut).Trim() - $Global:VT = $ResultOutput.Split("=")[1] - - If ($ResultOutput -eq "virtualization=enable"){ - Write-OutputBox -OutputBoxMessage "Virtualization Technology is available for this system and is enabled!" -Type "INFO: " -Object Logging - $PBBIOSVT.Image = $ValidatedImage - $LabelBIOSVT.Visible = $true - return $true - } - ElseIf ($result.ExitCode -eq 0){ - Write-OutputBox -OutputBoxMessage "Virtualization Technology is available for this system, but is not enabled" -Type "WARNING: " -Object Logging - If ($BIOSCurrentPassword -ne $Null){ - $result2 = Execute-DellCCTK -Parameters "--virtualization=enable --valsetuppwd=$BIOSCurrentPassword" -PassThru - If ($DebugLog){Write-Host "[cctk --virtualization=enable --valsetuppwd=$BIOSCurrentPassword] exitcode: " $result2.ExitCode} - } - Else { - $result2 = Execute-DellCCTK -Parameters "--virtualization=enable" -PassThru - If ($DebugLog){Write-Host "[cctk --virtualization=enable] exitcode: " $result2.ExitCode} - } - - If ($result2.ExitCode -eq 0){ - Write-OutputBox -OutputBoxMessage "Sucessfully enabled Virtualization Technology" -Type "INFO: " -Object Logging - $PBBIOSVT.Image = $ValidatedImage - $LabelBIOSVT.Visible = $true - return $true - } - ElseIf($result2.ExitCode -eq 192) { - Write-OutputBox -OutputBoxMessage "Unable to enable Virtualization Technology, the BIOS password is unknown." -Type "ERROR: " -Object Logging - $PBBIOSVT.Image = $WarningImage - $LabelBIOSVT.Visible = $true - return $false - } - Else { - Write-OutputBox -OutputBoxMessage "Unable to enable Virtualization Technology, setting must be enabled manually" -Type "ERROR: " -Object Logging - $PBBIOSVT.Image = $WarningImage - $LabelBIOSVT.Visible = $true - return $false - } - } - Else { - Write-OutputBox -OutputBoxMessage "Virtualization Technology is not available for this system." -Type "ERROR: " -Object Logging - $PBBIOSVT.Image = $ErrorImage - $LabelBIOSVT.Visible = $true - return $false - } - } - End { - } -} - -Function Validate-VTDirectIO { - Begin { - If (!$Global:VT){return $false; break} - If ($global:PreValidation -eq $false){return $false; break} - } - Process { - $result = Execute-DellCCTK -Parameters "--vtfordirectio" -PassThru - If ($DebugLog){Write-Host "[cctk --vtfordirectio] exitcode: " $result.ExitCode} - If ($DebugLog){Write-Host "[cctk --vtfordirectio] output: " $result.StdOut} - - [string]$ResultOutput = ($result.StdOut).Trim() - [string]$Global:VTDIO = $ResultOutput.Split("=")[1] - - If ($ResultOutput -eq "vtfordirectio=on"){ - Write-OutputBox -OutputBoxMessage "Virtualization Direct IO is available for this system and is enabled!" -Type "INFO: " -Object Logging - $PBBIOSVTDirectIO.Image = $ValidatedImage - $LabelBIOSVTDirectIO.Visible = $true - return $true - } - ElseIf ($result.ExitCode -eq 0){ - Write-OutputBox -OutputBoxMessage "Virtualization Direct IO is available for this system, but is not enabled" -Type "WARNING: " -Object Logging - If ($BIOSCurrentPassword -ne $Null){ - $result2 = Execute-DellCCTK -Parameters "--vtfordirectio=on --valsetuppwd=$BIOSCurrentPassword" -PassThru - If ($DebugLog){Write-Host "[cctk --vtfordirectio=on --valsetuppwd=$BIOSCurrentPassword] exitcode: " $result2.ExitCode} - } - Else { - $result2 = Execute-DellCCTK -Parameters "--vtfordirectio=on" -PassThru - If ($DebugLog){Write-Host "[cctk vtfordirectio=on] exitcode: " $result2.ExitCode} - } - - If ($result2.ExitCode -eq 0){ - Write-OutputBox -OutputBoxMessage "Sucessfully enabled Virtualization Direct IO" -Type "INFO: " -Object Logging - $PBBIOSVTDirectIO.Image = $ValidatedImage - $LabelBIOSVTDirectIO.Visible = $true - return $true - } - ElseIf($result2.ExitCode -eq 192) { - Write-OutputBox -OutputBoxMessage "Unable to enable Virtualization Direct IO, the BIOS password is unkown." -Type "ERROR: " -Object Logging - $PBBIOSVTDirectIO.Image = $WarningImage - $LabelBIOSVTDirectIO.Visible = $true - return $false - } - Else { - Write-OutputBox -OutputBoxMessage "Unable to enable Virtualization Direct IO, setting must enabled manually" -Type "ERROR: " -Object Logging - $PBBIOSVTDirectIO.Image = $WarningImage - $LabelBIOSVTDirectIO.Visible = $true - return $false - } - - } - Else { - Write-OutputBox -OutputBoxMessage "Virtualization Direct IO is not enabled or is not available for this system." -Type "ERROR: " -Object Logging - $PBBIOSVTDirectIO.Image = $ErrorImage - $LabelBIOSVTDirectIO.Visible = $true - return $false - } - } - End { - } -} - -Function Validate-VTTrustedExecution { - Begin { - If (!$Global:VT){return $false; break} - If ($global:PreValidation -eq $false){return $false; break} - } - Process { - $result = Execute-DellCCTK -Parameters "--trustexecution" -PassThru - If ($DebugLog){Write-Host "[cctk --trustexecution] exitcode: " $result.ExitCode} - If ($DebugLog){Write-Host "[cctk --trustexecution] output: " $result.StdOut} - - [string]$ResultOutput = ($result.StdOut).Trim() - $Global:VTTE = $ResultOutput.Split("=")[1] - - If ($ResultOutput -eq "trustexecution=on"){ - Write-OutputBox -OutputBoxMessage "Virtualization Trusted Execution is available for this system and is enabled!" -Type "INFO: " -Object Logging - $PBBIOSVTTE.Image = $ValidatedImage - $LabelBIOSVTTE.Visible = $true - return $true - } - ElseIf ($result.ExitCode -eq 0){ - Write-OutputBox -OutputBoxMessage "Virtualization Trusted Execution is available for this system, but is not enabled" -Type "WARNING: " -Object Logging - If ($BIOSCurrentPassword -ne $Null){ - $result2 = Execute-DellCCTK -Parameters "--trustexecution=on --valsetuppwd=$BIOSCurrentPassword" -PassThru - If ($DebugLog){Write-Host "[cctk --trustexecution=on --valsetuppwd=$BIOSCurrentPassword] exitcode: " $result2.ExitCode} - } - Else { - $result2 = Execute-DellCCTK -Parameters "--vtfordirectio=on" -PassThru - If ($DebugLog){Write-Host "[cctk trustexecution=on] exitcode: " $result2.ExitCode} - } - - If ($result2.ExitCode -eq 0){ - Write-OutputBox -OutputBoxMessage "Sucessfully enabled Virtualization Trusted Execution" -Type "INFO: " -Object Logging - $PBBIOSVTTE.Image = $ValidatedImage - $LabelBIOSVTTE.Visible = $true - return $true - } - ElseIf($result2.ExitCode -eq 192) { - Write-OutputBox -OutputBoxMessage "Unable to enable Virtualization Trusted Execution, the BIOS password is unknown." -Type "ERROR: " -Object Logging - $PBBIOSVTTE.Image = $WarningImage - $LabelBIOSVTTE.Visible = $true - return $false - } - Else { - Write-OutputBox -OutputBoxMessage "Unable to enable Virtualization Trusted Execution, setting must enabled manually" -Type "ERROR: " -Object Logging - $PBBIOSVTTE.Image = $WarningImage - $LabelBIOSVTTE.Visible = $true - return $false - } - - } - Else { - Write-OutputBox -OutputBoxMessage "Virtualization Trusted Execution is not enabled or is not available for this system." -Type "ERROR: " -Object Logging - $PBBIOSVTTE.Image = $ErrorImage - $LabelBIOSVTTE.Visible = $true - return $false - } - } - End { - } -} - -function Encrypt-String($String, $Passphrase, $salt="SaltCrypto", $init="IV_Password", [switch]$arrayOutput) -{ - # Create a COM Object for RijndaelManaged Cryptography - $r = new-Object System.Security.Cryptography.RijndaelManaged - # Convert the Passphrase to UTF8 Bytes - $pass = [Text.Encoding]::UTF8.GetBytes($Passphrase) - # Convert the Salt to UTF Bytes - $salt = [Text.Encoding]::UTF8.GetBytes($salt) - - # Create the Encryption Key using the passphrase, salt and SHA1 algorithm at 256 bits - $r.Key = (new-Object Security.Cryptography.PasswordDeriveBytes $pass, $salt, "SHA1", 5).GetBytes(32) #256/8 - # Create the Intersecting Vector Cryptology Hash with the init - $r.IV = (new-Object Security.Cryptography.SHA1Managed).ComputeHash( [Text.Encoding]::UTF8.GetBytes($init) )[0..15] - - # Starts the New Encryption using the Key and IV - $c = $r.CreateEncryptor() - # Creates a MemoryStream to do the encryption in - $ms = new-Object IO.MemoryStream - # Creates the new Cryptology Stream --> Outputs to $MS or Memory Stream - $cs = new-Object Security.Cryptography.CryptoStream $ms,$c,"Write" - # Starts the new Cryptology Stream - $sw = new-Object IO.StreamWriter $cs - # Writes the string in the Cryptology Stream - $sw.Write($String) - # Stops the stream writer - $sw.Close() - # Stops the Cryptology Stream - $cs.Close() - # Stops writing to Memory - $ms.Close() - # Clears the IV and HASH from memory to prevent memory read attacks - $r.Clear() - # Takes the MemoryStream and puts it to an array - [byte[]]$result = $ms.ToArray() - # Converts the array from Base 64 to a string and returns - return [Convert]::ToBase64String($result) -} - -function Decrypt-String($Encrypted, $Passphrase, $salt="SaltCrypto", $init="IV_Password") -{ - # If the value in the Encrypted is a string, convert it to Base64 - if($Encrypted -is [string]){ - $Encrypted = [Convert]::FromBase64String($Encrypted) - } - - # Create a COM Object for RijndaelManaged Cryptography - $r = new-Object System.Security.Cryptography.RijndaelManaged - # Convert the Passphrase to UTF8 Bytes - $pass = [Text.Encoding]::UTF8.GetBytes($Passphrase) - # Convert the Salt to UTF Bytes - $salt = [Text.Encoding]::UTF8.GetBytes($salt) - - # Create the Encryption Key using the passphrase, salt and SHA1 algorithm at 256 bits - $r.Key = (new-Object Security.Cryptography.PasswordDeriveBytes $pass, $salt, "SHA1", 5).GetBytes(32) #256/8 - # Create the Intersecting Vector Cryptology Hash with the init - $r.IV = (new-Object Security.Cryptography.SHA1Managed).ComputeHash( [Text.Encoding]::UTF8.GetBytes($init) )[0..15] - - - # Create a new Decryptor - $d = $r.CreateDecryptor() - # Create a New memory stream with the encrypted value. - $ms = new-Object IO.MemoryStream @(,$Encrypted) - # Read the new memory stream and read it in the cryptology stream - $cs = new-Object Security.Cryptography.CryptoStream $ms,$d,"Read" - # Read the new decrypted stream - $sr = new-Object IO.StreamReader $cs - # Return from the function the stream - Write-Output $sr.ReadToEnd() - # Stops the stream - $sr.Close() - # Stops the crypology stream - $cs.Close() - # Stops the memory stream - $ms.Close() - # Clears the RijndaelManaged Cryptology IV and Key - $r.Clear() -} - - -function Clear-OutputBox { - $OutputBox.ResetText() -} - -function Write-OutputBox { - param( - [parameter(Mandatory=$true)] - [string]$OutputBoxMessage, - [ValidateSet("WARNING: ","ERROR: ","INFO: ","IGNORE: "," ")] - [string]$Type, - [parameter(Mandatory=$true)] - [ValidateSet("SHB","Logging","SysInfo")] - [string]$Object - ) - Process { - if ($Object -like "SHB") { - if ($OutputBoxSHB.Text.Length -eq 0) { - $OutputBoxSHB.Text = "$($Type)$($OutputBoxMessage)" - [System.Windows.Forms.Application]::DoEvents() - $OutputBoxSHB.ScrollToCaret() - } - else { - $OutputBoxSHB.AppendText("`n$($Type)$($OutputBoxMessage)") - [System.Windows.Forms.Application]::DoEvents() - $OutputBoxSHB.ScrollToCaret() - } - } - if ($Object -like "Logging") { - if ($OutputBoxLogging.Text.Length -eq 0) { - $OutputBoxLogging.Text = "$($Type)$($OutputBoxMessage)" - [System.Windows.Forms.Application]::DoEvents() - $OutputBoxLogging.ScrollToCaret() - } - else { - $OutputBoxLogging.AppendText("`n$($Type)$($OutputBoxMessage)") - [System.Windows.Forms.Application]::DoEvents() - $OutputBoxLogging.ScrollToCaret() - } - } - if ($Object -like "SysInfo") { - if ($OutputBoxSysInfo.Text.Length -eq 0) { - $OutputBoxSysInfo.Text = "$($Type)$($OutputBoxMessage)" - [System.Windows.Forms.Application]::DoEvents() - $OutputBoxSysInfo.ScrollToCaret() - } - else { - $OutputBoxSysInfo.AppendText("`n$($Type)$($OutputBoxMessage)") - [System.Windows.Forms.Application]::DoEvents() - $OutputBoxSysInfo.ScrollToCaret() - } - } - } -} - -##*============================================= -##* ASSEMBLIES -##*============================================= -Add-Type -AssemblyName "System.Drawing" -Add-Type -AssemblyName "System.Windows.Forms" -Add-Type -AssemblyName "System.DirectoryServices" - -##*============================================= -##* FORM -##*============================================= -#Get Screen Resolution -$FormWidth = 805 -$FormHeight = 530 - -<#$Image = [system.drawing.image]::FromFile("$($Env:Public)\Pictures\Sample Pictures\Oryx Antelope.jpg") -$Form.BackgroundImage = $Image -$Form.BackgroundImageLayout = "None" - # None, Tile, Center, Stretch, Zoom -#> -$Form = New-Object System.Windows.Forms.Form -$Form.Size = New-Object System.Drawing.Size($FormWidth,$FormHeight) -$Form.MinimumSize = New-Object System.Drawing.Size($FormWidth,$FormHeight) -$Form.MaximumSize = New-Object System.Drawing.Size($FormWidth,$FormHeight) -$Form.MinimizeBox = $False -$Form.MaximizeBox = $False -#$Form.ControlBox = $false -$Form.ShowInTaskbar = $False -$Form.SizeGripStyle = "Hide" -$Form.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($PSHome + "\powershell.exe") -$Form.Text = ($apptitle + " (" + $appversion + ")") -$Form.StartPosition = "CenterScreen" -#$Form.FormBorderStyle = "Fixed Single" - -$Form.Topmost = $True - # CenterScreen, Manual, WindowsDefaultLocation, WindowsDefaultBounds, CenterParent -# Base64 -$ValidatedBase64String = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACx -jwv8YQUAAAJMSURBVDhPlZJdSJNhFMcftFAjdSXdRBcFFlGRa6zUlm7pKrMuqpskKKQLK/pECppR -vYRzjpb7cDq3nO87ZLbRcG02nS4Soi6kQsG5wtgmkkPmxy5G1/8e7SU01rIfPDwX5zzP+f/POeS/ -MJPtGZYMNtuaPZzP5bFbugsEfGQNmImAPo6eGzqNmx/qcJbe23q2DvPRf5NpyWQqfVLoJ5qh+Hwb -+pAae1yF4MPpWf98nVDA5ePZhBL1n+qWj+6Lin6wa20f5FDPt0auoHVSjasfL8AaMeLiu/Mo6t2r -5VP+zoaunFqRuwjclAn3g9fRHtZAGXwIoXtfVPRqP9/ENiIkJlJLOui9glx2o4B2O2GglVsjKmjC -DGzTHZD1SyD2CGW/stqIttC+Ayf75SjgNoF2+7cs6pu99L4GPTOdaI40oDdux7WRyzjkPbBCejtB -09gjaGmDWkJNWJKb1ZnFbrYJZLtf7oRrthvG7yq45mwwRjUo9oqipX3iFfM3ERjoSB6M3gEzfm/Z -64nBCtAlgfrrEzjiVrBxAzwLL1AVqMTh1wdX2STUt7bEI4b5mw7KkAJPJx/DEWPBBBXoW3Cia06P -N0kv7o7dwBFfMcO/Ws3Sekp9EtimOqANN0JF/XrnHbDPmzGQdIGNmVDmKxnl01OTx+WypwLH4Yxx -sMy0QB9rhDNhxWDSjTNvq3F0QPKH9BTQ3WZpJThnObgWOQz/8KFhvB6V/rLU0lNB15OtDsjhXXTC -PK2D3F+eXnoq6KiYcl9p4phfGq0aqkgjnZCf1ZM3pZ8/L2UAAAAASUVORK5CYII=" -$ValidatedImageBytes = [Convert]::FromBase64String($ValidatedBase64String) -$ValidatedMemoryStream = New-Object -TypeName IO.MemoryStream($ValidatedImageBytes, 0, $ValidatedImageBytes.Length) -$ValidatedMemoryStream.Write($ValidatedImageBytes, 0, $ValidatedImageBytes.Length) -$ValidatedImage = [System.Drawing.Image]::FromStream($ValidatedMemoryStream, $true) - -$WarningBase64String = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAOCAYAAAAmL5yKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ -bWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp -bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 -eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1 -MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo -dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw -dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv -IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS -ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD -cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJ -RD0ieG1wLmlpZDozRjc3RkMyQzEyMkUxMUU2QTkwQ0QyNTc2NzhGQjE0QyIgeG1wTU06RG9jdW1l -bnRJRD0ieG1wLmRpZDozRjc3RkMyRDEyMkUxMUU2QTkwQ0QyNTc2NzhGQjE0QyI+IDx4bXBNTTpE -ZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjNGNzdGQzJBMTIyRTExRTZBOTBD -RDI1NzY3OEZCMTRDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjNGNzdGQzJCMTIyRTExRTZB -OTBDRDI1NzY3OEZCMTRDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBt -ZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+qs7huQAAAh5JREFUeNqMkt9rUnEYxh93jm7Mgz/wB8s1 -SiUWO5BDi2zBwLLVRTiKVoHDFSNz1G4GttqKXdTfEMQuSpCguy66r9ZFUHZR1KKLrlqbTl3+XGrH -8/adaSnM2Jfzgfd73vd54LznAdocQakUXgd8H9+Mn/6sUSo1zT2n0wkiqtHRziDoGLzmnuoXD4Xs -+6+K4nS7uW0NrFqdbXbCOwu3ETiqR/iiO2wXNPt2bDB/fHjB7LPovyX0+LoiwHTGoJ0fci3syGC4 -x+KZPN8f+FQs4nGkjIcPJLzNlXH5wh6/x2A+8V8Djj13joj3MLKJUmUDqWQC+dwP/KIiMFrBbZf1 -LhvjZba8xuGbDcZNPZPeUdUQ9ClYSpvIZpWQJAl9u34ChiyOneMP+5fUwZf5wv1YLFbTKBpiIzrM -L0bs78Qnxt3QqVGtdiEU4plBFYuLZfB8AcjmsOxLr3qW4q51ULzlE6538jfFSwUmTrFbChyXhE63 -zkgy8da7DUCbwUCwYJnmMNeyCBEYXPWiRJKKZUPP6GVYKRq1UyRiY3Ufw8ToJqoqKH4SFQdw8K/B -IzWe0vNGuBQMVW04HhdobU1gdReDa4SP6BUoKuBZTXwW8Gev4F+ziQMO0IAIkrfp5adAY0AA7/di -hZbrjSpDrsPut8KgGzNNQrk+s1V/AX2w4TuflpFJzqBXlgFq2ouC/Z+57j914hTrUWuAOBaatITM -bwEGAF7CG6ZJhs9jAAAAAElFTkSuQmCC" -$WarningImageBytes = [Convert]::FromBase64String($WarningBase64String) -$WarningMemoryStream = New-Object -TypeName IO.MemoryStream($WarningImageBytes, 0, $WarningImageBytes.Length) -$WarningMemoryStream.Write($WarningImageBytes, 0, $WarningImageBytes.Length) -$WarningImage = [System.Drawing.Image]::FromStream($WarningMemoryStream, $true) - -$ErrorBase64String = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACx -jwv8YQUAAAJ0SURBVDhPdZPNTxphEMb35DeCioAgYPhGFPzCjxiNJurBxGiC+g940Zsa/w+u3ji3 -VdfWGlywWO3uIqb1pTWx1V5M2nhp00PTpMen865gsdhJ5rLwm2eemXmFYuSXluJnsZi4azYbCp/K -QmxpMZzOzYnK9HS88OkuLlZWErebm3g7P49UKMR2LZayIgWYfdrYgDw4iHQwmNB+4MoaHItBHR+H -MjoKKRBgHND+QLFjtRqyHF5fhxKNQu7p0TLl98cF3jZXLsLK8DDkoSFIPh/boSL38NoalN5eKF1d -93ng8YjCc/LM2y6F5f5+yH19OPB6WXZ2ll2trkIlRTUSgRoOI0speTxsm4prLXLPvO1SWCGAq3xc -Xka2u1uDTilznZ2Q3G62bbM9nBP3zNsuhbmiEghAbmuD4nRCpUwRvPUvXAzumbctk9Kx3Y5MfT1e -U54YDFCamnBgsbCt1tbHYR58YMrUFGMzM3hVV6fBbxoaoBqNyJlMSNls7Nn/CnB1meD84iIOCTwq -gc/MZryzWvHe4UDG4WBP7fZy//LkJMsvLCBNyhnKY71eaztH8LnNhg/k/9LlwpXXi2OX62+RIswI -lmprka6pwZFOp6lzz2lqmytfut347PfjJhTCF5qRQgN/4nAYBHliQjynQ0pWV0OqqsIhFeHekyaT -NjDuOeN0smufDzcdHbillX6ja/xO684Gg6JwNDAQ36+sRLKiAikqwoe339z8YFW83RNa31daKwd/ -0sH9GhlBPhy+e1QvdLpEscBLo7H8SCh4EdXvZz/oIf0eG8N1NHr3mIqxp9fH9xobxfvzfCS451x7 -u3gRiRSesyD8Adwnbx6z9nmyAAAAAElFTkSuQmCC" -$ErrorImageBytes = [Convert]::FromBase64String($ErrorBase64String) -$ErrorMemoryStream = New-Object -TypeName IO.MemoryStream($ErrorImageBytes, 0, $ErrorImageBytes.Length) -$ErrorMemoryStream.Write($ErrorImageBytes, 0, $ErrorImageBytes.Length) -$ErrorImage = [System.Drawing.Image]::FromStream($ErrorMemoryStream, $true) - -# PictureBoxes -$PBReboot = New-Object -TypeName System.Windows.Forms.PictureBox -$PBReboot.Location = New-Object -TypeName System.Drawing.Size(203,50) -$PBReboot.Size = New-Object -TypeName System.Drawing.Size(16,16) - -$PBModel = New-Object -TypeName System.Windows.Forms.PictureBox -$PBModel.Location = New-Object -TypeName System.Drawing.Size(203,50) -$PBModel.Size = New-Object -TypeName System.Drawing.Size(16,16) - -$PBOS = New-Object -TypeName System.Windows.Forms.PictureBox -$PBOS.Location = New-Object -TypeName System.Drawing.Size(203,90) -$PBOS.Size = New-Object -TypeName System.Drawing.Size(16,16) - -$PBPS = New-Object -TypeName System.Windows.Forms.PictureBox -$PBPS.Location = New-Object -TypeName System.Drawing.Size(203,130) -$PBPS.Size = New-Object -TypeName System.Drawing.Size(16,16) - -$PBUEFI = New-Object -TypeName System.Windows.Forms.PictureBox -$PBUEFI.Location = New-Object -TypeName System.Drawing.Size(203,170) -$PBUEFI.Size = New-Object -TypeName System.Drawing.Size(16,16) - -$PBBIOSRevision = New-Object -TypeName System.Windows.Forms.PictureBox -$PBBIOSRevision.Location = New-Object -TypeName System.Drawing.Size(444,72) -$PBBIOSRevision.Size = New-Object -TypeName System.Drawing.Size(16,16) - -$PBBIOSPassword = New-Object -TypeName System.Windows.Forms.PictureBox -$PBBIOSPassword.Location = New-Object -TypeName System.Drawing.Size(444,112) -$PBBIOSPassword.Size = New-Object -TypeName System.Drawing.Size(16,16) - -$PBBIOSTPM = New-Object -TypeName System.Windows.Forms.PictureBox -$PBBIOSTPM.Location = New-Object -TypeName System.Drawing.Size(444,192) -$PBBIOSTPM.Size = New-Object -TypeName System.Drawing.Size(16,16) - -$PBBIOSTPMON = New-Object -TypeName System.Windows.Forms.PictureBox -$PBBIOSTPMON.Location = New-Object -TypeName System.Drawing.Size(444,232) -$PBBIOSTPMON.Size = New-Object -TypeName System.Drawing.Size(16,16) - -$PBBIOSTPMACT = New-Object -TypeName System.Windows.Forms.PictureBox -$PBBIOSTPMACT.Location = New-Object -TypeName System.Drawing.Size(444,272) -$PBBIOSTPMACT.Size = New-Object -TypeName System.Drawing.Size(16,16) - -$PBBIOSVT = New-Object -TypeName System.Windows.Forms.PictureBox -$PBBIOSVT.Location = New-Object -TypeName System.Drawing.Size(720,72) -$PBBIOSVT.Size = New-Object -TypeName System.Drawing.Size(16,16) - -$PBBIOSVTDirectIO = New-Object -TypeName System.Windows.Forms.PictureBox -$PBBIOSVTDirectIO.Location = New-Object -TypeName System.Drawing.Size(720,112) -$PBBIOSVTDirectIO.Size = New-Object -TypeName System.Drawing.Size(16,16) - -$PBBIOSVTTE = New-Object -TypeName System.Windows.Forms.PictureBox -$PBBIOSVTTE.Location = New-Object -TypeName System.Drawing.Size(720,152) -$PBBIOSVTTE.Size = New-Object -TypeName System.Drawing.Size(16,16) - -$PBLEGACYOROM = New-Object -TypeName System.Windows.Forms.PictureBox -$PBLEGACYOROM.Location = New-Object -TypeName System.Drawing.Size(720,232) -$PBLEGACYOROM.Size = New-Object -TypeName System.Drawing.Size(16,16) - -$PBSECUREBOOT = New-Object -TypeName System.Windows.Forms.PictureBox -$PBSECUREBOOT.Location = New-Object -TypeName System.Drawing.Size(720,272) -$PBSECUREBOOT.Size = New-Object -TypeName System.Drawing.Size(16,16) - - -# ListBoxes -$LBOSVersions = New-Object -TypeName System.Windows.Forms.ListBox -$LBOSVersions.Location = New-Object -TypeName System.Drawing.Size(30,390) -$LBOSVersions.Size = New-Object -TypeName System.Drawing.Size(200,56) -$LBOSVersions.SelectionMode = "None" -$LBOSVersions.Items.AddRange(@($SupportedOperatingSystems.name)) - -# TabPages -$TabSHBPage = New-Object System.Windows.Forms.TabPage -$TabSHBPage.Location = New-Object System.Drawing.Size(10,50) -$TabSHBPage.Size = New-Object System.Drawing.Size(300,300) -$TabSHBPage.Text = "SHB" -$TabSHBPage.Name = "SHB" -$TabSHBPage.Padding = "0,0,0,0" -$TabSHBPage.BackColor = "Control" - -$TabLoggingPage = New-Object System.Windows.Forms.TabPage -$TabLoggingPage.Location = New-Object System.Drawing.Size(10,50) -$TabLoggingPage.Size = New-Object System.Drawing.Size(300,300) -$TabLoggingPage.Text = "Logging" -$TabLoggingPage.Name = "Logging" -$TabLoggingPage.Padding = "0,0,0,0" -$TabLoggingPage.BackColor = "Control" - -$TabControl = New-Object System.Windows.Forms.TabControl -$TabControl.Location = New-Object System.Drawing.Size(0,0) -$TabControl.Size = New-Object System.Drawing.Size(805,530) -$TabControl.Anchor = "Top, Bottom, Left, Right" -$TabControl.Name = "Global" -$TabControl.SelectedIndex = 0 -$TabControl.Add_Selected([System.Windows.Forms.TabControlEventHandler]{ - if ($TabControl.SelectedTab.Name -like "Logging") { - Load-LoggingPage - if ($TabControl.SelectedTab.Enabled -eq $true) { - if (-not($OutputBoxLogging.Text.Length -ge 1)) { - $OutputBoxLogging.ResetText() - Write-OutputBox -OutputBoxMessage "Addtionally you can choose to output a log file to your desktop" -Type "INFO: " -Object SysInfo - } - } - } -}) - -# ProgressBars -$ProgressBar = New-Object System.Windows.Forms.ProgressBar -$ProgressBar.Location = New-Object System.Drawing.Size(260,340) -$ProgressBar.Size = New-Object System.Drawing.Size(495,30) -$ProgressBar.Step = 1 -$ProgressBar.Value = 0 - -# OutputBoxes -$OutputBoxSysInfo = New-Object System.Windows.Forms.RichTextBox -$OutputBoxSysInfo.Location = New-Object System.Drawing.Size(30,250) -$OutputBoxSysInfo.Size = New-Object System.Drawing.Size(200,115) -$OutputBoxSysInfo.BackColor = "white" -$OutputBoxSysInfo.ReadOnly = $true -$OutputBoxSysInfo.MultiLine = $True - -$OutputBoxLogging = New-Object System.Windows.Forms.RichTextBox -$OutputBoxLogging.Location = New-Object System.Drawing.Size(10,10) -$OutputBoxLogging.Size = New-Object System.Drawing.Size(763,350) -$OutputBoxLogging.Font = "Courier New" -$OutputBoxLogging.BackColor = "white" -$OutputBoxLogging.ReadOnly = $true -$OutputBoxLogging.MultiLine = $True - -# Buttons -$ButtonExportLogging = New-Object System.Windows.Forms.Button -$ButtonExportLogging.Location = New-Object System.Drawing.Size(673,420) -$ButtonExportLogging.Size = New-Object System.Drawing.Size(100,30) -$ButtonExportLogging.Text = "Export" -$ButtonExportLogging.Name = "ExportBtn" -$ButtonExportLogging.TabIndex = "1" -$ButtonExportLogging.Add_Click({Get-SystemInfo}) - -$ButtonContinueExit = New-Object System.Windows.Forms.Button -$ButtonContinueExit.Location = New-Object System.Drawing.Size(655,420) -$ButtonContinueExit.Size = New-Object System.Drawing.Size(100,30) -$ButtonContinueExit.Text = "Continue" -$ButtonExportLogging.Name = "ContinueBtn" -$ButtonContinueExit.Add_Click( - {$Looping=$False - $Form.Close() - #[environment]::exit(0) - [System.Windows.Forms.Application]::Exit($null) - }) -$Form.Controls.Add($ButtonContinueExit) - -# Labels -$LabelHeader = New-Object System.Windows.Forms.Label -$LabelHeader.Location = New-Object System.Drawing.Size(240,10) -$LabelHeader.Size = New-Object System.Drawing.Size(500,30) -$LabelHeader.Text = $apptitle -$LabelHeader.Font = New-Object System.Drawing.Font("Verdana",12,[System.Drawing.FontStyle]::Bold) -$LabelHeader.TextAlign = 'TopRight' - -$LabelPendingRestart = New-Object System.Windows.Forms.Label -$LabelPendingRestart.Size = New-Object System.Drawing.Size(150,15) -$LabelPendingRestart.Location = New-Object System.Drawing.Size(38,52) -$LabelPendingRestart.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) -$LabelPendingRestart.Text = "Reboot Required" - -$LabelSupportedModel = New-Object System.Windows.Forms.Label -$LabelSupportedModel.Size = New-Object System.Drawing.Size(150,15) -$LabelSupportedModel.Location = New-Object System.Drawing.Size(38,52) -$LabelSupportedModel.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) -$LabelSupportedModel.Text = "Supported Model" - -$LabelSupportedOS = New-Object System.Windows.Forms.Label -$LabelSupportedOS.Size = New-Object System.Drawing.Size(160,15) -$LabelSupportedOS.Location = New-Object System.Drawing.Size(38,92) -$LabelSupportedOS.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) -$LabelSupportedOS.Text = "Operating System" - -$LabelPowerShell = New-Object System.Windows.Forms.Label -$LabelPowerShell.Size = New-Object System.Drawing.Size(160,15) -$LabelPowerShell.Location = New-Object System.Drawing.Size(38,132) -$LabelPowerShell.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) -$LabelPowerShell.Text = "PowerShell Version" - -$LabelUEFI = New-Object System.Windows.Forms.Label -$LabelUEFI.Size = New-Object System.Drawing.Size(160,15) -$LabelUEFI.Location = New-Object System.Drawing.Size(38,172) -$LabelUEFI.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) -$LabelUEFI.Text = "UEFI Enabled" - -$LabelBIOSRevision = New-Object System.Windows.Forms.Label -$LabelBIOSRevision.Size = New-Object System.Drawing.Size(150,15) -$LabelBIOSRevision.Location = New-Object System.Drawing.Size(278,74) -$LabelBIOSRevision.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) -$LabelBIOSRevision.Text = "Revision" - -$LabelBIOSPassword = New-Object System.Windows.Forms.Label -$LabelBIOSPassword.Size = New-Object System.Drawing.Size(150,15) -$LabelBIOSPassword.Location = New-Object System.Drawing.Size(278,114) -$LabelBIOSPassword.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) -$LabelBIOSPassword.Text = "Password Known" - -$LabelBIOSTPM = New-Object System.Windows.Forms.Label -$LabelBIOSTPM.Size = New-Object System.Drawing.Size(150,15) -$LabelBIOSTPM.Location = New-Object System.Drawing.Size(278,194) -$LabelBIOSTPM.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) -$LabelBIOSTPM.Text = "TPM Exist" - -$LabelBIOSTPMEnabled = New-Object System.Windows.Forms.Label -$LabelBIOSTPMEnabled.Size = New-Object System.Drawing.Size(150,15) -$LabelBIOSTPMEnabled.Location = New-Object System.Drawing.Size(278,234) -$LabelBIOSTPMEnabled.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) -$LabelBIOSTPMEnabled.Text = "TPM Enabled" - -$LabelBIOSTPMActive = New-Object System.Windows.Forms.Label -$LabelBIOSTPMActive.Size = New-Object System.Drawing.Size(150,15) -$LabelBIOSTPMActive.Location = New-Object System.Drawing.Size(278,274) -$LabelBIOSTPMActive.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) -$LabelBIOSTPMActive.Text = "TPM Activated" - -$LabelBIOSVT = New-Object System.Windows.Forms.Label -$LabelBIOSVT.Size = New-Object System.Drawing.Size(150,15) -$LabelBIOSVT.Location = New-Object System.Drawing.Size(554,74) -$LabelBIOSVT.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) -$LabelBIOSVT.Text = "Virtualization Support" - -$LabelBIOSVTDirectIO = New-Object System.Windows.Forms.Label -$LabelBIOSVTDirectIO.Size = New-Object System.Drawing.Size(150,15) -$LabelBIOSVTDirectIO.Location = New-Object System.Drawing.Size(554,114) -$LabelBIOSVTDirectIO.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) -$LabelBIOSVTDirectIO.Text = "Direct I/O" - -$LabelBIOSVTTE = New-Object System.Windows.Forms.Label -$LabelBIOSVTTE.Size = New-Object System.Drawing.Size(150,15) -$LabelBIOSVTTE.Location = New-Object System.Drawing.Size(554,154) -$LabelBIOSVTTE.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) -$LabelBIOSVTTE.Text = "Trusted Execution" - -$LabelLegacyROM = New-Object System.Windows.Forms.Label -$LabelLegacyROM.Size = New-Object System.Drawing.Size(150,15) -$LabelLegacyROM.Location = New-Object System.Drawing.Size(554,234) -$LabelLegacyROM.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) -$LabelLegacyROM.Text = "Legacy ROM Disabled" - -$LabelSecureBoot = New-Object System.Windows.Forms.Label -$LabelSecureBoot.Size = New-Object System.Drawing.Size(150,15) -$LabelSecureBoot.Location = New-Object System.Drawing.Size(554,274) -$LabelSecureBoot.Font = New-Object System.Drawing.Font("Microsoft Sans Serif","8.25",[System.Drawing.FontStyle]::Bold) -$LabelSecureBoot.Text = "Secure Boot Enabled" - -# CheckBoxes -$CBPrerequisitesOverride = New-Object System.Windows.Forms.CheckBox -$CBPrerequisitesOverride.Location = New-Object System.Drawing.Size(30,205) -$CBPrerequisitesOverride.Size = New-Object System.Drawing.Size(180,20) -$CBPrerequisitesOverride.Text = "Override Prerequisites" -$CBPrerequisitesOverride.Name = "PrerequisitesOverride" -$CBPrerequisitesOverride.Add_CheckedChanged({ - switch ($CBPrerequisitesOverride.Checked) { - $true { Interactive-TabPages -Mode Enable } - $false { Interactive-TabPages -Mode Disable } - } -}) - -$CBContinueOverride = New-Object System.Windows.Forms.CheckBox -$CBContinueOverride.Location = New-Object System.Drawing.Size(455,426) -$CBContinueOverride.Size = New-Object System.Drawing.Size(180,20) -$CBContinueOverride.Text = "Override validation results" -$CBContinueOverride.Name = "validationOverride" -$CBContinueOverride.Add_CheckedChanged({ - switch ($CBContinueOverride.Checked) { - $true { Interactive-Buttons -Mode Enable } - $false { Interactive-Buttons -Mode Disable } - } -}) - - -# GroupBoxes -$GBSystemValidation = New-Object System.Windows.Forms.GroupBox -$GBSystemValidation.Location = New-Object System.Drawing.Size(20,20) -$GBSystemValidation.Size = New-Object System.Drawing.Size(220,210) -$GBSystemValidation.Text = "Pre-Load Validation" - -$GBSystemModel = New-Object System.Windows.Forms.GroupBox -$GBSystemModel.Location = New-Object System.Drawing.Size(20,234) -$GBSystemModel.Size = New-Object System.Drawing.Size(220,138) -$GBSystemModel.Text = "System Information" - -$GBOSVersion = New-Object System.Windows.Forms.GroupBox -$GBOSVersion.Location = New-Object System.Drawing.Size(20,375) -$GBOSVersion.Size = New-Object System.Drawing.Size(220,78) -$GBOSVersion.Text = "Supported Operating Systems" - -$GBBIOSInfo = New-Object System.Windows.Forms.GroupBox -$GBBIOSInfo.Location = New-Object System.Drawing.Size(260,45) -$GBBIOSInfo.Size = New-Object System.Drawing.Size(220,106) -$GBBIOSInfo.Text = "BIOS Info" - -$GBTPMSettings = New-Object System.Windows.Forms.GroupBox -$GBTPMSettings.Location = New-Object System.Drawing.Size(260,164) -$GBTPMSettings.Size = New-Object System.Drawing.Size(220,146) -$GBTPMSettings.Text = "TPM Settings" - -$GBVTSettings = New-Object System.Windows.Forms.GroupBox -$GBVTSettings.Location = New-Object System.Drawing.Size(535,45) -$GBVTSettings.Size = New-Object System.Drawing.Size(220,146) -$GBVTSettings.Text = "Virtualization Settings" - -$GBBootSettings = New-Object System.Windows.Forms.GroupBox -$GBBootSettings.Location = New-Object System.Drawing.Size(535,204) -$GBBootSettings.Size = New-Object System.Drawing.Size(220,106) -$GBBootSettings.Text = "Boot Settings" - -$GBModel = New-Object System.Windows.Forms.GroupBox -$GBModel.Location = New-Object System.Drawing.Size(30,35) -$GBModel.Size = New-Object System.Drawing.Size(200,40) - -$GBOS = New-Object System.Windows.Forms.GroupBox -$GBOS.Location = New-Object System.Drawing.Size(30,75) -$GBOS.Size = New-Object System.Drawing.Size(200,40) - -$GBPS = New-Object System.Windows.Forms.GroupBox -$GBPS.Location = New-Object System.Drawing.Size(30,115) -$GBPS.Size = New-Object System.Drawing.Size(200,40) - -$GBUEFI = New-Object System.Windows.Forms.GroupBox -$GBUEFI.Location = New-Object System.Drawing.Size(30,155) -$GBUEFI.Size = New-Object System.Drawing.Size(200,40) - -$GBBIOSRevision = New-Object System.Windows.Forms.GroupBox -$GBBIOSRevision.Location = New-Object System.Drawing.Size(270,58) -$GBBIOSRevision.Size = New-Object System.Drawing.Size(200,40) - -$GBBIOSPassword = New-Object System.Windows.Forms.GroupBox -$GBBIOSPassword.Location = New-Object System.Drawing.Size(270,98) -$GBBIOSPassword.Size = New-Object System.Drawing.Size(200,40) - -$GBBIOSTPM = New-Object System.Windows.Forms.GroupBox -$GBBIOSTPM.Location = New-Object System.Drawing.Size(270,178) -$GBBIOSTPM.Size = New-Object System.Drawing.Size(200,40) - -$GBBIOSTPMON = New-Object System.Windows.Forms.GroupBox -$GBBIOSTPMON.Location = New-Object System.Drawing.Size(270,218) -$GBBIOSTPMON.Size = New-Object System.Drawing.Size(200,40) - -$GBBIOSTPMACT = New-Object System.Windows.Forms.GroupBox -$GBBIOSTPMACT.Location = New-Object System.Drawing.Size(270,258) -$GBBIOSTPMACT.Size = New-Object System.Drawing.Size(200,40) - -$GBBIOSVT = New-Object System.Windows.Forms.GroupBox -$GBBIOSVT.Location = New-Object System.Drawing.Size(545,58) -$GBBIOSVT.Size = New-Object System.Drawing.Size(200,40) - -$GBBIOSVTDirectIO = New-Object System.Windows.Forms.GroupBox -$GBBIOSVTDirectIO.Location = New-Object System.Drawing.Size(545,98) -$GBBIOSVTDirectIO.Size = New-Object System.Drawing.Size(200,40) - -$GBBIOSVTTE = New-Object System.Windows.Forms.GroupBox -$GBBIOSVTTE.Location = New-Object System.Drawing.Size(545,138) -$GBBIOSVTTE.Size = New-Object System.Drawing.Size(200,40) - -$GBLEGACYROM = New-Object System.Windows.Forms.GroupBox -$GBLEGACYROM.Location = New-Object System.Drawing.Size(545,218) -$GBLEGACYROM.Size = New-Object System.Drawing.Size(200,40) - -$GBSECUREBOOT = New-Object System.Windows.Forms.GroupBox -$GBSECUREBOOT.Location = New-Object System.Drawing.Size(545,258) -$GBSECUREBOOT.Size = New-Object System.Drawing.Size(200,40) - -$GBLogging = New-Object System.Windows.Forms.GroupBox -$GBLogging.Location = New-Object System.Drawing.Size(10,10) -$GBLogging.Size = New-Object System.Drawing.Size(190,350) -$GBLogging.Text = "Logging" -$GBLogging.Name = "Logging" - - -##*============================================= -##* MAIN -##*============================================= -Load-Form From ca444d33a6a42aff3ff3f0c668ffa32918370d3b Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Wed, 28 Mar 2018 23:43:08 -0400 Subject: [PATCH 17/21] Delete OSD-BIOSConfig.xml --- BIOSPrerequisitesTool/OSD-BIOSConfig.xml | 71 ------------------------ 1 file changed, 71 deletions(-) delete mode 100644 BIOSPrerequisitesTool/OSD-BIOSConfig.xml diff --git a/BIOSPrerequisitesTool/OSD-BIOSConfig.xml b/BIOSPrerequisitesTool/OSD-BIOSConfig.xml deleted file mode 100644 index d98a90d..0000000 --- a/BIOSPrerequisitesTool/OSD-BIOSConfig.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - BIOS Prerequisites Tool - 1.0.2 - - False - True - - false - \\SERVERNAME\SHARE\Path-to-Config.xml - - - - $scriptRoot\PowershellModules\functions.ps1 - - - - - DellBIOSPowershell - Dell Inc. - D:\DeploymentShare\Scripts\TRIBOOT\PowershellModules\DellBIOSProvider\1.0 - D:\DeploymentShare\Scripts\TRIBOOT\PowershellModules\DellBIOSProviderX86\1.0 - - - Dell Command | Configure Toolkit - Dell Inc. - D:\DeploymentShare\Scripts\TRIBOOT\tools\Dell\X86_64 - D:\DeploymentShare\Scripts\TRIBOOT\tools\Dell\X86 - - - - - Vp/6rtVh5xVziVakKqKSlQ== - dLJ+P3TJ3kxFVxxlawpqzA== - az1IW4sWbG00Tc1tKXoLPA== - - - - - - - Microsoft Windows 10 Enterprise (1511) - 10586 - x64 - - - - - Dell Inc. - Latitude E7450 - A12 - - - Dell Inc. - Precision T5610 - A11 - - - Dell Inc. - Precision T7610 - A11 - - - System manufacturer - System Product Name - 1101 - - - - - From 4fa3a631f72f99cb74e176d35947f888f1f97708 Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Wed, 28 Mar 2018 23:43:24 -0400 Subject: [PATCH 18/21] Rename ComputerName/Set-OSDComputerName.ps1 to Set-OSDComputerName.ps1 --- ComputerName/Set-OSDComputerName.ps1 => Set-OSDComputerName.ps1 | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ComputerName/Set-OSDComputerName.ps1 => Set-OSDComputerName.ps1 (100%) diff --git a/ComputerName/Set-OSDComputerName.ps1 b/Set-OSDComputerName.ps1 similarity index 100% rename from ComputerName/Set-OSDComputerName.ps1 rename to Set-OSDComputerName.ps1 From 4bbf46cd1baa3e352e0e0a656b365f89607158b4 Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Wed, 28 Mar 2018 23:43:35 -0400 Subject: [PATCH 19/21] Delete README.md --- ComputerName/README.md | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 ComputerName/README.md diff --git a/ComputerName/README.md b/ComputerName/README.md deleted file mode 100644 index 139597f..0000000 --- a/ComputerName/README.md +++ /dev/null @@ -1,2 +0,0 @@ - - From 3fcf70d48cb2dd2cc1f411d76faadfe7d79136ce Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Thu, 14 Jun 2018 21:10:15 -0400 Subject: [PATCH 20/21] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 61df0d1..339e077 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ # OSD -Powershell scripts for OSD deployment in PE. +Powershell scripts for OSD deployment in PE. Presents simple and clean UI for naming a PC Requires powershell feature added to WinPE. From 47917c7001da70f70f68acc31a15478598c827d9 Mon Sep 17 00:00:00 2001 From: Richard Tracy Date: Thu, 14 Jun 2018 21:13:09 -0400 Subject: [PATCH 21/21] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 339e077..2d0f3cb 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,6 @@ Powershell scripts for OSD deployment in PE. Presents simple and clean UI for naming a PC Requires powershell feature added to WinPE. + + +![alt text](https://1.bp.blogspot.com/-Ux-u5XxNGXE/WbajKn28lfI/AAAAAAAAJko/rB2X5Cq7f-stOUXp_L8Mrdaz-lMAQVCHgCLcBGAs/s1600/OSDComputerName.png)