Skip to content

Instantly share code, notes, and snippets.

@asheroto
Last active July 21, 2025 01:54
Show Gist options
  • Save asheroto/5087d2a38b311b0c92be2a4f23f92d3e to your computer and use it in GitHub Desktop.
Save asheroto/5087d2a38b311b0c92be2a4f23f92d3e to your computer and use it in GitHub Desktop.
Bypass Windows 11 Upgrade Assistant / PC Health Check / TPM and CPU Settings. Ignore PC Health Check results.

Bypass Windows 11 Upgrade Assistant / Setup Hardware Checks (TPM, CPU, RAM)

This PowerShell script allows you to bypass TPM 2.0, unsupported CPU, and memory checks enforced by the Windows 11 Upgrade Assistant and setup.exe from Windows installation media. It eliminates common upgrade blocks such as:

  • This PC doesn't currently meet Windows 11 system requirements.
  • TPM 2.0 must be supported and enabled on this PC.
  • The processor isn't currently supported for Windows 11.

What It Does

This script:

  • Deletes legacy upgrade failure registry keys that may block future attempts.
  • Simulates hardware compatibility by setting known override values (e.g., TPM, RAM, Secure Boot).
  • Enables Microsoft's official upgrade bypass by setting AllowUpgradesWithUnsupportedTPMOrCPU to 1.
  • Enables Upgrade Assistant to proceed by setting UpgradeEligibility to 1 under the current user.

Registry Keys Modified or Removed

Purpose Registry Path Action / Value
Clear upgrade failure flags HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\CompatMarkers Deleted (if exists)
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Shared Deleted (if exists)
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TargetVersionUpgradeExperienceIndicators Deleted (if exists)
Simulate compatibility HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\HwReqChk HwReqChkVars = MultiString (TPM, RAM, etc.)
Bypass TPM/CPU check HKLM\SYSTEM\Setup\MoSetup AllowUpgradesWithUnsupportedTPMOrCPU = 1
Enable Upgrade Assistant flow HKCU\Software\Microsoft\PCHC UpgradeEligibility = 1

How to Use

Option 1: Save and Execute Locally

  1. Save the script as: Windows11-Enable-Upgrade.ps1

  2. Open PowerShell as Administrator.

  3. Run the script:

.\Windows11-Enable-Upgrade.ps1

Option 2: Run Directly from the Web

  1. Click the "Raw" button at the top right of the script to view it as plain text.

  2. Copy the full Raw URL from your browser’s address bar.

  3. In Administrator PowerShell, run:

irm "<paste raw url here>" | iex

✅ This lets you execute the script immediately without saving it to disk.


Disclaimer

This script is provided as-is with no warranties. Use only in test environments, labs, or situations where your device policy allows. Bypassing Windows hardware requirements may result in reduced support, compatibility issues, or failed future updates. Proceed at your own risk.

<#
.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
@JustSuperHuman
Copy link

🔥🔥🔥

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment