Pregunta ¿Archivo por lotes para desinstalar todas las versiones de Sun Java?


Estoy configurando un sistema para mantener Java en nuestra oficina al día. Todos tienen diferentes versiones de Java, muchas de ellas antiguas e inseguras, y algunas de ellas datan de 1.4. Tengo un servidor System Center Essentials que puede ejecutar y ejecutar silenciosamente un archivo .msi, y ya he probado que puede instalar la última versión de Java. Pero las versiones anteriores (como 1.4) no son eliminadas por el instalador, así que necesito desinstalarlas. Todos están ejecutando Windows XP.

La coincidencia es que Sun acaba de ser comprado por Oracle y Oracle ahora ha cambiado todas las instancias de "Sun" a "Oracle" en Java. Por lo tanto, no puedo tener que preocuparme por desinstalar la última versión de Java, porque solo puedo hacer una búsqueda y desinstalar todos Dom Programas de java

He encontrado el siguiente script por lotes en una publicación en el foro que parecía prometedor:

@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

Sin embargo, cuando ejecuto el script, obtengo el siguiente resultado:

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.

Y luego parece colgar y ctrl-c para detenerlo.

Al leer el script, no lo entiendo todo, pero no sé por qué está intentando ejecutar piezas de claves de registro como programas. ¿Qué está mal con el script por lotes? ¿Cómo puedo solucionarlo, para poder pasar de alguna manera a convertirlo en un MSI e implementarlo para que todos limpien esta oficina?

O alternativamente, ¿puede sugerir una mejor solución o un archivo MSI existente para hacer lo que necesito? Solo quiero asegurarme de sacar todas las versiones antiguas de Java de las computadoras de todos, ya que he oído hablar de vulnerabilidades que hacen que las páginas web se carguen con versiones antiguas de Java y quiero evitarlas.


11
2017-09-03 16:00


origen


Por curiosidad ¿por qué quieres hacer esto? La incompatibilidad de la versión de Java no me ha causado más dolor (HP, te estoy mirando). En todo caso, estaría tentado de escribir un script para instalar varias versiones de Java. - Jim B
La seguridad sería la principal preocupación. Las versiones obsoletas de JVM se han explotado muy popularmente en ataques recientes. Incluso las máquinas con Windows 7 se vieron afectadas. - Joshua
Absolutamente por seguridad. En las últimas dos horas he implementado con éxito la última versión de Java en la oficina, pero esas versiones anteriores aún permanecen. He oído hablar de vulnerabilidades que podían usar una versión anterior de Java que estaba instalada pero inactiva en una máquina, para instalar spyware, y quiero evitar eso al tener SOLAMENTE la última versión de Java en las computadoras. - Ricket
Aquí hay otro enfoque que acabo de encontrar: ivan.dretvic.com/2011/02/… - Craig Ringer


Respuestas:


Lo siguiente es lo que usamos, funciona muy bien como un script de inicio:

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

6
2017-10-05 00:17



¡Eso es genial! Todavía no he limpiado las versiones anteriores de Java, así que creo que debo integrar esto en nuestro script de inicio. ¡Gracias por compartir! - Ricket


Esta línea desinstalará todas las versiones de JAVA:

wmic producto donde "nombre como 'Java %% %%'" llama a desinstalar / nointeractive


8
2018-01-16 22:57



Gracias. Esto funciona bien en mi sistema. Eliminó tanto mi versión de Java 7 como la de Java 8 con este único comando. - Michael S.
¡Gracias! Este es el mejor cmd para eliminar todas las versiones antiguas de Java. Solo necesito asegurarte de que se ejecute con privilegios de administrador. - PatricK


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

Con el tiempo, es posible que haya instalado   múltiples versiones de Java para ejecutar   contenido Java disponible. En el pasado,   cada actualización de Java se instaló en   directorios separados en su sistema.    Sin embargo, las actualizaciones de Java ahora están instaladas en un solo directorio.

¿Debo eliminar versiones anteriores de   ¿Java? Recomendamos encarecidamente a los usuarios eliminar   Todas las versiones anteriores de Java desde su   sistema. Manteniéndose viejo y sin soporte   Versiones de Java en tu sistema.   Presenta un grave riesgo de seguridad.   Eliminando versiones anteriores de Java de   su sistema asegura que Java   Las aplicaciones se ejecutarán con más   Seguridad y rendimiento actualizados.   Mejoras en tu sistema.

Encontré el siguiente VBScript que, en teoría, elimina correctamente las versiones anteriores de Java. Mejor leer de abajo hacia arriba, ya que otros lo han ajustado a la perfección:

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


1
2018-02-25 22:34



"Lo mejor es leerlo de abajo hacia arriba": en ese caso, debe copiar el mejor script aquí. - jcollum


Verifique este comando simple, pero muy útil:

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

robado de aquí


1
2018-01-04 18:37





Hay un código vbscript aquíque debería poder implementar a través de la Política de grupo sin un msi.


0
2017-09-03 22:18





La respuesta verificada más votada tiene algunos problemas con ella. Los CLSID de la serie 6.0 son incorrectos según mis pruebas.

Aquí están los CLSID que he encontrado que funcionan para cada serie JRE. Reemplace xx para las versiones que desea eliminar. Por favor use con https://serverfault.com/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}

Recomiendo agregar / norestart después de / q también en caso de que los MSI de JRE de la serie 1.4.2 quieran reiniciarse.

msiexec /x <insert_CLSID_here> /q /norestart

0
2018-05-01 19:03





Todavía puede lograr el uso de secuencias de comandos por lotes. Yo uso el siguiente script;

@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

Puede adaptar / modificar la forma que desee para satisfacer sus necesidades. ;-)


0
2018-04-15 13:39



Si usted es un administrador del sistema, no ejecute esto sin una advertencia. Matar a la fuerza en todo el sistema de Java va a molestar a algunas personas, por ejemplo, uso Eclipse todos los días, y algunas personas usan OpenOffice / LibreOffice. Solo menciono esto porque mi pregunta (hace cinco años) era si buscaba una manera de implementar silenciosamente un script que se ejecutara en la computadora de todos y desinstalar versiones antiguas de Java. Claramente, a este no le iría bien, o al menos eliminaría las líneas de taskkill. - Ricket


Esto funcionó para mí. Desinstala todas las versiones de Java (32 bits y 64 bits) antes de la última versión (que es v8.0.66 en el momento de la escritura).

wmic product where "name like 'Java%%' and version < '8.0.66'" call uninstall

0
2017-12-07 14:57