Verificação de Saúde do Active Directory: Scripting com PowerShell

Se deixado sem supervisão, os ambientes de execução do Java podem se espalhar como fogo em uma empresa. Quando executei um relatório para descobrir como estava o panorama do Java em meu ambiente, encontrei 62 versões diferentes do Java! É hora de retomar o controle e criar um script PowerShell para remover as versões antigas do Java.

Neste tutorial, você aprenderá como criar uma ferramenta de remoção do Java para eliminar versões antigas do Java no PowerShell.

Vamos começar!

Criando o Script

Primeiro, abra seu editor de código favorito, como o Visual Studio Code, e salve o arquivo como Remove-Java.ps1. Este script PowerShell conterá tudo o que você precisa para limpar versões anteriores do Java.

Definindo os Caminhos do Registro

Porque as instâncias do Java podem se esconder em dois lugares no registro, primeiro defina cada uma das chaves de registro pai. O trecho de código abaixo fornece os caminhos do registro de 32 e 64 bits.

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

Definindo Versões para Manter

Porque você provavelmente deseja manter algumas versões antigas do Java, crie um array com cada uma das versões que deseja manter.

Você pode encontrar o texto exato para usar ao olhar em Programas e Recursos no Painel de Controle.

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

Encontrar e Interromper Todos os Processos em Execução

Em seguida, encontre todos os processos do Java em execução. O trecho de código abaixo enumera todos os processos em execução com WMI que estão sendo executados com um arquivo em um caminho correspondente a “Program Files\Java“.

Dado que o Java pode se integrar ao Internet Explorer e não pode ser removido, vá em frente e interrompa também todos os processos do 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

Pesquise por Java no Registro e Force uma Desinstalação

Em seguida, construa um filtro que você usará para enumerar todos os valores sob as chaves do registro definidas acima. Este filtro encontra todas as instâncias do Java e exclui todas as versões que você deseja manter.

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

Agora, pesquise através do registro para encontrar todas as instâncias do Java e, se encontradas, execute msiexec.exe /X para remover cada instância.

# Desinstale as versões indesejadas do Java e limpe os arquivos do 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
    
        }
    }
}

Remova quaisquer Remanescentes Antigos do Java

Limpe quaisquer restos que o desinstalador do Java não consiga se livrar sozinho.

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
}

Conclua

E é isso! Execute este script do PowerShell em cada computador que deseja limpar o Java para tornar este processo o mais fácil possível.

Sinta-se à vontade para baixar o script inteiro de uma vez abaixo.


$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

Agradecimentos a Sam Turner por me ajudar a corrigir alguns bugs com este código.

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