فحص صحة 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

شكرًا لـ Sam Turner للمساعدة في إصلاح بعض الأخطاء في هذا الكود.

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