# Automatización de Desinstalación de Software en Windows con PowerShell

- Link: https://binariocero.com/windows/automatizacion-de-desinstalacion-de-software-en-windows-con-powershell
- Published: 2025-07-05T11:32:20+02:00
- Author: Juan José Fernández Durán

![Loading](https://binariocero.com/wp-content/plugins/page-views-count/ajax-loader-
2x.gif)

La gestión de software en sistemas Windows administrados centralmente requiere a
menudo la **desinstalación silenciosa y automatizada** de aplicaciones. En este 
artículo técnico se presentan **dos métodos de desinstalación mediante PowerShell**,
aprovechando la base de datos del registro de Windows para obtener los **Product
GUID** de las aplicaciones y lanzar su desinstalación con `msiexec`.

## Requisitos

 * PowerShell 5.1 o superior
 * Privilegios de administrador
 * Entornos compatibles: Windows 10/11, Windows Server 2016 en adelante

## Método 1: Script genérico para desinstalar cualquier aplicación MSI

Este script detecta cualquier software instalado cuyo nombre contenga una palabra
clave específica y lo desinstala silenciosamente usando su GUID.

### Código PowerShell:

    ```wp-block-preformatted
    # Ejecutar como Administradorfunction Test-IsElevated {    $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()    $p = New-Object System.Security.Principal.WindowsPrincipal($id)    return $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)}function Uninstall-ApplicationByName {    param (        [string]$AppName    )    $uninstallKeys = @(        "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall",        "HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"    )    foreach ($keyPath in $uninstallKeys) {        $items = Get-ChildItem -Path $keyPath -ErrorAction SilentlyContinue | Get-ItemProperty | Where-Object {            $_.DisplayName -like "*$AppName*"        }        foreach ($item in $items) {            Write-Host "Desinstalando: $($item.DisplayName)"            Start-Process -FilePath "msiexec.exe" -ArgumentList "/x $($item.PSChildName) /quiet /norestart" -Wait -NoNewWindow        }    }}# Validar permisosif (-not (Test-IsElevated)) {    Write-Error "Debes ejecutar este script como Administrador."    exit 1}# Reemplaza "NombreApp" por parte del nombre de la aplicaciónUninstall-ApplicationByName -AppName "NombreApp"
    ```

### Ventajas:

 * Flexible: se adapta a cualquier software MSI
 * Usa GUID real del producto para desinstalación precisa
 * Totalmente silencioso: no requiere intervención del usuario

## Método 2: Desinstalación múltiple de software específico

Este enfoque está diseñado para eliminar de forma automática varias aplicaciones
predefinidas. Es útil para scripts de limpieza o entornos gestionados (ej. entornos
corporativos).

### Código PowerShell:

    ```wp-block-preformatted
    function Test-IsElevated {    $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()    $p = New-Object System.Security.Principal.WindowsPrincipal($id)    return $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)}function Get-InstalledSoftware {    param (        [string]$softwareName    )    $registryPaths = @(        "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall",        "HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"    )    $results = @()    foreach ($path in $registryPaths) {        $results += Get-ChildItem -Path $path -ErrorAction SilentlyContinue |            Get-ItemProperty |            Where-Object { $_.DisplayName -like "*$softwareName*" }    }    return $results}function Uninstall-Software {    param (        [string]$softwareName    )    $installedApps = Get-InstalledSoftware -softwareName $softwareName    if ($installedApps.Count -eq 0) {        Write-Host "$softwareName no está instalado." -ForegroundColor Yellow        return    }    foreach ($app in $installedApps) {        Write-Host "Desinstalando: $($app.DisplayName)..." -ForegroundColor Cyan        Start-Process -FilePath "msiexec.exe" -ArgumentList "/x $($app.PSChildName) /quiet /norestart" -Wait -NoNewWindow        Write-Host "Completado: $($app.DisplayName)" -ForegroundColor Green    }}# Verifica si se ejecuta como administradorif (-not (Test-IsElevated)) {    Write-Error "Este script debe ejecutarse con privilegios de administrador."    exit 1}# Lista de aplicaciones genéricas a desinstalar (modifica los nombres)$softwareList = @(    "App1",    "App2",    "App3")foreach ($appName in $softwareList) {    Uninstall-Software -softwareName $appName}
    ```

### Aplicaciones:

 * Ideal para scripts de limpieza masiva
 * Fácil de integrar en tareas programadas, GPO o plataformas RMM

## Consideraciones Finales

 * Ambos scripts dependen del **Product GUID** registrado por el instalador MSI.
 * Algunos productos usan desinstaladores `.exe` externos (en ese caso habría que
   adaptar la lógica).
 * Se recomienda siempre probar estos scripts en entornos de laboratorio antes de
   aplicarlos en producción.

## Recomendaciones para automatización

 * **Plataformas RMM:** Ambos scripts pueden integrarse fácilmente en herramientas
   como Atera o Intune.
 * **Módulos personalizados:** Puedes construir un módulo PowerShell que encapsule
   esta lógica en funciones reutilizables.
