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.