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

Artículos Guías Manuales Sistemas Linux Windows Redes MySql Binario 0 Binario Cero Artículos Guías Manuales Sistemas Linux Windows Redes MySql Binario 0 Binario Cero

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:

# Ejecutar como Administrador

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 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 permisos
if (-not (Test-IsElevated)) {
Write-Error "Debes ejecutar este script como Administrador."
exit 1
}

# Reemplaza "NombreApp" por parte del nombre de la aplicación
Uninstall-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:

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 administrador
if (-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.
Binario 0
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.