Plik wsadowy do odinstalowania wszystkich wersji Sun Java?

11

Konfiguruję system, aby zapewnić aktualność oprogramowania Java w naszym biurze. Każdy ma wszystkie różne wersje Javy, wiele z nich jest starych i niepewnych, a niektóre pochodzą nawet z wersji 1.4. Mam serwer System Center Essentials, który może wypychać i dyskretnie uruchamiać plik .msi, i już przetestowałem, czy można zainstalować najnowszą Javę. Ale stare wersje (takie jak 1.4) nie są usuwane przez instalatora, więc muszę je odinstalować. Wszyscy korzystają z systemu Windows XP.

Zbiegiem okoliczności jest to, że Sun właśnie kupił Oracle, a Oracle zmieniło teraz wszystkie wystąpienia „Sun” na „Oracle” w Javie. Dlatego nie mogę się martwić odinstalowaniem najnowszej wersji oprogramowania Java, ponieważ mogę po prostu wyszukać i odinstalować wszystkie programy Sun Java.

Znalazłem następujący skrypt wsadowy na postu na forum, który wyglądał obiecująco:

@echo off & cls
Rem List all Installation subkeys from uninstall key.
echo Searching Registry for Java Installs
for /f %%I in ('reg query HKLM\SOFTWARE\microsoft\windows\currentversion\uninstall') do echo %%I | find "{" > nul && call :All-Installations %%I
echo Search Complete..
goto :EOF
:All-Installations
Rem Filter out all but the Sun Installations
for /f "tokens=2*" %%T in ('reg query %1 /v Publisher 2^> nul') do echo %%U | find "Sun" > nul && call :Sun-Installations %1
goto :EOF
:Sun-Installations
Rem Filter out all but the Sun-Java Installations. Note the tilda + n, which drops all the subkeys from the path
for /f "tokens=2*" %%T in ('reg query %1 /v DisplayName 2^> nul') do echo . Uninstalling - %%U: | find "Java" && call :Sun-Java-Installs %~n1
goto :EOF
:Sun-Java-Installs
Rem Run Uninstaller for the installation
MsiExec.exe /x%1 /qb
echo . Uninstall Complete, Resuming Search..
goto :EOF

Jednak po uruchomieniu skryptu otrzymuję następujące dane wyjściowe:

Searching Registry for Java Installs
'DEV_24x6' is not recognized as an internal or external command,
operable program or batch file.
'SUBSYS_542214F1' is not recognized as an internal or external command,
operable program or batch file.

A potem wydaje się, że się zawiesza i przytrzymuję Ctrl-C, aby go zatrzymać.

Czytając skrypt, nie rozumiem wszystkiego, ale nie wiem, dlaczego próbuje uruchamiać klucze rejestru jako programy. Co jest nie tak ze skryptem wsadowym? Jak mogę to naprawić, abym mógł jakoś zmienić go w MSI i wdrożyć go dla wszystkich, aby posprzątać to biuro?

Lub alternatywnie, czy możesz zasugerować lepsze rozwiązanie lub istniejący plik MSI, aby zrobić to, czego potrzebuję? Chcę się tylko upewnić, że wszystkie starsze wersje Javy są usuwane z komputerów wszystkich użytkowników, ponieważ słyszałem o exploitach, które powodują ładowanie stron internetowych przy użyciu starych wersji Javy i chcę ich unikać.

Ricket
źródło
z ciekawości, dlaczego chcesz to zrobić. Niekompatybilność wersji Java nie sprawiła mi końca bólu (HP patrzę na ciebie). Jeśli cokolwiek, pokusiłbym się o napisanie skryptu, aby zainstalować wiele wersji Javy
Jim B
3
Bezpieczeństwo byłoby głównym problemem. Przestarzałe wersje JVM były bardzo popularne w ostatnich atakach. Wpłynęło to nawet na komputery z systemem Windows 7.
Joshua
1
Absolutnie dla bezpieczeństwa. W ciągu ostatnich kilku godzin pomyślnie wdrożyłem najnowszą Javę w całym biurze, ale te starsze wersje nadal pozostają. Słyszałem o exploitach, które były w stanie korzystać ze starszej wersji Javy, która była zainstalowana, ale nieaktywna na komputerze, w celu zainstalowania oprogramowania szpiegującego, i chcę tego uniknąć, TYLKO mając najnowszą Javę na komputerach.
Ricket
Oto inne podejście, które właśnie znalazłem: ivan.dretvic.com/2011/02/…
Craig Ringer

Odpowiedzi:

6

Używamy tego, co działa świetnie jako skrypt startowy:

on error resume next

dim WshShell
dim RegKey
dim ScriptVerKey

Set WshShell = CreateObject("WScript.Shell")

'checks to see if registry key exists, if it does, the cleanup runs.
RegKey = "HKLM\SOFTWARE\EDU\Cleanup\"
ScriptVerKey = WshShell.RegRead(RegKey & "JAVAOldVer")

if ScriptVerKey <> "1" Then 
  Cleanup()
 Else 
  WScript.Quit
End If

Sub Cleanup()

' Uninstall Java 1.4.1.01
WshShell.Run "msiexec /x {1666FA7C-CB5F-11D6-A78C-00B0D079AF64} /q",1,True
' Uninstall Java 1.4.2.04
WshShell.Run "msiexec /x {7148F0A8-6813-11D6-A77B-00B0D0142040} /q",1,True
' Uninstall Java 5.0.2
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0150020} /q",1,True
' Uninstall Java 5.0.4
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0150040} /q",1,True
' Uninstall Java 5.0.5
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0150050} /q",1,True
' Uninstall Java 5.0.6
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0150060} /q",1,True
' Uninstall Java 5.0.7
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0150070} /q",1,True
' Uninstall Java 5.0.10
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0150100} /q",1,True
' Uninstall Java 5.0.11
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0150110} /q",1,True
' Uninstall Java 5.0.12
'WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0150120} /q",1,True
' Uninstall Java 6.0.0
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0160000} /q",1,True
' Uninstall Java 6.0.1
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0160010} /q",1,True
' Uninstall Java 6.0.2
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0160020} /q",1,True
' Uninstall Java 6.0.5
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0160050} /q",1,True
' Uninstall Java 6.0.30 (020608)
WshShell.Run "msiexec /x {3248F0A8-6813-11D6-A77B-00B0D0160030} /q",1,True


'regkey below stops the script from running again
WshShell.RegWrite "HKLM\Software\EDU\", "Default"
WshShell.RegWrite "HKLM\Software\EDU\Cleanup\", "Default"
WshShell.RegWrite "HKLM\Software\EDU\Cleanup\JAVAOldVer", 1, "REG_SZ"

End Sub
edusysadmin
źródło
To wspaniale! Nie wyczyściłem jeszcze starych wersji Java, więc myślę, że zintegruję to z naszym skryptem startowym. Dzięki za udostępnienie!
Ricket
8

Ta linia odinstaluje wszystkie wersje JAVA:

Produkt wmic, w którym „nazwa jak 'Java %% %%” ”wywołuje deinstalację / brak interakcji

użytkownik154791
źródło
Dziękuję Ci. Działa to dobrze w moim systemie. Za pomocą tego pojedynczego polecenia usunęła zarówno moją Javę 7, jak i obie wersje Java 8.
Michael S.
Dzięki! To jest najlepsze polecenie cmd do usuwania wszystkich starych wersji Java. Wystarczy upewnić się, że jest uruchomiony z uprawnieniami administratora.
PatricK
1

Fragment: http://www.java.com/en/download/faq/remove_olderversions.xml

Z czasem być może zainstalowano wiele wersji Java, aby uruchomić dostępną zawartość Java. W przeszłości każda aktualizacja Java była instalowana w osobnych katalogach w systemie. Jednak aktualizacje Java są teraz instalowane w jednym katalogu.

Czy powinienem usunąć starsze wersje Javy? Zdecydowanie zalecamy użytkownikom usunięcie wszystkich starszych wersji Javy z systemu. Przechowywanie w systemie starych i nieobsługiwanych wersji Java stanowi poważne zagrożenie bezpieczeństwa. Usunięcie starszych wersji Javy z systemu gwarantuje, że aplikacje Java będą działały z najnowszymi poprawkami bezpieczeństwa i wydajności w systemie.

Znalazłem następujący VBScript, który teoretycznie właściwie usuwa wcześniejsze wersje Javy. Najlepiej czytać od dołu do góry , ponieważ inni dostosowali go do perfekcji:

http://www.appdeploy.com/messageboards/tm.asp?m=29809

Paulie D.
źródło
„Najlepiej czytać od dołu do góry” - w takim przypadku powinieneś skopiować tutaj najlepszy skrypt
jcollum
1

Sprawdź to proste, ale bardzo przydatne polecenie:

wmic product where "name like 'Java(TM) 6%%'" call uninstall /nointeractive

skradziony stąd

higuita
źródło
0

Jest jakiś kod VBScript tutaj , że powinieneś być w stanie wdrożyć za pomocą Group Policy bez MSI.

nedm
źródło
0

Sprawdzona odpowiedź najczęściej głosowana ma pewne problemy. Identyfikatory CLSID serii 6.0 są niepoprawne na podstawie moich testów.

Oto identyfikatory CLSID, które działały dla każdej serii JRE. Zamień xx na żądane wersje, które chcesz usunąć. Proszę korzystać z /server//a/187552/172014

4.2_xx
{7148F0A8-6813-11D6-A77B-00B0D0142xx0}

5.0_xx
{3248F0A8-6813-11D6-A77B-00B0D0150xx0}

6.0_xx
{26A24AE4-039D-4CA4-87B4-2F832160xxF0}

7.0_xx
{26A24AE4-039D-4CA4-87B4-2F832170xxF0}

Zalecam również dodanie opcji / norestart po / q na wypadek, gdyby MSI JRE serii 1.4.2 chciały zrestartować komputer.

msiexec /x <insert_CLSID_here> /q /norestart
CrimsonKnight13
źródło
0

Nadal możesz to osiągnąć za pomocą skryptu Batch. Używam następującego skryptu;

@ECHO OFF
REM #######################################################
REM AUTHOR: HeyVooN
REM BLOG: http://blog.teksoporte.es
REM DATE CREATED: 09/04/2015
REM Deploy Java to your Enterprise
REM This script is optimised for 32 and 64 Bit versions of Java to be installed on either 32 or 64 bit
REM operating systems. It can easily accommodate 64 bit versions of Java.
REM This script removes all previous versions of Java installed prior to (re)install any version.
REM #######################################################

REM #######################################################
REM SECTION 1 - CLEAN UP PC BEFORE INSTALLING JAVA (This section is not mandatory)
REM #######################################################
ECHO -------------------------------------------------------
ECHO STOP PROCESSES
ECHO -------------------------------------------------------
REM Assuming that processes using Java are stopped before uninstalling existing versions of Java
REM Common processes using Java: firefox.exe, iexplore.exe, chrome.exe, jusched.exe, jucheck.exe, java.exe, javacpl.exe

sc config "UI0Detect" start= disabled
sc stop UI0Detect
taskkill /F /IM jusched.exe /T
taskkill /F /IM jucheck.exe /T
taskkill /F /IM java.exe /T

ECHO -------------------------------------------------------
ECHO UNISTALL ANY PREVIOUS VERSIONS OF JAVA 32 Bit
ECHO -------------------------------------------------------
SET jver="Java 7"
SET regVar32=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
SET myCMD=REG QUERY %regVar32% /s /f %jver%
FOR /f " usebackq delims={} tokens=2" %%i IN (`%myCMD%`) DO (
 ECHO Uninstall Key: {%%i}
 ECHO Condition: %uinstallState%
 START /WAIT MSIEXEC /x {%%i} /qn /norestart
  )

ECHO -------------------------------------------------------
ECHO UNISTALL ANY PREVIOUS VERSIONS OF JAVA 64 Bit
ECHO -------------------------------------------------------
SET jver="Java 7"
SET regVar64=HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
SET myCMD=REG QUERY %regVar64% /s /f %jver%
FOR /f " usebackq delims={} tokens=2" %%i IN (`%myCMD%`) DO (
 ECHO Uninstall Key: {%%i}
 ECHO Condition: %uinstallState%
 START /WAIT MSIEXEC /x {%%i} /qn /norestart
  )

ECHO -------------------------------------------------------
ECHO CLEANING REGISTRY
ECHO -------------------------------------------------------
REM Removing known problem registry keys. I use the below line to SET the variable of which reg.exe to use depending on OS architecture.
REM Additional registry removal strings can be added here.
@If Defined ProgramFiles(x86) (SET "Reg32Path=%SystemRoot%\SysWOW64\reg.exe") Else (SET "Reg32Path=%SystemRoot%\System32\reg.exe")
REM %Reg32Path% DELETE HKLM\SOFTWARE\JavaSoft /va /f
%Reg32Path% DELETE "HKLM\SOFTWARE\JavaSoft\Auto Update" /va /f
%Reg32Path% DELETE "HKLM\SOFTWARE\JavaSoft\Java Update" /va /f

ECHO -------------------------------------------------------
ECHO DELETE START MENU ITEMS
ECHO -------------------------------------------------------
RD /s /q "%ProgramData%\Microsoft\Windows\Start Menu\Programs\Java"
PAUSE
EXIT /B 0

Możesz dostosować / zmodyfikować sposób, w jaki chcesz dopasować do swoich potrzeb. ;-)

Hejvoon
źródło
Jeśli jesteś administratorem systemu, nie uruchamiaj tego bez ostrzeżenia. Przymusowe zabijanie Java w całym systemie zdenerwuje niektórych ludzi - na przykład używam Eclipse codziennie, a niektórzy ludzie używają OpenOffice / LibreOffice. Wspominam o tym tylko dlatego, że moje pytanie (pięć lat temu) brzmiało: szukałem sposobu, aby po cichu wdrożyć skrypt, który działałby na każdym komputerze i odinstalowałby stare wersje Javy. Więc najwyraźniej ten nie przydałby się dobrze, bo przynajmniej usunęłbym wiersze zadania.
Ricket
0

To zadziałało dla mnie. Odinstalowuje wszystkie wersje Javy (32-bitowe i 64-bitowe) przed najnowszą wersją (która jest w wersji 8.0.66 w momencie pisania).

wmic product where "name like 'Java%%' and version < '8.0.66'" call uninstall
Reado
źródło