diff --git a/Start-UpgradeToWindows11.ps1 b/Start-UpgradeToWindows11.ps1 new file mode 100644 index 0000000..e05226f --- /dev/null +++ b/Start-UpgradeToWindows11.ps1 @@ -0,0 +1,96 @@ +# Elevate to run as administrator if not already +#If ( -not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator") ) +#{ +# Write-Output "Not running as administrator, relaunching as administrator" +# Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -NoExit -File `"$PSCommandPath`"" -Verb RunAs ; Exit 0 +#} +#Else { Write-Output "Running as administrator" } + +# Get the operating system CIM instance +Try { $OS = Get-CimInstance -ClassName Win32_OperatingSystem -ErrorAction Stop } +Catch { Write-Error "Could not get Win32_OperatingSystem CIM instance`n"+$_.Exception.Message ; Exit 1 } + +# Exit if the endpoint is not running Windows 10 +If ( ($OS.Caption -notmatch "Windows 10") ) { Write-Output "This endpoint is not running Windows 10" ; Exit 1 } +Else { Write-Output "This endpoint is running Windows 10" } + +# Exit if the endpoint is not running a Pro/Enterprise edition of Windows +If ( ($OS.Caption -notmatch "Pro") -and ($OS.Caption -notmatch "Enterprise") ) { Write-Output "Only Pro/Enterprise versions of Windows can be upgraded" ; Exit 1 } +Else { Write-Output "This endpoint is running a Pro/Enterprise version of Windows" } + +# Exit if the endpoint is a server edition +Try +{ + If ( $OS.ProductType -gt 1 ) { Write-Output "Server operating system will not be upgraded" ; Exit 1 } + Else { Write-Output "This endpoint is not a server operating system" } +} +Catch { Write-Error "The operating system type could not be determined`n"+$_.Exception.Message ; Exit 1 } + +# Exit if the endpoint does not have at least 4GB of RAM +Try +{ + If ( (Get-CimInstance -ClassName Win32_PhysicalMemory -ErrorAction Stop | Measure-Object -Property Capacity -Sum).Sum -lt 4GB ) { Write-Output "This endpoint does not have at least 4GB of RAM" ; Exit 1 } + Else { Write-Output "This endpoint has at least 4GB of RAM" } +} +Catch { Write-Error "The amount of RAM could not be determined`n"+$_.Exception.Message ; Exit 1 } + +# Exit if the endpoint does not have at least 64GB of storage on the system drive +Try +{ + $SystemDrive = $Env:SystemDrive.TrimEnd('\') + If ( (Get-CimInstance -ClassName Win32_Volume -Filter "DriveLetter = '$SystemDrive'" -ErrorAction Stop).FreeSpace -lt 64GB ) { Write-Output "This endpoint does not have at least 64GB of storage on the system drive" ; Exit 1 } + Else { Write-Output "This endpoint has at least 64GB of storage on the system drive" } +} +Catch { Write-Error "The free space on the system drive could not be determined`n"+$_.Exception.Message ; Exit 1 } + +# Exit if TPM does not exist or is not version 2.0 +Try +{ + $TPM2Present = $false + ForEach ( $specVersion in (Get-CimInstance -Namespace "root\CIMV2\Security\MicrosoftTpm" -Class Win32_Tpm -ErrorAction Stop).SpecVersion ) + { + If ( $specVersion -ge 2.0 ) { $TPM2Present = $true ; Break } + } + If ( $TPM2Present -eq $false ) { Write-Output "TPM does not support version 2.0 specification" ; Exit 1 } + Else { Write-Output "This endpoint has a TPM compliant with the version 2.0 specification" } +} +Catch { Write-Error "TPM is not present or its version cannot be determined`n"+$_.Exception.Message ; Exit 1 } + +# Exit if Secure Boot is not enabled +Try +{ + If ( (Confirm-SecureBootUEFI -ErrorAction Stop) -eq $false ) { Write-Output "Secure Boot is not enabled" ; Exit 1 } + Else { Write-Output "Secure Boot is enabled" } +} +Catch { Write-Output "Secure Boot state cannot be determined.`n"+$_.Exception.Message ; Exit 1 } + +# Uninstall previous Windows 11 Update Assistant +$WIAPath = "${Env:ProgramFiles(x86)}\WindowsInstallationAssistant\Windows10UpgraderApp.exe" +If ( Test-Path $WIAPath ) +{ + Write-Output "Uninstalling existing Windows Installation Assistant" + Get-Process -Name "Windows10UpgraderApp" -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue + Try { Start-Process $WIAPath -ArgumentList '/ForceUninstall' -Wait } + Catch { Write-Error $_.Exception.Message ; Exit 1} +} Else { Write-Output "No existing Windows Installation Assistant found" } + +# URL to the Windows Installation Assistant +$URL = 'https://go.microsoft.com/fwlink/?linkid=2171764' + +# Download Windows Installation Assistant +$WIAInstaller = "${Env:TEMP}\Windows11InstallationAssistant.exe" +If ( Test-Path $WIAInstaller ) +{ + Write-Output "Removing existing Windows Installation Assistant installer: ${WIAInstaller}" + Remove-Item $WIAInstaller -Force -ErrorAction SilentlyContinue +} +Write-Output "Downloading ${URL} to ""${WIAInstaller}""" +Try { (New-Object System.Net.WebClient).DownloadFile($URL,$WIAInstaller) } +Catch { Write-Error "The Windows Installation Assistant could not be downloaded`n"+$_.Exception.Message ; Exit 1 } + +# Install and run the Windows Installation Assistant +If ( -not (Test-Path $WIAInstaller) ) { Write-Error "The Windows Installation Assistant could not be found after successfully downloading" ; Exit 1 } +Write-Output "Launching upgrade" +Try { Start-Process -FilePath $WIAInstaller -ArgumentList "/QuietInstall /SkipEULA /Auto Upgrade /SkipSelfUpdate /ShowProgressInTaskBarIcon /SkipCompatCheck" } +Catch { Write-Output $_.Exception.Message ; Exit 1} +Exit 0 \ No newline at end of file