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
@WiredWonder
Copy link

Thank you for the simple no BS fix.

@cool-delete
Copy link

# ===================================================================================
# == Windows 11 24H2 就地升级绕过脚本 (PowerShell 最终修正版)
# == 使用 --% 操作符来确保 reg.exe 命令的参数被正确传递
# ===================================================================================

# -----------------------------------------------------------------------------------
# -- 步骤一:清理旧的失败记录 (Clear old failure records)
# -----------------------------------------------------------------------------------

Write-Host "步骤一:正在清理旧的升级失败记录..." -ForegroundColor Yellow
# 使用 --% 确保 PowerShell 不会错误解析参数
reg.exe --% delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\CompatMarkers" /f 2>$null
reg.exe --% delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Shared" /f 2>$null
reg.exe --% delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\TargetVersionUpgradeExperienceIndicators" /f 2>$null
Write-Host "清理完成。" -ForegroundColor Green


# -----------------------------------------------------------------------------------
# -- 步骤二:伪造一份完美的硬件报告 (Forge a perfect hardware report)
# -----------------------------------------------------------------------------------

Write-Host "步骤二:正在伪造硬件兼容性报告..." -ForegroundColor Yellow
# 使用 --% 解决逗号被 PowerShell 错误解析的问题
reg.exe --% add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\HwReqChk" /f /v HwReqChkVars /t REG_MULTI_SZ /s , /d "SQ_SecureBootCapable=TRUE,SQ_SecureBootEnabled=TRUE,SQ_TpmVersion=2,SQ_RamMB=8192,"
Write-Host "伪造报告已写入。" -ForegroundColor Green


# -----------------------------------------------------------------------------------
# -- 步骤三:使用官方后门强制放行 (Use the official backdoor to force it)
# -----------------------------------------------------------------------------------

Write-Host "步骤三:正在启用官方升级后门..." -ForegroundColor Yellow
# 移除了重复的 /f 参数,并使用 --% 确保健壮性
reg.exe --% add "HKLM\SYSTEM\Setup\MoSetup" /v AllowUpgradesWithUnsupportedTPMOrCPU /t REG_DWORD /d 1 /f
Write-Host "官方后门已启用。" -ForegroundColor Green

# -----------------------------------------------------------------------------------
# -- 完成
# -----------------------------------------------------------------------------------

Write-Host ""
Write-Host "==============================================================================" -ForegroundColor Cyan
Write-Host "== 所有操作已成功完成!                                                  ==" -ForegroundColor Cyan
Write-Host "== 您现在可以运行 Windows 11 24H2 的 setup.exe 进行就地升级。无需重启。 ==" -ForegroundColor Cyan
Write-Host "==============================================================================" -ForegroundColor Cyan

26100.4484 work!

@asheroto
Copy link
Author

Thanks @cool-delete. I've made some improvements on that script and switched from using a reg file to a PowerShell script.

Let me know what you all think of the changes. 😎

@JustSuperHuman
Copy link

🔥🔥🔥

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