アクティブディレクトリのアクティ健全ブ性ディチレェックク:トPowerリShellのスク健全性チェック:PowerShellスクリプト

企業内で放置されると、Javaランタイム環境は野火のように広がる可能性があります。環境内のJavaの状況を調べるためにレポートを実行したところ、62の異なるバージョンのJavaが見つかりました!制御を取り戻し、古いJavaバージョンを削除するためのPowerShellスクリプトを作成する時が来ました。

このチュートリアルでは、PowerShellで古いJavaを削除するためのJava削除ツールの作成方法を学びます。

さあ、始めましょう!

スクリプトの作成

まず、Visual Studio Codeなどのお気に入りのコードエディタを開き、ファイルをRemove-Java.ps1として保存します。このPowerShellスクリプトには、以前のJavaバージョンをクリーンアップするために必要なすべてのものが含まれます。

レジストリのパスを定義する

Javaインスタンスはレジストリの2つの場所に隠れる可能性があるため、最初に各親レジストリキーを定義します。以下のコードスニペットは、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

このコードのバグを修正するために、Sam Turnerさんに感謝します。

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