Comprobación de salud de Active Directory: Scripting de PowerShell

Si se deja sin supervisión, los entornos de ejecución de Java pueden propagarse como un incendio en una empresa. Cuando ejecuté un informe para averiguar cómo estaba el panorama de Java en mi entorno, ¡encontré 62 versiones diferentes de Java! Es hora de recuperar el control y construir un script de PowerShell para eliminar las versiones antiguas de Java.

En este tutorial, aprenderás cómo crear una herramienta de eliminación de Java para quitar las versiones antiguas en PowerShell.

¡Empecemos!

Creación del Script

Primero, abre tu editor de código favorito, como Visual Studio Code, y guarda el archivo como Remove-Java.ps1. Este script de PowerShell contendrá todo lo necesario para limpiar las versiones anteriores de Java.

Define las Rutas del Registro

Dado que las instancias de Java pueden ocultarse en dos lugares en el registro, primero define cada una de las claves del registro principal. El fragmento de código siguiente proporciona tanto las rutas del registro de 32 como de 64 bits.

$RegUninstallPaths = @(
   'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall',
    'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall'
)

Define las Versiones a Conservar

Probablemente quieras conservar algunas versiones antiguas de Java, así que crea un array con cada una de las versiones que te gustaría conservar.

Puedes encontrar el texto exacto a utilizar mirando en Programas y Características en el Panel de Control.

$VersionsToKeep = @('Java 8 Update 261')

Encuentra y Detén todos los Procesos en Ejecución

A continuación, encuentra todos los procesos de Java en ejecución. El fragmento de código siguiente enumera todos los procesos en ejecución con WMI que se están ejecutando con un archivo en una ruta que coincide con “Program Files\Java“.

Dado que Java puede integrarse en Internet Explorer y no puede eliminarse, ve adelante y detén también todos los procesos de Internet Explorer.

Get-CimInstance -ClassName 'Win32_Process' | Where-Object {$_.ExecutablePath -like '*Program Files\Java*'} | 
    Select-Object @{n='Name';e={$_.Name.Split('.')[0]}} | Stop-Process -Force
 
Get-process -Name *iexplore* | Stop-Process -Force -ErrorAction SilentlyContinue

Buscar Java en el Registro y Forzar una Desinstalación

A continuación, construya un filtro que utilizará para enumerar todos los valores bajo las claves del registro definidas anteriormente. Este filtro encuentra todas las instancias de Java y excluye todas las versiones que le gustaría conservar.

$UninstallSearchFilter = {($_.GetValue('DisplayName') -like '*Java*') -and (($_.GetValue('Publisher') -eq 'Oracle Corporation')) -and ($VersionsToKeep -notcontains $_.GetValue('DisplayName'))}

Ahora busque a través del registro para encontrar todas las instancias de Java y, si se encuentran, ejecute msiexec.exe /X para eliminar cada instancia.

# Desinstale las versiones no deseadas de Java y limpie los archivos del programa

foreach ($Path in $RegUninstallPaths) {
    if (Test-Path $Path) {
        Get-ChildItem $Path | Where-Object $UninstallSearchFilter | 
       foreach { 
        Start-Process 'C:\Windows\System32\msiexec.exe' "/X$($_.PSChildName) /qn" -Wait
    
        }
    }
}

Eliminar cualquier Remanente Antiguo de Java

Limpiar cualquier resto que el desinstalador de Java no elimine por sí solo.

New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT | Out-Null
$ClassesRootPath = "HKCR:\Installer\Products"
Get-ChildItem $ClassesRootPath | 
    Where-Object { ($_.GetValue('ProductName') -like '*Java*')} | Foreach {
    Remove-Item $_.PsPath -Force -Recurse
}

$JavaSoftPath = 'HKLM:\SOFTWARE\JavaSoft'
if (Test-Path $JavaSoftPath) {
    Remove-Item $JavaSoftPath -Force -Recurse
}

Conclusión

¡Y eso es todo! Ejecute este script de PowerShell en cada computadora en la que desee limpiar Java para que este proceso sea lo más sencillo posible.

No dude en descargar el script completo de una vez a continuación.


$RegUninstallPaths = @(
HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall,
HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
)
$VersionsToKeep = @(Java 8 Update 261)
Get-CimInstance ClassName Win32_Process | Where-Object {$_.ExecutablePath -like *Program Files\Java*} |
Select-Object @{n=Name;e={$_.Name.Split(.)[0]}} | Stop-Process Force
Get-process Name *iexplore* | Stop-Process Force ErrorAction SilentlyContinue
$UninstallSearchFilter = {($_.GetValue(DisplayName) -like *Java*) -and (($_.GetValue(Publisher) -eq Oracle Corporation)) -and ($VersionsToKeep -notcontains $_.GetValue(DisplayName))}
# Uninstall unwanted Java versions and clean up program files
foreach ($Path in $RegUninstallPaths) {
if (Test-Path $Path) {
Get-ChildItem $Path | Where-Object $UninstallSearchFilter |
foreach {
Start-Process C:\Windows\System32\msiexec.exe /X$($_.PSChildName) /qn Wait
}
}
}
New-PSDrive Name HKCR PSProvider Registry Root HKEY_CLASSES_ROOT | Out-Null
$ClassesRootPath = HKCR:\Installer\Products
Get-ChildItem $ClassesRootPath |
Where-Object { ($_.GetValue(ProductName) -like *Java*)} | Foreach {
Remove-Item $_.PsPath Force Recurse
}
$JavaSoftPath = HKLM:\SOFTWARE\JavaSoft
if (Test-Path $JavaSoftPath) {
Remove-Item $JavaSoftPath Force Recurse
}
view raw

Remove-Java.ps1

hosted with ❤ by GitHub

Gracias a Sam Turner por ayudarme a corregir algunos errores con este código.

Source:
https://adamtheautomator.com/removing-old-java/