En entornos de escritorio o servidores Windows, es común encontrar una misma aplicación instalada a través de distintos métodos: mediante un instalador .exe
o mediante un paquete .msi
. Esta duplicidad puede generar conflictos, redundancias o confusión a la hora de realizar mantenimientos, automatizaciones o desinstalaciones.
Este artículo técnico explica cómo identificar y gestionar correctamente estos casos, dejando solo la instalación deseada y eliminando la redundante.
Escenario típico
Supón que una aplicación como 7-Zip, VLC, Git o cualquier herramienta administrativa ha sido instalada:
- Manualmente por un usuario con un
.exe
- Y luego desplegada por IT mediante un
.msi
para control centralizado
Esto puede dar lugar a que el sistema tenga dos entradas en "Aplicaciones y características", o que haya conflictos de versiones.
Paso 1: Detectar las instalaciones presentes
1.1. Desde la GUI
Ve a:
Inicio → Configuración → Aplicaciones → Aplicaciones instaladas
Busca el nombre de la aplicación y revisa si aparece más de una entrada.
1.2. Desde PowerShell
Puedes listar las aplicaciones instaladas con:
Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -like "*NombreApp*" } | Select-Object Name, Version, IdentifyingNumber
O para buscar en el registro (más rápido y preciso, ideal para grandes entornos):
Get-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*" |
Where-Object { $_.DisplayName -like "*NombreApp*" } |
Select DisplayName, DisplayVersion, UninstallString
También consulta la rama de 32 bits si estás en un SO de 64 bits:
Get-ItemProperty "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*" |
Where-Object { $_.DisplayName -like "*NombreApp*" }
Paso 2: Identificar el tipo de instalador
Diferencias:
.exe
suele tener desinstaladores personalizados (por ejemplo:uninstall.exe
).msi
está registrado con un GUID (Product Code) y puede desinstalarse conmsiexec
Claves:
- Si ves una línea como
msiexec /x {GUID}
, es.msi
- Si ves una ruta tipo
C:\Program Files\...\uninstall.exe
, es.exe
Paso 3: Desinstalar el instalador no deseado
A. Desinstalación de .msi
:
Desde PowerShell o CMD (requiere GUID):
msiexec /x "{GUID_DEL_PRODUCTO}" /qn
Donde /qn
fuerza el modo silencioso (sin GUI).
B. Desinstalación de .exe
:
Ejecuta directamente el desinstalador (cuando disponible):
& "C:\Ruta\de\la\aplicacion\uninstall.exe" /S
Algunas aplicaciones también permiten parámetros como /quiet
o /norestart
.
Paso 4: Validar la instalación restante
- Verifica que la aplicación sigue operativa (interfaz gráfica o CLI).
- Ejecuta
NombreApp.exe --version
si lo permite, para confirmar que la versión activa es la esperada. - Asegúrate de que solo queda una entrada en "Aplicaciones instaladas".
Buenas prácticas
- Centraliza instalaciones con
.msi
siempre que sea posible (mejor integración con GPO, Intune, SCCM). - Usa
.exe
solo cuando el proveedor no proporcione.msi
o se requieran parámetros personalizados no soportados por MSI. - Documenta y automatiza los procesos de instalación/desinstalación.
- Si usas herramientas como Chocolatey, Winget o Scoop, prioriza su uso como método único para evitar duplicidad.
Ejemplo real: Desinstalar Git instalado con .exe
y dejar solo el .msi
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* |
Where-Object { $_.DisplayName -like "*Git*" }
# Si encuentras la ruta "unins000.exe":
& "C:\Program Files\Git\unins000.exe" /S
Herramientas útiles
Get-WmiObject
,Get-ItemProperty
: para auditarmsiexec
: para instalar/desinstalar.msi
uninstall.exe
,unins000.exe
: para.exe
- Winget: útil para instalaciones modernas controladas
- Chocolatey: control de versiones, scripts y automatización