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

Se deixado sem vigilância, 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 cenário do Java em meu ambiente, encontrei 62 versões diferentes do Java! É hora de retomar o controle e criar um script do PowerShell para remover versões antigas do Java.

Neste tutorial, você vai 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 o seu editor de código favorito, como o Visual Studio Code, e salve o arquivo como Remove-Java.ps1. Este script do PowerShell conterá tudo o que você precisa para limpar versões anteriores do Java.

Definir os Caminhos do Registro

Porque as instâncias do Java podem se esconder em dois lugares no registro, primeiro defina cada uma das chaves do 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'
)

Definir as Versões a Manter

Porque você provavelmente quer manter algumas versões antigas do Java por aí, crie uma matriz com cada uma das versões que você gostaria de manter.

Você pode encontrar o texto exato a ser usado olhando em Programas e Recursos no Painel de Controle.

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

Encontrar e Parar 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“.

Já que o Java pode se incorporar ao Internet Explorer e não pode ser removido, vá em frente e pare 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, crie 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 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 remanescentes que o desinstalador do Java não consiga remover por conta própria.

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 esse processo o mais tranquilo possível.

Sinta-se à vontade para baixar o script completo de uma só 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

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

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