Desinstalar cualquier característica de Windows, aplicable a componentes. Incluye automatización centralizada mediante política de grupo GPO de Active Directory AD DS.
- Identificación del componente a desinstalar.
- Desinstalación de características/componentes de Windows.
- Desinstalar características de Windows en dominio con GPO.
Identificación del componente a desinstalar
Tenemos varias opciones para obtener los componentes instalados en el sistema, para saber el nombre exacto del componente (que necesitaremos para su desinstalación).
- Nota importante 1: algunos comandos puede que no estén disponibles en algunos sistemas operativos, dependerá de la versión de Windows, de la versión de PoweShell y del tipo de sistema operativo (Windows 10/11 o Windows Server).
- Nota importante 2: muchos de los comandos que indicaremos necesitarán elevación de privilegios, teniendo que ejecutar la ventana de PowerShell como administradores. De no hacerlo, recibiremos errores como este:
|
1 2 3 4 5 6 |
Get-WindowsOptionalFeature : La operación solicitada requiere elevación. En línea: 1 Carácter: 1 + Get-WindowsOptionalFeature -Online | Where-Object { + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Get-WindowsOptionalFeature], COMException + FullyQualifiedErrorId : Microsoft.Dism.Commands.GetWindowsOptionalFeatureCommand |
PowerShell para listar todas las características
Listar las características disponibles en el equipo:
|
1 |
Get-WindowsFeature | Where-Object InstallState -eq "Installed" |

Listar las aplicaciones modernas disponibles en el equipo:
|
1 |
Get-AppxPackage | Select-Object Name, PackageFullName |

Listar los programas instalados tradicionales en el equipo:
|
1 |
Get-WmiObject -Class Win32_Product | Select-Object Name, Version |

Listar las características opcionales en el equipo:
|
1 |
Get-WindowsOptionalFeature -Online | Where-Object State -eq "Enabled" |

Podemos filtrar por nombre de aplicación/característica, usando comodines. Por ejemplo, para mostrar todas las características instaladas que contengan «Media»:
|
1 |
Get-AppxPackage -AllUsers | Where-Object {$_.Name -like "*Media*"} | Select-Object Name, PackageFullName |

O también con:
|
1 |
Get-WmiObject -Class Win32_Product | Where-Object {$_.Name -like "*Media*"} | Select-Object Name, Version |
Línea de comandos cmd para listar componentes y características
Listar características disponibles en el equipo (tanto habilitadas como deshabilitadas) con DISM:
|
1 |
dism /online /Get-Features |

Listar paquetes Appx con DISM:
|
1 |
dism /online /Get-ProvisionedAppxPackages |

Desinstalación de características/componentes de Windows
Método1: PowerShell (para cualquier componente)
A continuación, mostramos un ejemplo en PowerShell para desinstalar cualquier característica de Windows. En este método, se usan algunas funciones PowerShell que puede que no estén disponibles para todos las versiones de Windows.
En este caso, el siguiente script funciona en equipos con Windows Server 2016, 2019, 2022 y 2025:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
param( [string]$ComponentName, [switch]$WhatIf = $false ) function Remove-WindowsComponent { param($Name, $WhatIf) Write-Host "Buscando componente: $Name" -ForegroundColor Yellow # 1. Buscar en Windows Features $Feature = Get-WindowsFeature | Where-Object {$_.Name -like "*$Name*" -or $_.DisplayName -like "*$Name*"} if ($Feature -and $Feature.InstallState -eq "Installed") { Write-Host "Encontrado en Windows Features: $($Feature.DisplayName)" -ForegroundColor Cyan if (-not $WhatIf) { Remove-WindowsFeature -Name $Feature.Name -Confirm:$false Write-Host "Característica desinstalada: $($Feature.DisplayName)" -ForegroundColor Green } } # 2. Buscar en Appx Packages (Modern Apps) $AppxPackages = Get-AppxPackage -AllUsers | Where-Object {$_.Name -like "*$Name*" -or $_.PackageFullName -like "*$Name*"} foreach ($Appx in $AppxPackages) { Write-Host "Encontrado Appx Package: $($Appx.Name)" -ForegroundColor Cyan if (-not $WhatIf) { Remove-AppxPackage -Package $Appx.PackageFullName -AllUsers Write-Host "Appx desinstalado: $($Appx.Name)" -ForegroundColor Green } } # 3. Buscar en Provisioned Appx $Provisioned = Get-AppxProvisionedPackage -Online | Where-Object {$_.PackageName -like "*$Name*"} foreach ($Prov in $Provisioned) { Write-Host "Encontrado Appx Provisioned: $($Prov.PackageName)" -ForegroundColor Cyan if (-not $WhatIf) { Remove-AppxProvisionedPackage -Online -PackageName $Prov.PackageName Write-Host "Provisioning eliminado: $($Prov.PackageName)" -ForegroundColor Green } } # 4. Buscar en Optional Features $Optional = Get-WindowsOptionalFeature -Online | Where-Object {$_.FeatureName -like "*$Name*" -and $_.State -eq "Enabled"} foreach ($Opt in $Optional) { Write-Host "Encontrado Optional Feature: $($Opt.FeatureName)" -ForegroundColor Cyan if (-not $WhatIf) { Disable-WindowsOptionalFeature -Online -FeatureName $Opt.FeatureName -Remove -NoRestart Write-Host "Optional Feature deshabilitado: $($Opt.FeatureName)" -ForegroundColor Green } } } # Ejecutar la función Remove-WindowsComponent -Name $ComponentName -WhatIf:$WhatIf |
Guardaremos el código anterior en un fichero con extensión ps1, por ejemplo: desinstalar_caracteristica.ps1. Para ejecutarlo, en modo «simulación» (no desinstalará la característica indicada), desde la línea de comandos PowerShell (ejecutando como administrador), en la carpeta donde hayamos colocado el script, introduciremos el siguiente comando para que nos muestre todas las características/componentes que lleven la palabra XPS en su nombre, al añadir el parámetro -WhatIf, ejecutaremos en modo simulación (no eliminará nada, solo mostrará los componentes con ese nombre):
|
1 |
.desinstalar_caracteristica.ps1 -ComponentName "*XPS*" -WhatIf |

Si lo ejecutamos en modo real (quitando el parámetro WhatIf, desinstalará todas las características que cumplan con el filtro indicado:
|
1 |
.desinstalar_caracteristica.ps1 -ComponentName "*XPS*" |

En este ejemplo, ha desinstalado/deshabilitado:
- XPS Viewer: característica desinstalada.
- Printing-XPSServices-Features: característica opcional deshabilitada.
Para equipos con Windows 10, Windows 11, podemos usar este otro script PowerShell:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
param( [string]$ComponentName, [switch]$WhatIf = $false ) function Remove-WindowsComponent { param($Name, $WhatIf) Write-Host "Buscando componente: $Name" -ForegroundColor Yellow $Results = @() # 1. Buscar y desinstalar Appx Packages (Modern Apps) Write-Host "`n[1/4] Buscando aplicaciones Appx..." -ForegroundColor Cyan $AppxPackages = Get-AppxPackage -AllUsers | Where-Object { $_.Name -like "*$Name*" -or $_.PackageFullName -like "*$Name*" } foreach ($Appx in $AppxPackages) { Write-Host " Encontrado: $($Appx.Name) v$($Appx.Version)" -ForegroundColor Gray if (-not $WhatIf) { try { Remove-AppxPackage -Package $Appx.PackageFullName -AllUsers -ErrorAction Stop Write-Host " ✓ Appx desinstalado: $($Appx.Name)" -ForegroundColor Green $Results += "Appx: $($Appx.Name)" } catch { Write-Host " ✗ Error desinstalando Appx: $($Appx.Name)" -ForegroundColor Red } } } # 2. Buscar y desinstalar Provisioned Appx (para nuevos usuarios) Write-Host "`n[2/4] Buscando provisionamiento Appx..." -ForegroundColor Cyan $Provisioned = Get-AppxProvisionedPackage -Online | Where-Object { $_.PackageName -like "*$Name*" -or $_.DisplayName -like "*$Name*" } foreach ($Prov in $Provisioned) { Write-Host " Encontrado: $($Prov.DisplayName)" -ForegroundColor Gray if (-not $WhatIf) { try { Remove-AppxProvisionedPackage -Online -PackageName $Prov.PackageName -ErrorAction Stop Write-Host " ✓ Provisioning eliminado: $($Prov.DisplayName)" -ForegroundColor Green $Results += "Provisioned: $($Prov.DisplayName)" } catch { Write-Host " ✗ Error eliminando provisioning: $($Prov.DisplayName)" -ForegroundColor Red } } } # 3. Buscar y desinstalar Windows Optional Features Write-Host "`n[3/4] Buscando características opcionales..." -ForegroundColor Cyan $OptionalFeatures = Get-WindowsOptionalFeature -Online | Where-Object { ($_.FeatureName -like "*$Name*" -or $_.DisplayName -like "*$Name*") -and $_.State -eq "Enabled" } foreach ($Feature in $OptionalFeatures) { Write-Host " Encontrado: $($Feature.FeatureName)" -ForegroundColor Gray if (-not $WhatIf) { try { $Result = Disable-WindowsOptionalFeature -Online -FeatureName $Feature.FeatureName -Remove -NoRestart -ErrorAction Stop if ($Result.RestartNeeded) { Write-Host " ✓ Característica deshabilitada: $($Feature.FeatureName) (Reinicio requerido)" -ForegroundColor Green } else { Write-Host " ✓ Característica deshabilitada: $($Feature.FeatureName)" -ForegroundColor Green } $Results += "OptionalFeature: $($Feature.FeatureName)" } catch { Write-Host " ✗ Error deshabilitando característica: $($Feature.FeatureName)" -ForegroundColor Red } } } # 4. Buscar y desinstalar Windows Capabilities (Windows 10/11) Write-Host "`n[4/4] Buscando capacidades de Windows..." -ForegroundColor Cyan if (Get-Command Get-WindowsCapability -ErrorAction SilentlyContinue) { $Capabilities = Get-WindowsCapability -Online | Where-Object { $_.Name -like "*$Name*" -and $_.State -eq "Installed" } foreach ($Capability in $Capabilities) { Write-Host " Encontrado: $($Capability.Name)" -ForegroundColor Gray if (-not $WhatIf) { try { $Result = Remove-WindowsCapability -Online -Name $Capability.Name -ErrorAction Stop Write-Host " ✓ Capacidad eliminada: $($Capability.Name)" -ForegroundColor Green $Results += "Capability: $($Capability.Name)" } catch { Write-Host " ✗ Error eliminando capacidad: $($Capability.Name)" -ForegroundColor Red } } } } else { Write-Host " ℹ Cmdlet Get-WindowsCapability no disponible en este sistema" -ForegroundColor Yellow } # Resumen final Write-Host "`n" + "="*50 -ForegroundColor Cyan Write-Host "RESUMEN DE LA EJECUCIÓN" -ForegroundColor Cyan Write-Host "="*50 -ForegroundColor Cyan if ($WhatIf) { Write-Host "MODO SIMULACIÓN - No se realizaron cambios" -ForegroundColor Yellow } if ($Results.Count -gt 0) { Write-Host "`nComponentes procesados ($($Results.Count)):" -ForegroundColor Green $Results | ForEach-Object { Write-Host " ✓ $_" -ForegroundColor Green } } else { Write-Host "`nNo se encontraron componentes que coincidan con: $Name" -ForegroundColor Yellow } # Sugerencias para búsquedas if ($Results.Count -eq 0 -and -not $WhatIf) { Write-Host "`nSugerencias:" -ForegroundColor Gray Write-Host " - Verifica el nombre del componente" -ForegroundColor Gray Write-Host " - Usa partes del nombre para búsquedas parciales" -ForegroundColor Gray Write-Host " - Ejecuta con -WhatIf primero para ver qué se eliminaría" -ForegroundColor Gray } } # Ejecutar el script if (-not $ComponentName) { Write-Host "ERROR: Debes especificar un nombre de componente" -ForegroundColor Red Write-Host "`nUSO: .$($MyInvocation.MyCommand.Name) -ComponentName 'NombreComponente' [-WhatIf]" -ForegroundColor Yellow Write-Host "`nEJEMPLOS:" -ForegroundColor Gray Write-Host " .$($MyInvocation.MyCommand.Name) -ComponentName 'OneDrive'" -ForegroundColor Gray Write-Host " .$($MyInvocation.MyCommand.Name) -ComponentName 'Xbox' -WhatIf" -ForegroundColor Gray Write-Host " .$($MyInvocation.MyCommand.Name) -ComponentName 'MediaPlayer'" -ForegroundColor Gray exit 1 } # Verificar que se ejecuta como administrador $currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) if (-not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { Write-Host "ERROR: Este script requiere permisos de administrador" -ForegroundColor Red Write-Host "Ejecuta PowerShell como administrador y vuelve a intentarlo" -ForegroundColor Yellow exit 1 } Remove-WindowsComponent -Name $ComponentName -WhatIf:$WhatIf |
Guardaremos el script PowerShell anterior en un fichero con la extensión .ps1. Para ejecutarlo en modo simulación y simular lo que se eliminaría si lanzáramos el comando, en este ejemplo, todas las características que lleven el nombre Xbox:
|
1 |
.desinstalar_componente_w11_2.ps1 "Xbox" -WhatIf |

Modo eliminación/deshabilitación real:
|
1 |
.desinstalar_componente_w11_2.ps1 "Xbox" |

Nota: puede que la desinstalación de algunas características/componentes dé error, normalmente porque son características que no pueden ser eliminadas/desinstaladas.
Método 2: DISM – Deployment Image Servicing and Management
A continuación, mostramos un script cmd (batch) para desinstalar una característica/componente mediante DISM:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
@echo off setlocal enabledelayedexpansion set COMPONENT_NAME=%~1 if "%COMPONENT_NAME%"=="" ( echo Error: no se ha indicado un nombre de componente echo USO: %~nx0 "NombreCaracteristica" echo Ejemplo: echo %~nx0 TFTP exit /b 1 ) echo DESINSTALADOR DE CARACTERISTICAS DISM echo Componente: %COMPONENT_NAME% set /a SUCCESS_COUNT=0 set /a ERROR_COUNT=0 REM procesar cada línea que coincida con el componente for /f "tokens=*" %%L in ('dism /online /Get-Features ^| findstr /i "%COMPONENT_NAME%"') do ( REM Filtrar solo líneas que contengan "Nombre de característica" echo %%L | findstr /c:"Nombre de característica" >nul if !errorlevel! equ 0 ( REM Extraer el nombre de la característica (todo después de ":") for /f "tokens=1,* delims=:" %%A in ("%%L") do ( set "FEATURE_NAME=%%B" REM Limpiar espacios en blanco al inicio for /f "tokens=*" %%F in ("!FEATURE_NAME!") do set "FEATURE_NAME=%%F" if not "!FEATURE_NAME!"=="" ( echo Encontrada: !FEATURE_NAME! echo Ejecutando: dism /online /Disable-Feature /FeatureName:"!FEATURE_NAME!" /Remove /NoRestart dism /online /Disable-Feature /FeatureName:"!FEATURE_NAME!" /Remove /NoRestart if !errorlevel! equ 0 ( echo ✓ Característica deshabilitada: !FEATURE_NAME! set /a SUCCESS_COUNT+=1 ) else ( echo ✗ Error deshabilitando: !FEATURE_NAME! set /a ERROR_COUNT+=1 ) ) ) ) ) echo Características deshabilitadas: !SUCCESS_COUNT! echo Errores: !ERROR_COUNT! if !SUCCESS_COUNT! equ 0 if !ERROR_COUNT! equ 0 ( echo No se encontraron características que coincidan con: "%COMPONENT_NAME%" echo Para ver todas las características disponibles: echo dism /online /Get-Features ^| findstr /c:"Nombre de característica" ) |
Guardaremos el script anterior en un fichero con extensión cmd, por ejemplo: desinstalar_caracteristica_dism.cmd y, desde la línea de comandos (abriendo cmd o Símbolo de sistema como administrador), ejecutaremos, para desinstalar Microsoft YourPhone:
|
1 |
desinstalar_caracteristica_dism.cmd Microsoft.YourPhone |
Desinstalar características de Windows en dominio con GPO
Una vez que hayamos elegido y probado alguno de los métodos anteriores, crearemos una directiva GPO en el dominio para que ejecute el script PowerShell cada cierto tiempo o en el arranque del equipo o incluso en el inicio de sesión del usuario.
Para ello…