Arquivo em lote para desinstalar todas as versões do Sun Java?

11

Estou configurando um sistema para manter o Java em nosso escritório atualizado. Todo mundo tem todas as versões diferentes do Java, muitas delas antigas e inseguras, e algumas datam da versão 1.4. Eu tenho um servidor System Center Essentials que pode enviar e executar silenciosamente um arquivo .msi e já testei que ele pode instalar o Java mais recente. Mas versões antigas (como a 1.4) não são removidas pelo instalador, por isso preciso desinstalá-las. Todo mundo está executando o Windows XP.

A pura coincidência é que a Sun acabou de ser comprada pela Oracle e a Oracle agora mudou todas as instâncias do "Sun" para "Oracle" em Java. Portanto, convenientemente não preciso me preocupar em desinstalar o Java mais recente, porque posso apenas pesquisar e desinstalar todos os programas Java da Sun.

Encontrei o seguinte script em lote em uma postagem do fórum que parecia promissora:

@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

No entanto, quando executo o script, obtenho a seguinte saída:

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.

E então parece travar e eu ctrl-c para interrompê-lo.

Lendo o script, não entendo tudo, mas não sei por que ele está tentando executar pedaços de chaves do Registro como programas. O que há de errado com o script em lote? Como posso corrigi-lo, para que eu possa, de alguma forma, transformá-lo em um MSI e implantá-lo em todos para limpar este escritório?

Ou, como alternativa, você pode sugerir uma solução melhor ou um arquivo MSI existente para fazer o que eu preciso? Eu só quero ter certeza de obter todas as versões antigas do Java dos computadores de todos, já que ouvi falar de explorações que causam o carregamento de páginas da Web usando versões antigas do Java e quero evitá-las.

Ricket
fonte
por curiosidade, por que você quer fazer isso? A incompatibilidade da versão Java não me causou dor (HP, estou olhando para você). Se alguma coisa eu seria tentado a escrever um script para instalar várias versões do Java
Jim B
3
A segurança seria a principal preocupação. Versões desatualizadas da JVM foram exploradas muito popularmente em ataques recentes. Até máquinas com Windows 7 foram impactadas.
Joshua
1
Absolutamente por segurança. Nas últimas duas horas, implantei com êxito o Java mais recente em todo o escritório, mas essas versões mais antigas ainda permanecem. Ouvi falar de explorações capazes de usar uma versão mais antiga do Java que estava instalada, mas inativa em uma máquina, para instalar spywares, e eu quero evitar isso, apenas com o Java mais recente nos computadores.
Ricket 3/09/10
Aqui está uma outra abordagem que eu só descobri: ivan.dretvic.com/2011/02/...
Craig Ringer

Respostas:

6

A seguir, é o que usamos, funciona muito bem como um script de inicialização:

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
fonte
Isso é ótimo! Ainda não limpei as versões antigas do Java, então acho que integrarei isso ao nosso script de inicialização. Obrigado por compartilhar!
Ricket 5/10/10
8

Esta linha irá desinstalar todas as versões do JAVA:

produto wmic em que "nomes como 'Java %% %%'" chamam uninstall / nointeractive

user154791
fonte
Obrigado. Isso funciona bem no meu sistema. Ele removeu tanto o meu Java 7 quanto as versões do Java 8 com este único comando.
22416 Michael S.Jul
Obrigado! Esse é o melhor cmd para remover todas as versões antigas do java. Só precisa garantir que seja executado com privilégio de administrador.
Patrick
1

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

Com o tempo, você pode ter instalado várias versões do Java para executar o conteúdo Java disponível. No passado, cada atualização do Java era instalada em diretórios separados no seu sistema. No entanto, as atualizações Java agora estão instaladas em um único diretório.

Devo remover versões mais antigas do Java? É altamente recomendável que os usuários removem todas as versões antigas do Java do seu sistema. Manter versões antigas e não suportadas do Java em seu sistema apresenta um sério risco de segurança. A remoção de versões mais antigas do Java do seu sistema garante que os aplicativos Java sejam executados com as melhorias de segurança e desempenho mais atualizadas no seu sistema.

Encontrei o seguinte VBScript que, em teoria, remove corretamente as versões anteriores do Java. Melhor ler de baixo para cima , já que outros o aprimoraram com perfeição:

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

Paulie D
fonte
"Melhor ler de baixo para cima" - nesse caso, você deve copiar o melhor script para aqui
jcollum
1

Verifique este comando simples, mas muito útil:

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

roubado daqui

higuita
fonte
0

Há algum código vbscript aqui que você deve poder implantar via Diretiva de Grupo sem um msi.

nedm
fonte
0

A resposta verificada mais votada tem alguns problemas. Os CLSIDs da série 6.0 estão incorretos com base nos meus testes.

Aqui estão os CLSIDs que encontrei para trabalhar para cada série do JRE. Substitua xx pelas versões desejadas que você deseja remover. Use com /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}

Eu recomendo adicionar / norestart after / q também para o caso de os MSIs JRE da série 1.4.2 quererem uma reinicialização.

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

Você ainda pode realizar o script em lote. Eu uso o seguinte 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

Você pode adaptar / modificar a maneira que você deseja atender às suas necessidades. ;-)

Heyvoon
fonte
Se você é um administrador do sistema, não execute isso sem um aviso. Forçar a eliminação do Java em todo o sistema vai incomodar algumas pessoas - por exemplo, eu uso o Eclipse todos os dias, e algumas pessoas usam o OpenOffice / LibreOffice. Só mencionei isso porque minha pergunta (cinco anos atrás) era que eu estava procurando uma maneira de implantar silenciosamente um script que seria executado no computador de todos e desinstalar versões antigas do Java. Claramente, este não seria bom, ou eu removeria as linhas de tarefas pelo menos.
Ricket 16/04
0

Isso funcionou para mim. Ele desinstala todas as versões do Java (32 e 64 bits) anteriores à versão mais recente (que é a v8.0.66 no momento da redação).

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