Проверка состояния Active Directory: сценарий PowerShell

Если оставить без присмотра, среды выполнения Java могут распространяться как огонь в степи в предприятии. Когда я запустил отчет, чтобы узнать, какова ситуация с Java в моей среде, я обнаружил 62 разные версии Java! Пора взять ситуацию под контроль и создать сценарий PowerShell для удаления старых версий Java.

В этом руководстве вы узнаете, как создать инструмент для удаления Java в PowerShell.

Давайте начнем!

Создание сценария

Сначала откройте свой любимый редактор кода, такой как Visual Studio Code, и сохраните файл как Remove-Java.ps1. Этот сценарий PowerShell будет содержать все необходимое для очистки предыдущих версий Java.

Определение путей в реестре

Поскольку экземпляры Java могут скрываться в двух местах в реестре, сначала определите каждый из родительских ключей реестра. Нижеприведенный фрагмент кода предоставляет пути к реестру как для 32-, так и для 64-разрядных систем.

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

Определение версий для сохранения

Поскольку вы, вероятно, хотите оставить некоторые старые версии Java, создайте массив с каждой из версий, которые вы хотели бы сохранить.

Вы можете найти точный текст для использования, посмотрев на раздел “Программы и компоненты” в Панели управления.

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

Поиск и остановка всех запущенных процессов

Затем найдите все запущенные процессы Java. Нижеприведенный фрагмент кода перечисляет все запущенные процессы с помощью WMI, которые работают с файлом в пути, соответствующем “Program Files\Java“.

Поскольку Java может внедряться в Internet Explorer и не может быть удалена, прекратите все процессы 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

Поиск Java в реестре и принудительное удаление

Затем создайте фильтр, который вы будете использовать для перечисления всех значений под определенными ключами реестра. Этот фильтр находит все экземпляры Java и исключает все версии, которые вы хотели бы сохранить.

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

Теперь выполните поиск в реестре, чтобы найти все экземпляры Java и, если они найдены, запустите msiexec.exe /X, чтобы удалить каждый экземпляр.

# Удаление ненужных версий Java и очистка файлов программ

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

Удалите любые остатки старой Java

Очистите любые остатки, которые не удаляет сам установщик Java.

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
}

Завершение

И все! Запустите этот сценарий PowerShell на каждом компьютере, который вы хотите очистить от Java, чтобы сделать этот процесс максимально гладким.

Не стесняйтесь загрузить весь сценарий целиком ниже.


$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

Благодаря Сэму Тёрнеру за помощь в исправлении некоторых ошибок в этом коде.

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