En entornos corporativos o automatizados, es habitual necesitar la desinstalación silenciosa (o "desatendida") de aplicaciones instaladas mediante archivos .msi
. Este procedimiento es común en despliegues masivos, scripts de mantenimiento, o tareas de remediación vía RMM o sistemas de gestión remota.
A continuación, te explicamos cómo hacerlo de forma genérica usando PowerShell o la línea de comandos de Windows.
Desinstalación silenciosa con msiexec
El comando base para desinstalar una aplicación .msi
es:
msiexec /x {PRODUCT-CODE} /qn
/x
: indica que se desea desinstalar.{PRODUCT-CODE}
: es el GUID (IdentifyingNumber) único de esa instalación./qn
: modo silencioso sin interacción del usuario ("quiet no UI").
¿Cómo obtener el ProductCode de una aplicación?
El ProductCode
o GUID puede encontrarse con PowerShell utilizando la clase Win32_Product
:
Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -like "*NombreApp*" } | Select-Object Name, IdentifyingNumber
Este comando busca aplicaciones instaladas cuyo nombre contenga la cadena "NombreApp"
y devuelve el nombre y su GUID asociado.
Por ejemplo:
Name IdentifyingNumber
---- -----------------
MiAplicacionEjemplo {12345678-ABCD-1234-ABCD-1234567890AB}
¿Es siempre igual el GUID del producto?
No necesariamente. Aunque a veces el ProductCode
se mantiene constante en todas las instalaciones si se usa exactamente el mismo .msi
, hay varios factores que pueden hacer que este código varíe:
- Cambios de versión del software.
- Personalizaciones durante la creación del instalador.
- Diferentes instaladores generados desde consolas de administración o herramientas RMM.
Por lo tanto, lo más recomendable es detectarlo dinámicamente en cada máquina.
Script genérico en PowerShell para desinstalar de forma segura
A continuación, un ejemplo de script en PowerShell que detecta el producto por nombre y lo desinstala silenciosamente:
$nombreApp = "NombreApp"
$producto = Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -like "*$nombreApp*" }
if ($producto) {
Write-Host "Desinstalando $($producto.Name)..."
Start-Process "msiexec.exe" -ArgumentList "/x $($producto.IdentifyingNumber) /qn" -Wait
Write-Host "Desinstalación completada."
} else {
Write-Host "No se encontró ninguna aplicación que coincida con: $nombreApp"
}
Este script:
- Busca la aplicación cuyo nombre contenga una cadena específica.
- Extrae el
ProductCode
. - Lanza
msiexec
en modo silencioso. - Informa del resultado.
Consideraciones adicionales
- Si la aplicación tiene protección contra desinstalación (como contraseñas o tokens), es posible que necesites usar su propio desinstalador o herramienta oficial.
- En entornos empresariales, algunas aplicaciones registran un desinstalador alternativo, por ejemplo:
& "C:\Archivos de programa\MiApp\uninstall.exe" /S
donde/S
o/silent
suelen ser los modificadores silenciosos más comunes (según el framework del instalador: NSIS, Inno Setup, InstallShield, etc.).
Conclusión
La desinstalación desatendida de paquetes MSI es un proceso eficaz y sencillo siempre que se disponga del ProductCode
correcto. Usar scripts dinámicos que busquen por nombre es la mejor práctica para entornos donde los GUID pueden variar.