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

11

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

La pura coincidencia es que Oracle acaba de comprar Sun y Oracle ahora ha cambiado todas las instancias de "Sun" a "Oracle" en Java. Por lo tanto, convenientemente no tengo que preocuparme por desinstalar la última versión de Java, porque solo puedo hacer una búsqueda y desinstalar todos los programas de Sun Java.

Encontré el siguiente script por lotes en una publicación del 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 que se cuelga y ctrl-c para detenerlo.

Al leer el script, no entiendo todo, pero no sé por qué está tratando de ejecutar piezas de claves de registro como programas. ¿Qué hay de malo con el script por lotes? ¿Cómo puedo solucionarlo, de modo que pueda pasar a convertirlo en un MSI y desplegarlo para que todos puedan limpiar esta oficina?

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

Ricket
fuente
por curiosidad, ¿por qué quieres hacer esto? La incompatibilidad de la versión Java me ha causado un sinfín de dolor (HP te estoy mirando). En todo caso, estaría tentado a escribir un script para instalar varias versiones de Java
Jim B
3
La seguridad sería la principal preocupación. Las versiones obsoletas de JVM han sido explotadas muy popularmente en ataques recientes. Incluso las máquinas con Windows 7 se vieron afectadas.
Joshua
1
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 exploits 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 cualquier problema 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 el

Respuestas:

6

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
edusysadmin
fuente
¡Eso es genial! Todavía no he limpiado las versiones antiguas de Java, así que creo que voy a integrar esto en nuestro script de inicio. ¡Gracias por compartir!
Ricket
8

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

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

usuario154791
fuente
Gracias. Esto funciona bien en mi sistema. Eliminó tanto mi Java 7 como mis dos versiones de Java 8 con este comando único.
Michael S.
¡Gracias! Este es el mejor cmd para eliminar todas las versiones antiguas de Java. Solo necesita asegurarme de que se ejecuta con privilegios de administrador.
PatricK
1

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

Con el tiempo, es posible que haya instalado varias versiones de Java para ejecutar contenido Java disponible. En el pasado, cada actualización de Java se instalaba 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 que eliminen todas las versiones anteriores de Java de su sistema. Mantener versiones antiguas y no compatibles de Java en su sistema presenta un serio riesgo de seguridad. La eliminación de versiones anteriores de Java de su sistema garantiza que las aplicaciones Java se ejecutarán con las mejoras de seguridad y rendimiento más actualizadas en su sistema.

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

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

Paulie D
fuente
"Mejor leer de abajo hacia arriba" - en ese caso, debe copiar el mejor guión aquí
jcollum
1

Marque este comando simple pero muy útil:

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

robado de aquí

higuita
fuente
0

Hay algo de código VBScript aquí que usted debe ser capaz de desplegar a través de la directiva de grupo sin una msi.

nedm
fuente
0

La respuesta verificada más votada tiene algunos problemas. 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 por las versiones deseadas que desea eliminar. Úselo con /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}

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

msiexec /x <insert_CLSID_here> /q /norestart
CrimsonKnight13
fuente
0

Aún puedes lograrlo usando el script Batch. 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 en que desee satisfacer sus necesidades. ;-)

Heyvoon
fuente
Si es administrador del sistema, no ejecute esto sin una advertencia. Matar a la fuerza en todo el sistema 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 ejecute en la computadora de todos y desinstale versiones antiguas de Java. Claramente, este no funcionaría bien, o al menos eliminaría las líneas de tareas.
Ricket
0

Esto funcionó para mí. Desinstala todas las versiones de Java (32 bits y 64 bits) anteriores a 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
Reado
fuente