Icono del sitio Binario 0

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

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:

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:

Consideraciones Finales

Recomendaciones para automatización

Salir de la versión móvil