Aktive Verzeichnis Gesundheitsprüfung: PowerShell Skripting

Wenn sie unbeaufsichtigt bleiben, können sich Java-Runtime-Umgebungen wie ein Lauffeuer in einem Unternehmen ausbreiten. Als ich einen Bericht durchführte, um herauszufinden, wie die Java-Landschaft in meiner Umgebung aussah, fand ich 62 verschiedene Versionen von Java! Es ist an der Zeit, die Kontrolle zurückzugewinnen und ein PowerShell-Skript zum Entfernen alter Java-Versionen zu erstellen.

In diesem Tutorial erfahren Sie, wie Sie ein Java-Entfernungsprogramm zum Entfernen alter Java-Versionen in PowerShell erstellen.

Legen wir los!

Erstellen des Skripts

Zunächst öffnen Sie Ihren bevorzugten Code-Editor wie Visual Studio Code und speichern die Datei als Remove-Java.ps1. Dieses PowerShell-Skript wird alles enthalten, was Sie benötigen, um frühere Java-Versionen zu bereinigen.

Definieren der Registrierungspfade

Weil sich Java-Instanzen in zwei Stellen in der Registrierung verstecken können, definieren Sie zunächst jeden der übergeordneten Registrierungsschlüssel. Der folgende Code-Schnipsel enthält sowohl die Pfade für die 32- als auch die 64-Bit-Registrierung.

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

Definieren von Versionen, die behalten werden sollen

Weil Sie wahrscheinlich einige alte Versionen von Java behalten möchten, erstellen Sie ein Array mit jeder Version, die Sie behalten möchten.

Sie können den genauen Text finden, indem Sie unter „Programme und Funktionen“ in der Systemsteuerung nachsehen.

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

Alle laufenden Prozesse finden und stoppen

Als nächstes finden Sie alle laufenden Java-Prozesse. Der folgende Code-Schnipsel listet alle laufenden Prozesse mit WMI auf, die mit einer Datei in einem Pfad übereinstimmen, der “Program Files\Java” entspricht.

Weil sich Java in Internet Explorer einbetten kann und nicht entfernt werden kann, halten Sie auch alle Internet Explorer-Prozesse an.

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

Suche im Registrierungseditor nach Java und erzwinge eine Deinstallation

Als nächstes erstellen Sie einen Filter, den Sie verwenden werden, um alle Werte unter den oben definierten Registrierungsschlüsseln aufzulisten. Dieser Filter findet alle Java-Instanzen und schließt alle Versionen aus, die Sie behalten möchten.

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

Durchsuchen Sie nun die Registrierung, um alle Java-Instanzen zu finden und führen Sie bei Fund msiexec.exe /X aus, um jede Instanz zu entfernen.

# Deinstallieren Sie unerwünschte Java-Versionen und bereinigen Sie Programmdateien

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

Entfernen Sie alle alten Java-Rückstände

Bereinigen Sie alle Überreste, die der Java-Deinstaller nicht von selbst entfernt.

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
}

Zusammenfassung

Und das ist alles! Führen Sie dieses PowerShell-Skript auf jedem Computer aus, auf dem Sie Java aufräumen möchten, um diesen Vorgang so nahtlos wie möglich zu gestalten.

Fühlen Sie sich frei, das gesamte Skript unten auf einmal herunterzuladen.


$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

Danke an Sam Turner für die Hilfe bei der Behebung einiger Fehler in diesem Code.

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