Si laissés sans surveillance, les environnements d’exécution Java peuvent se propager comme un feu de forêt dans une entreprise. Lorsque j’ai lancé un rapport pour découvrir à quoi ressemblait le paysage Java dans mon environnement, j’ai trouvé 62 versions différentes de Java ! Il est temps de reprendre le contrôle et de construire un script PowerShell pour supprimer les anciennes versions de Java.
Dans ce tutoriel, vous allez apprendre comment créer un outil de suppression de Java pour supprimer les anciennes versions de Java en PowerShell.
Commençons !
Création du Script
Tout d’abord, ouvrez votre éditeur de code préféré comme Visual Studio Code et enregistrez le fichier sous le nom de Remove-Java.ps1. Ce script PowerShell contiendra tout ce dont vous avez besoin pour nettoyer les anciennes versions de Java.
Définir les Chemins du Registre
Étant donné que les instances Java peuvent se cacher à deux endroits dans le registre, commencez par définir chacune des clés de registre parent. Le code ci-dessous fournit à la fois les chemins de registre 32 et 64 bits.
Définir les Versions à Conserver
Comme vous voulez probablement conserver certaines anciennes versions de Java, créez un tableau avec chacune des versions que vous souhaitez conserver.
Vous pouvez trouver le texte exact à utiliser en regardant dans Programmes et fonctionnalités dans le Panneau de configuration.
Trouver et Arrêter tous les Processus en Cours
Ensuite, trouvez tous les processus Java en cours. Le code ci-dessous énumère tous les processus en cours d’exécution avec WMI qui s’exécutent avec un fichier dans un chemin correspondant à “Program Files\Java“.
Étant donné que Java peut s’intégrer dans Internet Explorer et ne peut pas être supprimé, allez-y et arrêtez également tous les processus Internet Explorer.
Recherchez Java dans le Registre et forcez une désinstallation
Ensuite, créez un filtre que vous utiliserez pour énumérer toutes les valeurs sous les clés de registre définies ci-dessus. Ce filtre trouve toutes les instances de Java et exclut toutes les versions que vous souhaitez conserver.
Maintenant, recherchez dans le registre toutes les instances de Java et, si vous en trouvez, exécutez msiexec.exe /X
pour supprimer chaque instance.
Supprimez les vestiges anciens de Java
Nettoyez tous les vestiges que le désinstalleur de Java ne parvient pas à supprimer de lui-même.
Concluez
Et c’est tout ! Exécutez ce script PowerShell sur chaque ordinateur sur lequel vous souhaitez nettoyer Java pour rendre ce processus aussi transparent que possible.
N’hésitez pas à télécharger l’intégralité du script ci-dessous en une seule fois.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$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 | |
} |
Merci à Sam Turner de m’avoir aidé à corriger certains bugs de ce code.