Active Directory Gezondheidscontrole: PowerShell Scripting

Als ze onbeheerd worden gelaten, kunnen Java-runtimeomgevingen zich als een lopend vuurtje verspreiden in een bedrijfsomgeving. Toen ik een rapport draaide om te zien hoe het Java-landschap eruitzag in mijn omgeving, vond ik 62 verschillende versies van Java! Het is tijd om de controle terug te nemen en een PowerShell-script te bouwen om oude Java-versies te verwijderen.

In deze tutorial ga je leren hoe je een Java-verwijderingstool maakt om oude Java in PowerShell te verwijderen.

Laten we beginnen!

Het Script Maken

Allereerst, open je favoriete code-editor zoals Visual Studio Code en sla het bestand op als Remove-Java.ps1. Dit PowerShell-script bevat alles wat je nodig hebt om eerdere Java-versies op te schonen.

Definieer de Registerpaden

Omdat Java-exemplaren zich op twee plaatsen in het register kunnen verbergen, definieer eerst elk van de ouderregisterpaden. De onderstaande codefragment biedt zowel de 32- als 64-bits registerpaden.

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

Definieer Versies om te Behouden

Omdat je waarschijnlijk wat oude versies van Java wilt behouden, maak een array met elk van de versies die je wilt behouden.

Je kunt de exacte tekst vinden door te kijken naar Programma’s en Functies in het Configuratiescherm.

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

Vind en Stop alle Lopende Processen

Vervolgens zoek je alle draaiende Java-processen. Het onderstaande codefragment enumereert alle draaiende processen met WMI die worden uitgevoerd met een bestand op een pad dat overeenkomt met “Program Files\Java“.

Aangezien Java zich kan nestelen in Internet Explorer en niet kan worden verwijderd, stop ook alle Internet Explorer-processen.

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

Zoek naar Java in het Register en dwing een Deïnstallatie af

Maak vervolgens een filter dat je zult gebruiken om alle waarden onder de bovenstaande registersleutels op te sommen. Dit filter zoekt naar alle Java-instanties en sluit alle versies uit die je wilt behouden.

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

Doorzoek nu het register om alle Java-instanties te vinden en voer, indien gevonden, msiexec.exe /X uit om elke instantie te verwijderen.

# Verwijder ongewenste Java-versies en ruim programmabestanden op

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
    
        }
    }
}

Verwijder eventuele oude overblijfselen van Java

Ruim eventuele restanten op die de Java-deïnstallateur niet automatisch verwijdert.

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
}

Wrap up

En dat is het! Voer dit PowerShell-script uit op elke computer waarop je Java wilt opruimen om dit proces zo soepel mogelijk te maken.

Voel je vrij om het volledige script in één keer hieronder te downloaden.


$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

Dank aan Sam Turner voor het helpen bij het oplossen van enkele bugs in deze code.

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