Win10-Upgrade auf alten PCs
Auch wenn ein Upgrade mittels Rufus-USB-Stick wie vielerorts beschrieben hĂ€ngen geblieben ist, hat fĂŒr mich folgende Vorgangsweise immer funktioniert:
- Windows 10 frisch installieren
- Windows 11 ISO herunterladen und mounten
- die unten beschriebene Batch-Datei starten
- Upgrade von der gemounteten ISO-Datei ausfĂŒhren

Batch-Datei
Die Batch-Datei ist ein âSkip TPM Check on Dynamic Updateâ-Skript von AveYo, das Windowsâ11âUpgrades auf offiziell nicht unterstĂŒtzter Hardware ermöglicht, sowohl ĂŒber Windows Update als auch ĂŒber ein gemountetes ISO.
Grundidee und Einsatzzweck
- Umgehung der HardwareprĂŒfungen (v.âŻa. TPM/CPU) im Windowsâ11âSetup, ohne Systemdateien dauerhaft zu patchen.
- Funktioniert mit Windows Update (Ordner
$WINDOWS.~BT\Sources) und mit einem lokalen Installationsmedium (ISO). - Kann âinstalliertâ und wieder âentferntâ werden, sodass das Verhalten des Setups toggelbar ist.
Verhalten, wenn bereits installiert (get11.cmd)
Wenn die Datei schon nach %SystemDrive%\Scripts\get11.cmd kopiert wurde, lĂ€uft der âFiltermodusâ fĂŒr laufende Upgrades:
- Setzt Variablen:
CLI(Commandline des Setups),SOURCESauf%SystemDrive%\$WINDOWS.~BT\Sources,MEDIAusw., StandardVER=11. - PrĂŒft, ob
SetupHost.exeimSourcesâOrdner existiert; ansonsten beendet sich das Skript. - Erstellt nötigenfalls einen Hardlink
WindowsUpdateBox.exeâSetupHost.exe, damit der Upgrader unter einem alternativen Namen gestartet werden kann. - Schreibt zwei Registry-Werte:
DisableWUfBSafeguards=1unterHKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate(entfernt Update-Safeguards).AllowUpgradesWithUnsupportedTPMorCPU=1unterHKLM\SYSTEM\Setup\MoSetup(offizielle Microsoft-Policy zum Zulassen von Upgrades trotz nicht unterstĂŒtztem TPM/CPU).
Anpassung der Setup-Parameter und Versionserkennung
- Definiert Standard-Setup-Optionen:
/Compat IgnoreWarning /MigrateDrivers All /Telemetry Disable. - Manipuliert die ĂŒbergebenen Parameter (
CLI,SRV) so, dass Varianten wie/Product Clientbzw./Product Serverkorrekt gehandhabt werden. - Erkennt anhand von
appraiserres.dllund derProductVersionvonSetupHost.exe, ob es sich effektiv um ein Windowsâ11âSetup handelt oder das Verhalten wie bei Windows 10 fallen gelassen werden soll (VERwird ggf. auf 10 gesetzt).
Bypass des zweiten TPM-Checks (Canary / hwreqchk.dll)
Im Label :canary wird ein spezieller Bypass realisiert:
- Ziel:
hwreqchk.dllimSourcesâOrdner. - PowerShellâCode ĂŒbernimmt Besitz (
takeown), setzt Berechtigungen (icacls), entfernt Attribute und öffnet die Datei schreibend. - Der String
'SQ_TpmVersion GTE 1'wird in der BinĂ€rdatei gesucht und durch'SQ_TpmVersion GTE 0'ersetzt, sodass die Abfrage âTPM-Version â„ 1â logisch aufgeweicht wird. - Die modifizierte DLL wird zurĂŒckgeschrieben; damit wird ein zweiter TPMâCheck in bestimmten Canary/Insider ISOs ausgehebelt.
Start des eigentlichen Upgrades
- Je nach Kontext (Windows Update vs. ISO, mit/ohne
/PreDownload) baut das Skript die ArgumentlisteARGfĂŒrWindowsUpdateBox.exezusammen. - Startet
WindowsUpdateBox.exe %ARG%und prĂŒfterrorlevelauf einen speziellen Code (restart_application), um bei Bedarf den:canaryâPatch auszufĂŒhren und das Setup ein zweites Mal zu starten.
Installations-/Entfernungsmodus (Image File Execution Options)
Wenn die Batch-Datei nicht aus %SystemDrive%\Scripts\get11.cmd lÀuft, springt sie zu :setup und behandelt sich wie ein Installer/Uninstaller:
- Richtet einen UACâElevationsmechanismus ein, damit das Skript mit Adminrechten lĂ€uft.
- Definiert âColor-Macrosâ fĂŒr hĂŒbsche Farbausgabe im CMD-Fenster, ist aber nur kosmetisch.
- Setzt
IFEOauf den Registry-PfadHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options. - Löscht alte Varianten (EventFilter âSkip TPM Check on Dynamic Updateâ, IFEO-Eintrag fĂŒr
vdsldr.exe), um Konflikte mit frĂŒheren Versionen des Skripts zu vermeiden.
install-Zweig
- Kopiert sich selbst nach
%SystemDrive%\Scripts\get11.cmd. - Legt unter
IFEO\SetupHost.exefolgende Werte an:UseFilter=1(aktiviert das Filter-Feature).- Unter
IFEO\SetupHost.exe\0FilterFullPathâ%SystemDrive%\$WINDOWS.~BT\Sources\SetupHost.exeDebuggerâ%SystemDrive%\Scripts\get11.cmd(damit wird bei Start vonSetupHost.exestattdessen das Skript als âDebuggerâ aufgerufen).
- Gibt eine farbige Meldung aus âSkip TPM Check on Dynamic Update V13 INSTALLED â run again to removeâ.
remove-Zweig
- Löscht
get11.cmdaus%SystemDrive%\Scripts,%Public%,%ProgramData%. - Entfernt den kompletten
IFEO\SetupHost.exeâSchlĂŒssel. - Meldung: âSkip TPM Check on Dynamic Update V13 REMOVED â run again to installâ.
PowerShell-Wrapper am Ende
- Der Block am Ende (
'@); $0 = "$env:temp\Skip_TPM_Check_on_Dynamic_Update.cmd"; ...) schreibt den Batch-Inhalt als temporĂ€re CMD-DateiSkip_TPM_Check_on_Dynamic_Update.cmdins%TEMP%âVerzeichnis und fĂŒhrt ihn aus. - Damit ist die Datei ein hybrides CMD/PowerShellâSkript, das sowohl aus PowerShell als auch direkt aus CMD gestartet werden kann.
Kurzfassung fĂŒr den praktischen Einsatz
- Einmal ohne Parameter ausfĂŒhren â Skript installiert sich und hookt
SetupHost.exeĂŒber IFEO, sodass beim Start eines Windowsâ11âUpgrades die TPM/CPUâChecks weitgehend umgangen werden. - Erneut ohne Parameter ausfĂŒhren â entfernt diese Hooks wieder und stellt den Normalzustand her.
- WĂ€hrend eines Upgrades patcht es dynamisch bestimmte Dateien (
appraiserres.dll,hwreqchk.dll) und setzt Registry-Policies, damit Windows 11 auch auf nicht offiziell unterstĂŒtzten Systemen installiert werden kann.
Win11 Batch-Datei
Code kopieren und als win11.bat abspeichern und ausfĂŒhren
@(set '(=)||' <# lean and mean cmd / powershell hybrid #> @'
::# Get 11 on 'unsupported' PC via Windows Update or mounted ISO (no patching needed)
::# if WU is stuck use windows_update_refresh.bat; Beta/Dev/Canary needs OfflineInsiderEnroll
::# V13: skip 2nd tpm check on Canary iso; no Server label; future proofing; tested with 26010 iso, wu and wu repair version
@echo off & title get 11 on 'unsupported' PC || AveYo 2023.12.07
if /i "%~f0" neq "%SystemDrive%\Scripts\get11.cmd" goto setup
powershell -win 1 -nop -c ";"
set CLI=%*& set SOURCES=%SystemDrive%\$WINDOWS.~BT\Sources& set MEDIA=.& set MOD=CLI& set PRE=WUA& set /a VER=11
if not defined CLI (exit /b) else if not exist %SOURCES%\SetupHost.exe (exit /b)
if not exist %SOURCES%\WindowsUpdateBox.exe mklink /h %SOURCES%\WindowsUpdateBox.exe %SOURCES%\SetupHost.exe
reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate /f /v DisableWUfBSafeguards /d 1 /t reg_dword
reg add HKLM\SYSTEM\Setup\MoSetup /f /v AllowUpgradesWithUnsupportedTPMorCPU /d 1 /t reg_dword
set OPT=/Compat IgnoreWarning /MigrateDrivers All /Telemetry Disable
set /a restart_application=0x800705BB & (call set CLI=%%CLI:%1 =%%)
set /a incorrect_parameter=0x80070057 & (set SRV=%CLI:/Product Client =%)
set /a launch_option_error=0xc190010a & (set SRV=%SRV:/Product Server =%)
for %%W in (%CLI%) do if /i %%W == /PreDownload (set MOD=SRV)
for %%W in (%CLI%) do if /i %%W == /InstallFile (set PRE=ISO& set "MEDIA=") else if not defined MEDIA set "MEDIA=%%~dpW"
if %VER% == 11 for %%W in ("%MEDIA%appraiserres.dll") do if exist %%W if %%~zW == 0 set AlreadyPatched=1 & set /a VER=10
if %VER% == 11 findstr /r "P.r.o.d.u.c.t.V.e.r.s.i.o.n...0.\..\..[2-9]" %SOURCES%\SetupHost.exe >nul 2>nul || set /a VER=10
if %VER% == 11 if not exist "%MEDIA%EI.cfg" (echo;[Channel]>%SOURCES%\EI.cfg & echo;_Default>>%SOURCES%\EI.cfg)
if %VER%_%PRE% == 11_ISO (%SOURCES%\WindowsUpdateBox.exe /Product Server /PreDownload /Quiet %OPT%)
if %VER%_%PRE% == 11_ISO (del /f /q %SOURCES%\appraiserres.dll 2>nul & cd.>%SOURCES%\appraiserres.dll & call :canary)
if %VER%_%MOD% == 11_SRV (set ARG=%OPT% %SRV% /Product Server)
if %VER%_%MOD% == 11_CLI (set ARG=%OPT% %CLI%)
%SOURCES%\WindowsUpdateBox.exe %ARG%
if %errorlevel% == %restart_application% (call :canary & %SOURCES%\WindowsUpdateBox.exe %ARG%)
exit /b
:canary iso skip 2nd tpm check by AveYo
set C= $X='%SOURCES%\hwreqchk.dll'; $Y='SQ_TpmVersion GTE 1'; $Z='SQ_TpmVersion GTE 0'; if (test-path $X) {
set C=%C% try { takeown.exe /f $X /a; icacls.exe $X /grant *S-1-5-32-544:f; attrib -R -S $X; [io.file]::OpenWrite($X).close() }
set C=%C% catch { return }; $R=[Text.Encoding]::UTF8.GetBytes($Z); $l=$R.Length; $i=2; $w=!1;
set C=%C% $B=[io.file]::ReadAllBytes($X); $H=[BitConverter]::ToString($B) -replace '-';
set C=%C% $S=[BitConverter]::ToStringUTF8.GetBytes($Y) -replace '-';
set C=%C% do { $i=$H.IndexOf($S, $i + 2); if ($i -gt 0) { $w=!0; for ($k=0; $k -lt $l; $k++) { $B[$k + $i / 2]=$R[$k] } } }
set C=%C% until ($i -lt 1); if ($w) { [io.file]::WriteAllBytes($X, $B); [GC]::Collect() } }
if %VER%_%PRE% == 11_ISO powershell -nop -c iex($env:C) >nul 2>nul
exit /b
:setup
::# elevate with native shell by AveYo
>nul reg add hkcu\software\classes\.Admin\shell\runas\command /f /ve /d "cmd /x /d /r set \"f0=%%2\"& call \"%%2\" %%3"& set _= %*
>nul fltmc|| if "%f0%" neq "%~f0" (cd.>"%temp%\runas.Admin" & start "%~n0" /high "%temp%\runas.Admin" "%~f0" "%_:"=""%" & exit /b)
::# lean xp+ color macros by AveYo: %<%:af " hello "%>>% & %<%:cf " w\"or\"ld "%>% for single \ / " use .%|%\ .%|%/ \"%|%\"
for /f "delims=:" %%s in ('echo;prompt $h$s$h:^|cmd /d') do set "|=%%s"&set ">>=\..\c nul&set /p s=%%s%%s%%s%%s%%s%%s%%s<nul&popd"
set "<=pushd "%appdata%"&2>nul findstr /c:\ /a" &set ">=%>>%&echo;" &set "|=%|:~0,1%" &set /p s=\<nul>"%appdata%\c"
::# toggle when launched without arguments, else jump to arguments: "install" or "remove"
set CLI=%*& (set IFEO=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options)
wmic /namespace:"\\root\subscription" path __EventFilter where Name="Skip TPM Check on Dynamic Update" delete >nul 2>nul & rem v1
reg delete "%IFEO%\vdsldr.exe" /f 2>nul & rem v2 - v5
if /i "%CLI%"=="" reg query "%IFEO%\SetupHost.exe\0" /v Debugger >nul 2>nul && goto remove || goto install
if /i "%~1"=="install" (goto install) else if /i "%~1"=="remove" goto remove
:install
mkdir %SystemDrive%\Scripts >nul 2>nul & copy /y "%~f0" "%SystemDrive%\Scripts\get11.cmd" >nul 2>nul
reg add "%IFEO%\SetupHost.exe" /f /v UseFilter /d 1 /t reg_dword >nul
reg add "%IFEO%\SetupHost.exe\0" /f /v FilterFullPath /d "%SystemDrive%\$WINDOWS.~BT\Sources\SetupHost.exe" >nul
reg add "%IFEO%\SetupHost.exe\0" /f /v Debugger /d "%SystemDrive%\Scripts\get11.cmd" >nul
echo;
%<%:f0 " Skip TPM Check on Dynamic Update V13 "%>>% & %<%:2f " INSTALLED "%>>% & %<%:f0 " run again to remove "%>%
if /i "%CLI%"=="" timeout /t 7
exit /b
:remove
del /f /q "%SystemDrive%\Scripts\get11.cmd" "%Public%\get11.cmd" "%ProgramData%\get11.cmd" >nul 2>nul
reg delete "%IFEO%\SetupHost.exe" /f >nul 2>nul
echo;
%<%:f0 " Skip TPM Check on Dynamic Update V13 "%>>% & %<%:df " REMOVED "%>>% & %<%:f0 " run again to install "%>%
if /i "%CLI%"=="" timeout /t 7
exit /b
'@); $0 = "$env:temp\Skip_TPM_Check_on_Dynamic_Update.cmd"; ${(=)||} -split "\r?\n" | out-file $0 -encoding default -force; & $0
# press enter