@echo off
setlocal EnableExtensions EnableDelayedExpansion
title Desinstalacion automatica KB5121003

set "KB=KB5121003"
set "LOG=%SystemRoot%\Temp\Desinstalar_%KB%.log"

echo ============================================================
echo      DESINSTALACION AUTOMATICA DE %KB%
echo ============================================================
echo.

:: Verificar administrador
net session >nul 2>&1
if not "%errorlevel%"=="0" (
    echo [ERROR] Ejecuta este BAT como Administrador.
    echo.
    pause
    exit /b 1
)

:: ------------------------------------------------------------
:: Detectar Build y UBR correctamente
:: ------------------------------------------------------------
for /f "tokens=3" %%A in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentBuildNumber 2^>nul ^| findstr /i "CurrentBuildNumber"') do set "BUILD=%%A"
for /f "tokens=3" %%A in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v UBR 2^>nul ^| findstr /i "UBR"') do set "UBRHEX=%%A"

if not defined BUILD (
    echo [ERROR] No se pudo detectar la compilacion.
    pause
    exit /b 2
)

if not defined UBRHEX set "UBRHEX=0x0"
set /a UBR=UBRHEX >nul 2>&1

echo [1/6] Version detectada:
echo       Windows Build: %BUILD%.%UBR%
echo.

:: ------------------------------------------------------------
:: Confirmar que KB5121003 esta instalada
:: ------------------------------------------------------------
echo [2/6] Verificando %KB%...
powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "if (Get-HotFix -Id '%KB%' -ErrorAction SilentlyContinue) { exit 0 } else { exit 1 }"
set "KBRC=%errorlevel%"

if not "%KBRC%"=="0" (
    echo [AVISO] %KB% no aparece instalada.
    echo.
    echo RESULTADO FINAL: NO INSTALADA / NO DETECTADA
    echo Equipo=%COMPUTERNAME% Build=%BUILD%.%UBR% Resultado=NO_DETECTADA Fecha=%DATE% %TIME%>>"%LOG%"
    pause
    exit /b 0
)

echo [OK] %KB% esta instalada.
echo.

:: ------------------------------------------------------------
:: Buscar el RollupFix por la revision UBR.
::
:: Importante:
:: En Windows 11 25H2 (26200.x), el Package Identity del LCU
:: puede conservar la rama 26100.x. Por eso NO buscamos
:: "26200.9168" dentro del PackageName.
:: ------------------------------------------------------------
echo [3/6] Buscando paquete interno de la actualizacion...
echo       Revision buscada: %UBR%
echo.

set "PKG="
set "PSFILE=%TEMP%\buscar_%KB%_%RANDOM%.ps1"

> "%PSFILE%" echo $ubr = %UBR%
>>"%PSFILE%" echo $pkgs = Get-WindowsPackage -Online ^| Where-Object { $_.PackageName -like '*Package_for_RollupFix*' -and $_.PackageState -eq 'Installed' }
>>"%PSFILE%" echo $match = $pkgs ^| Where-Object { $_.PackageName -match "\.$ubr\." } ^| Sort-Object PackageName -Descending ^| Select-Object -First 1
>>"%PSFILE%" echo if ($match) { $match.PackageName }

for /f "usebackq delims=" %%A in (`powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%PSFILE%" 2^>nul`) do (
    if not defined PKG set "PKG=%%A"
)

del "%PSFILE%" >nul 2>&1

if not defined PKG (
    echo [ERROR] No se encontro un Package_for_RollupFix instalado
    echo         con revision %UBR%.
    echo.
    echo Paquetes RollupFix encontrados:
    powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-WindowsPackage -Online ^| Where-Object {$_.PackageName -like '*Package_for_RollupFix*' -and $_.PackageState -eq 'Installed'} ^| Select-Object -ExpandProperty PackageName"
    echo.
    echo RESULTADO FINAL: PAQUETE_NO_IDENTIFICADO
    echo Equipo=%COMPUTERNAME% Build=%BUILD%.%UBR% Resultado=PAQUETE_NO_IDENTIFICADO Fecha=%DATE% %TIME%>>"%LOG%"
    pause
    exit /b 3
)

echo [OK] Paquete encontrado:
echo      %PKG%
echo.

:: ------------------------------------------------------------
:: Desinstalacion
:: ------------------------------------------------------------
echo [4/6] DESINSTALANDO %KB%...
echo ------------------------------------------------------------
DISM /Online /Remove-Package /PackageName:%PKG% /NoRestart
set "RC=%errorlevel%"
echo ------------------------------------------------------------
echo.

if "%RC%"=="0" goto VERIFY
if "%RC%"=="3010" goto VERIFY_RESTART

echo [ERROR] DISM devolvio el codigo: %RC%
echo.
echo RESULTADO FINAL: ERROR_%RC%
echo Equipo=%COMPUTERNAME% Build=%BUILD%.%UBR% Paquete=%PKG% Resultado=ERROR_%RC% Fecha=%DATE% %TIME%>>"%LOG%"
goto END

:VERIFY
echo [5/6] Verificando la desinstalacion...
powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "if (Get-HotFix -Id '%KB%' -ErrorAction SilentlyContinue) { exit 1 } else { exit 0 }"
set "VERIFYRC=%errorlevel%"

if "%VERIFYRC%"=="0" (
    echo [OK] %KB% ya no aparece instalada.
    echo.
    echo [6/6] RESULTADO FINAL: EXITO
    echo Equipo=%COMPUTERNAME% Build=%BUILD%.%UBR% Paquete=%PKG% Resultado=EXITO Fecha=%DATE% %TIME%>>"%LOG%"
) else (
    echo [AVISO] DISM finalizo, pero %KB% aun aparece instalada.
    echo [AVISO] Es posible que requiera reinicio.
    echo.
    echo [6/6] RESULTADO FINAL: REINICIO_REQUERIDO
    echo Equipo=%COMPUTERNAME% Build=%BUILD%.%UBR% Paquete=%PKG% Resultado=REINICIO_REQUERIDO Fecha=%DATE% %TIME%>>"%LOG%"
)
goto END

:VERIFY_RESTART
echo [OK] La desinstalacion fue aceptada por DISM.
echo [AVISO] Windows requiere reinicio para completar el proceso.
echo.
echo [6/6] RESULTADO FINAL: EXITO - REINICIO_REQUERIDO
echo Equipo=%COMPUTERNAME% Build=%BUILD%.%UBR% Paquete=%PKG% Resultado=REINICIO_REQUERIDO Fecha=%DATE% %TIME%>>"%LOG%"

:END
echo.
echo ============================================================
echo Log: %LOG%
echo ============================================================
echo.
echo El equipo NO se reiniciara automaticamente.
echo.
pause
exit /b %RC%
