|
<# |
|
.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 |
Just a tip, In the end I got it going, now I've done it so many time's it just works, download the 11 ISO and burn it to USB using Rufus depending on your Windows 10 version, been UK, US or English International ISO, then the upgrade will allow you to keep all your files and apps, just have to know what version of Windows 10 your using. open the win 11 USB you created run the win 11 exe file from the USB using Windows explorer and upgrade that way.