@echo off
REM change wording if needed..
TITLE FiX 20H2 to 20H2 InPlace/Repair Upgrade
echo Bitte schließe alle Dokument und Programme und drücke danach eine beliebige Taste.
pause
echo Checking Version 20H2 registry key . . .
set KEY="HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\EditionVersion"
reg query %KEY% >nul 2>nul || (color fc & echo KEY NOT PRESENT! ARE YOU ON 20H2? &pause &exit/b)
echo Checking admin rights . . .
set 0="%~f0" %*® query HKU\S-1-5-19>nul 2>nul||(powershell -nop -c "start -verb RunAs cmd -args '/d/rcall',$env:0" &exit)
echo Owning registry key . . .
set VO=1&call :reg_own %KEY% preserve S-1-1-0
reg add %KEY% /f /v EditionBuildNumber /d 19041 /t reg_dword
reg add %KEY% /f /v EditionBuildQfe /d 508 /t reg_dword
echo Restoring ownership . . .
set VO=&call :reg_own %KEY% none S-1-1-0
echo.
Echo Nach dem Neustart wird das Inplace Upgrade funktionieren.
echo.
pause
shutdown /r /t 00
exit/b
:reg_own #key [optional] all user owner access permission : call :reg_own "HKCU\My" "" S-1-5-32-545 "" Allow FullControl
powershell -nop -c $A='%~1','%~2','%~3','%~4','%~5','%~6';iex(([io.file]::ReadAllText('%~f0')-split':Own1\:.*')[1])&exit/b:Own1:
$D1=[uri]."M`odule"."G`etType"('System.Diagnostics.Process')."G`etMethods"(42) |where {$_.Name -eq 'SetPrivilege'} #`:no-ev-warn
'SeSecurityPrivilege','SeTakeOwnershipPrivilege','SeBackupPrivilege','SeRestorePrivilege'|foreach {$D1.Invoke($null, @("$_",2))}
$path=$A[0]; $rk=$path-split'\\',2; $HK=gi -lit Registry::$($rk[0]) -fo; $s=$A[1]; $sps=[Security.Principal.SecurityIdentifier]
$u=($A[2],'S-1-5-32-544')[!$A[2]];$o=($A[3],$u)[!$A[3]];$w=$u,$o |% {new-object $sps($_)}; $old=!$A[3];$own=!$old; $y=$s-eq'all'
$rar=new-object Security.AccessControl.RegistryAccessRule( $w[0], ($A[5],'FullControl')[!$A[5]], 1, 0, ($A[4],'Allow')[!$A[4]] )
$x=$s-eq'none'; function Own1($k){$t=$HK.OpenSubKey($k,2,'TakeOwnership'); 0,4 |% {try{$o=$t.GetAccessControl($_)}catch{$old=0}}
if($old){$own=1;$w[1]=$o.GetOwner($sps)};$o.SetOwner($w[0]);$t.SetAccessControl($o); $c=$HK.OpenSubKey($k,2,'ChangePermissions')
$p=$c.GetAccessControl(2);if($y){$p.SetAccessRuleProtection(1,1)};$p.ResetAccessRule($rar);if($x){$p.RemoveAccessRuleAll($rar)}
$c.SetAccessControl($p);if($own){$o.SetOwner($w[1]);$t.SetAccessControl($o)};if($s){$subkeys=$HK.OpenSubKey($k).GetSubKeyNames()
foreach($n in $subkeys){Own1 "$k\$n"}}};Own1 $rk[1];if($env:VO){get-acl Registry::$path|fl} #:Own1: lean & mean snippet by AveYo
::-_-::