액티브 디렉터리 건강 점검: PowerShell 스크립팅

만약 방치하면, 자바 런타임 환경은 기업 내에서 확산될 수 있습니다. 내 환경에서 자바 랜드스케이프가 어떻게 보이는지 알아보기 위해 보고서를 실행했을 때, 62개의 다른 자바 버전을 발견했습니다! 제어권을 되찾고 오래된 자바 버전을 제거하기 위한 PowerShell 스크립트를 작성할 때입니다.

이 자습서에서는 PowerShell에서 오래된 자바를 제거하기 위한 자바 제거 도구를 만드는 방법을 배우게 됩니다.

시작해 봅시다!

스크립트 만들기

먼저, Visual Studio Code와 같은 즐겨 사용하는 코드 편집기를 열고 파일을 Remove-Java.ps1로 저장합니다. 이 PowerShell 스크립트에는 이전 자바 버전을 정리하는 데 필요한 모든 것이 포함될 것입니다.

레지스트리 경로 정의

자바 인스턴스는 레지스트리의 두 곳에 숨을 수 있기 때문에 먼저 각 부모 레지스트리 키를 정의합니다. 아래 코드 스니펫은 32비트 및 64비트 레지스트리 경로를 모두 제공합니다.

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

유지할 버전 정의

아마도 몇 가지 오래된 자바 버전을 유지하고 싶을 것입니다. 유지하려는 각 버전을 포함한 배열을 생성합니다.

제어판의 프로그램 및 기능을 확인하여 사용할 정확한 텍스트를 찾을 수 있습니다.

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

모든 실행 중인 프로세스 찾기 및 중지

다음으로, 모든 실행 중인 자바 프로세스를 찾습니다. 아래 코드 스니펫은 경로가 “Program Files\Java“와 일치하는 파일을 사용하여 실행 중인 모든 프로세스를 WMI로 나열합니다.

자바는 인터넷 익스플로러 내에 자체를 포함시킬 수 있으며 제거할 수 없으므로, 인터넷 익스플로러 프로세스도 중지합니다.

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

이 코드에 버그를 수정하는 데 도움을 주신 Sam Turner에게 감사드립니다.

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