diff --git a/Windows11-Enable-Upgrade.ps1 b/Windows11-Enable-Upgrade.ps1 new file mode 100644 index 0000000..58613d2 --- /dev/null +++ b/Windows11-Enable-Upgrade.ps1 @@ -0,0 +1,140 @@ +<# +.SYNOPSIS +Bypasses Windows 11 hardware requirements for in-place upgrades. + +.DESCRIPTION +This script modifies specific registry values to override system compatibility checks performed during +Windows 11 upgrades. It removes legacy upgrade failure entries, simulates compatible hardware state, +enables Microsoft's documented bypass policy for unsupported TPM or CPU configurations, and sets the +UpgradeEligibility flag required by the Windows 11 Upgrade Assistant. + +This is intended for lab, evaluation, or controlled environments where hardware policy allows. + +.NOTES +Author: asheroto +Source: https://gist.github.com/asheroto/5087d2a38b311b0c92be2a4f23f92d3e +Required: Run as Administrator + +.LICENSE +Use at your own risk. No warranty expressed or implied. +#> + +function Write-Section { +<# +.SYNOPSIS +Displays a section header with borders using Write-Host and optional color. + +.DESCRIPTION +Prints multi-line text surrounded by a hash border for readability. +Supports output coloring via the Color parameter. + +.PARAMETER Text +The text to display. Can include multiple lines. + +.PARAMETER Color +(Optional) The color to use for the text and border. Defaults to White. + +.EXAMPLE +Write-Section -Text "Starting Process" + +.EXAMPLE +Write-Section -Text "Line 1`nLine 2" -Color Green +#> + param ( + [Parameter(Mandatory)] + [string]$Text, + + [string]$Color = "White" + ) + + $lines = $Text -split "`n" + $maxLength = ($lines | Measure-Object -Property Length -Maximum).Maximum + $border = "#" * ($maxLength + 4) + + Write-Host "" + Write-Host $border -ForegroundColor $Color + foreach ($line in $lines) { + Write-Host ("# " + $line.PadRight($maxLength) + " #") -ForegroundColor $Color + } + Write-Host $border -ForegroundColor $Color + Write-Host "" +} + +function Set-RegistryValueForced { + <# +.SYNOPSIS +Adds or updates a registry value with error handling. + +.DESCRIPTION +Creates the specified registry key if it does not exist and sets the provided value. +Supports String, DWord, QWord, Binary, and MultiString types. +Outputs an error message if the operation fails. + +.PARAMETER Path +The full registry path (e.g., HKLM:\Software\Example). + +.PARAMETER Name +The name of the registry value to create or update. + +.PARAMETER Type +The type of the registry value (String, DWord, QWord, Binary, MultiString). + +.PARAMETER Value +The value to set. For MultiString, provide an array of strings. + +.EXAMPLE +Set-RegistryValueForced -Path "HKLM:\Software\Test" -Name "TestValue" -Type String -Value "OK" + +.EXAMPLE +Set-RegistryValueForced -Path "HKLM:\Software\Test" -Name "Flags" -Type DWord -Value 1 +#> + + param ( + [string]$Path, + [string]$Name, + [string]$Type, + [object]$Value + ) + + try { + # Ensure the key exists + if (-not (Test-Path -Path $Path)) { + New-Item -Path $Path -Force | Out-Null + } + + # Set the registry value + Set-ItemProperty -Path $Path -Name $Name -Value $Value -Type $Type -Force + } catch { + Write-Output "Failed to set $Name in ${Path}: $($_.Exception.Message)" + } +} + +# Step 1: Clear old upgrade failure records +Write-Host "Step 1: Clearing old upgrade failure records..." -ForegroundColor Yellow +Remove-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\CompatMarkers" -Recurse -Force -ErrorAction SilentlyContinue +Remove-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Shared" -Recurse -Force -ErrorAction SilentlyContinue +Remove-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TargetVersionUpgradeExperienceIndicators" -Recurse -Force -ErrorAction SilentlyContinue +Write-Host "Cleanup complete." -ForegroundColor Green + +# Step 2: Simulating hardware compatibility +Write-Host "Step 2: Simulating hardware compatibility..." -ForegroundColor Yellow +Set-RegistryValueForced -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\HwReqChk" -Name "HwReqChkVars" -Type MultiString -Value @( + "SQ_SecureBootCapable=TRUE", + "SQ_SecureBootEnabled=TRUE", + "SQ_TpmVersion=2", + "SQ_RamMB=8192" +) +Write-Host "Hardware compatibility values applied." -ForegroundColor Green + +# Step 3: Allow upgrades on unsupported TPM or CPU +Write-Host "Step 3: Allowing upgrades on unsupported TPM or CPU..." -ForegroundColor Yellow +Set-RegistryValueForced -Path "HKLM:\SYSTEM\Setup\MoSetup" -Name "AllowUpgradesWithUnsupportedTPMOrCPU" -Type DWord -Value 1 +Write-Host "Upgrade policy for unsupported hardware enabled." -ForegroundColor Green + +# Step 4: Set Upgrade Eligibility flag in HKCU +Write-Host "Step 4: Setting upgrade eligibility flag..." -ForegroundColor Yellow +Set-RegistryValueForced -Path "HKCU:\Software\Microsoft\PCHC" -Name "UpgradeEligibility" -Type DWord -Value 1 +Write-Host "Eligibility flag set." -ForegroundColor Green + +# Done +Write-Section -Text "All operations completed successfully!`nYou can now upgrade using the Windows 11 Upgrade Assistant or setup.exe from installation media.`nNo restart required." -Color Cyan \ No newline at end of file