Page 1 sur 1
[..] Script pour la suppression des versions de Java
Posté : lun. 29 août 2011 11:43
par Neustradamus
Bonjour,
Je recherche un script permettant de supprimer automatiquement toutes les versions de Java SE qui ont été installées pour ainsi lancer dans la fouler l'installation d'une nouvelle version.
Merci d'avance!
Re: [..] Script pour la suppression des versions de Java
Posté : lun. 29 août 2011 21:00
par mikell
Désolé j'ai pas le temps de faire le script complet mais voilà l'idée
Tu fais une boucle qui va chercher dans le registre à :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
toutes les clés qui contiennent une sous-clé "DisplayName" avec le mot "java" et une sous-clé "UninstallString"
Ces clés obtenues seront (exemple) de la forme : {26A24AE4-039D-4CA4-87B4-2F83216023FF}
Tu les mets en variable ($cle par exemple) et tu mets cette instruction :
RunWait('msiexec /x "' & $cle & '" /qn') pour une désinstallation silencieuse
EDIT
y a plus simple
Ce code est pour tester, pour désinstaller ya une petite modif à faire :
Code : Tout sélectionner
$text = "Liste" & @CRLF & "------------------" & @CRLF
Dim $Obj_WMIService = ObjGet('winmgmts:\\' & "localhost" & '\root\cimv2')
If (IsObj($Obj_WMIService)) And (Not @error) Then
Dim $colItems = $Obj_WMIService.ExecQuery("Select * from Win32_Product where Name like '%Java%'")
Local $objItem
For $objItem In $colItems
$text &= $objItem.Name & @CRLF
; [color=#FF0000]$objItem.Uninstall() ; <= à valider pour désinstallation[/color]
Next
EndIf
MsgBox(0,"", $text)
Re: [..] Script pour la suppression des versions de Java
Posté : mar. 20 sept. 2011 08:22
par Neustradamus
Bonjour,
Merci pour ce script mais je ne suis pas un pro, si quelqu'un pourrait faire un script complet, tout le monde serait heureux
Merci beaucoup d'avance!
Re: [..] Script pour la suppression des versions de Java
Posté : mar. 20 sept. 2011 13:45
par mikell
Pas de problème mais 2 questions
1 - tu as testé le script ? déjà tel quel, il est opérationnel
2 - si ça doit être un peu plus complexe, avec fenêtre(s) de message, fichier log des versions désinstallées, choix entre programme silencieux ou gui, etc, alors il faut donner le plus de précisions possibles sur la forme souhaitée

Re: [..] Script pour la suppression des versions de Java
Posté : mer. 21 sept. 2011 12:56
par sksbir
salut Mikell, j'ai testé ton script, mais il doit y avoir un soucis avec l'objet appelé, car après avoir enlevé le filtre ( c'est devenu $Obj_WMIService.ExecQuery("Select * from Win32_Product") ) , je n'ai qu'un programme installé qui remonte dans la liste, alors que j'en ai au moins une trentaine d'installés, dont Java(TM) 6 Update 18
Ma plateforme de test est sous windows XP SP3, le PC est intégré à un domaine.
Re: [..] Script pour la suppression des versions de Java
Posté : mer. 21 sept. 2011 13:58
par mikell
A priori un script de désinstallation comme ça est fait pour fonctionner en local, mais on peut le faire marcher avec un autre pc du domaine avec des droits d'administrateur et si on a le nom de ce pc, dans ce cas il faut remplacer dans le script "localhost" par "le_nom_du_pc"
Faudrait vérifier dans le registre local si les clés que je mentionne dans mon premier post existent
Re: [..] Script pour la suppression des versions de Java
Posté : mer. 21 sept. 2011 14:38
par sksbir
mikell a écrit :A priori un script de désinstallation comme ça est fait pour fonctionner en local, mais on peut le faire marcher avec un autre pc du domaine avec des droits d'administrateur et si on a le nom de ce pc, dans ce cas il faut remplacer dans le script "localhost" par "le_nom_du_pc"
Faudrait vérifier dans le registre local si les clés que je mentionne dans mon premier post existent
Je n'ai pas dit que je voulais faire fonctionner ton script à distance. Je l'ai testé tel quel, en vue de faire l'inventaire des logiciels installés localement. Et ça ne renvoie qu'un seul logiciel.
Ce logiciel, je le trouve dans HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{A3F37A60-38EE-4C85-AA68-74D2BEAB6009} , mais j'ai également une bonne centaine de sous-clés dans HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ qui correspondent bien à d'autres programmes installés.
Et chez toi, ton programme te renvoie l'intégralité des programmes installés ?
Re: [..] Script pour la suppression des versions de Java
Posté : mer. 21 sept. 2011 17:30
par Alex74
Bonjour,
sinon il existe déjà un utilitaire prévu à cet effet: JavaRa
Re: [..] Script pour la suppression des versions de Java
Posté : mer. 21 sept. 2011 22:26
par mikell
sksbir a écrit :Et chez toi, ton programme te renvoie l'intégralité des programmes installés ?
Il renvoie les programmes qui ont été installés avec l'installateur msiexec (dont chez moi Java 6 update 23 et Java Auto Updater)
Ce qu'il faut vérifier c'est si dans tes clés HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall il y en a qui concernent Java, pour ça utilise ce script :
► Afficher le texte
Code : Tout sélectionner
Dim $keys[20], $n = 0, $text = ""
$soft = "Java" ; "Sun" ;"Adobe"
$search = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
For $i = 1 to 999
$test_key = RegEnumKey($search, $i)
If @error <> 0 then ExitLoop
If StringInStr(RegRead($search & "\" & $test_key, "DisplayName"), $soft) Then
$keys[$n] = $search & "\" & $test_key
$n += 1
EndIf
Next
For $i = 0 to $n
If $keys[$i] <> "" Then $text &= "DisplayName = " & RegRead($keys[$i], "DisplayName") & @CRLF & _
"Uninstallstring = " & RegRead($keys[$i], "Uninstallstring")& @CRLF& @CRLF
Next
If $text <> "" Then
MsgBox(64, "Information", $text)
Else
MsgBox(64, "Information", 'pas trouvé "' & $soft & '" dans le registre')
EndIf
Alex74 a écrit :il existe déjà un utilitaire prévu à cet effet: JavaRa
Tout dépend de ce qu'on veut faire, résoudre le problème avec AutoIt pour Java peut donner la recette pour résoudre d'autres cas (les machins Adobe par exemple)
Re: [..] Script pour la suppression des versions de Java
Posté : jeu. 22 sept. 2011 12:47
par sksbir
@mikell : oui, ton programme qui explore les clés de registre fonctionne très bien lui, ce qui me fait dire que la version qui s'appuye sur winmgmts n'est pas au point.
Ceci dit, s'appuyer sur les clés de registre n'est pas tip top. Perso, j'utilise ce genre de programme qui a un seul inconvénient : ça ne fonctionne que pour les MSI.
► Afficher le texte
Code : Tout sélectionner
;==================================================
; Script Relevé d'inventaire des paquets MSI
;==================================================
;
;
; Fonction d'inhibition d'erreur sur appel d'objets
;
; Declare COM Object error handler:
Global $oComError = ObjEvent("AutoIt.Error", "_ComErrFunc")
Func _ComErrFunc()
Local $HexNumber = Hex($oComError.number, 8)
; msgbox(0,"",$oComError.number)
; MsgBox(16, "COM ERROR!", "AutoIT COM Error Occured!" & @CRLF & _
; @TAB & "Error Number: " & $HexNumber & @CRLF & _
; @TAB & "Line Number: " & $oComError.scriptline & @CRLF & _
; @TAB & "Description: " & $oComError.description & @CRLF & _
; @TAB & "WinDescription: " & $oComError.windescription)
MsgBox(16,"Erreur","Erreur COM,Nr=" & $HexNumber & ",Ligne=" & $oComError.scriptline & ",Desc=" & $oComError.description & ",WinDesc=" & $oComError.windescription)
SetError(1); something to check for when this function returns
EndFunc ;==>_ComErrFunc
$MSI = ObjCreate("WindowsInstaller.Installer")
; on va mettre une section par package MSI
$MSIINCONNU=0
$TEXTE=""
;Iterate through all installed PRODUCTS based on Windows Installer
For $prod In $msi.Products
;Gather information from ProductInfo
;
; ATTENTION : l'ajout du SEPARATEUR fait l'objet d'une instruction spécifique afin de respecter le nombre de champs
; même si la requete msi.productinfo plante.
;
; Nom du produit
$TEST=$msi.ProductInfo($prod, "ProductName")
if $TEST="" then
$MSIINCONNU+=1
$TEST="INCONNU" & $MSIINCONNU
endif
$TEXTE&="[" & $TEST & "]" & @CRLF
; Nom du package
$TEXTE&="Nompackage=" & $msi.ProductInfo($prod, "PackageName") & @CRLF
; versionstring
$TEXTE&="Version=" & $msi.ProductInfo($prod, "VersionString") & @CRLF
; InstallDAte
$TEXTE&="InstallDate=" & $msi.ProductInfo($prod, "InstallDate") & @CRLF
; Répertoire source du MSI
$TEXTE&="InstallSource=" & $msi.ProductInfo($prod, "InstallSource") & @CRLF
; Chemin local d'acces au MSI
$TEXTE&="LocalPackage=" & $msi.ProductInfo($prod, "LocalPackage") & @CRLF
; Par Utilisateur / Par Ordinateur
$STRATEGIE="NODEF"
If $msi.ProductInfo($prod, "AssignmentType") = "0" Then
$STRATEGIE="PU"
Else
$STRATEGIE="PO"
EndIf
$TEXTE&="Strategie=" & $STRATEGIE & @CRLF
; package code
$TEXTE&="PackageCode=" & $msi.ProductInfo($prod, "PackageCode") & @CRLF
$TEXTE&=";------------------------------" & @CRLF
Next
;Clean up objects
$msi = ""
MsgBox(0,"Resultat",$TEXTE)
Re: [..] Script pour la suppression des versions de Java
Posté : jeu. 22 sept. 2011 19:38
par mikell
sksbir a écrit :... la version qui s'appuye sur winmgmts n'est pas au point.
Il manque probablement des paramètres d'authentification dans l'appel wmi
Les réseaux je connais pas bien c'est pour ça que sur ce coup je sèche
sksbir a écrit :s'appuyer sur les clés de registre n'est pas tip top.
Oui mais ça marche
Si mon script te renvoie des valeurs pour "UninstallString" alors on sait comment désinstaller... si en plus ces valeurs commencent par MsiExec.exe alors on peut désinstaller avec msiexec, et ça c'est facile, c'est 1 ligne à rajouter à mon script

Voilà ce que ça pourrait donner, fini (c'est spartiate mais clair)
► Afficher le texte
Code : Tout sélectionner
Dim $names[20], $keys[20], $checks[20]
$n = 0
_CheckJava()
$gui = GuiCreate("Désinstallation Java", 600, 300)
GuiCtrlCreateLabel("Liste des applications Java installées :", 20, 20, 150, 40)
GuiCtrlCreateLabel("Chemin de désinstallation :", 200, 25, 150, 40)
For $i = 1 to $n
$checks[$i] = GuiCtrlCreateCheckBox($names[$i], 20, 40+$i*20, 150, 20)
GuiCtrlCreateLabel($keys[$i], 200, 40+$i*20, 400, 20)
Next
$selectall = GuiCtrlCreateButton("Sélectionner tout", 20, 260, 120, 25)
$delete = GuiCtrlCreateButton("Désinstaller", 160, 260, 100, 25)
GuiSetState()
While 1
$msg = GuiGetMsg()
If $msg = -3 Then Exit
If $msg = $selectall Then
For $i = 1 to $n
ControlCommand($gui, "", $checks[$i], "Check", "")
Next
EndIf
If $msg = $delete Then
For $i = 1 to $n
If GuiCtrlRead($checks[$i]) = 1 Then
If $keys[$i]<>"aucun" Then
$dat = StringSplit($keys[$i], "/")
msgbox(0,"", "MsiExec.exe /qn /norestart /" & $dat[2]) ; debug
;
; RunWait("MsiExec.exe /qn /norestart /" & $dat[2]) ; desinstall
EndIf
EndIf
Next
EndIf
Wend
Func _CheckJava()
$search = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
For $i = 1 to 999
$test_key = RegEnumKey($search, $i)
If @error <> 0 then ExitLoop
If StringInStr(RegRead($search & "\" & $test_key, "DisplayName"), "Java") Then
$n += 1
$names[$n] = RegRead($search & "\" & $test_key, "DisplayName")
$keys[$n] = RegRead($search & "\" & $test_key, "Uninstallstring")
If @error Then $keys[$n] = "aucun"
EndIf
Next
EndFunc
Re: [..] Script pour la suppression des versions de Java
Posté : ven. 23 sept. 2011 16:17
par TopXm
Hello
Sinon peut-être utiliser JavaRa qui est prévu à cet effet
Site de l'éditeur
NB : J'ai fait un tuto de JavaRa sur un autre site, ne sachant pas si c'est correct de le poster ici je m'abstiendrai

Re: [..] Script pour la suppression des versions de Java
Posté : ven. 23 sept. 2011 19:52
par mikell
@TopXm
le Mer 21 Sep 2011 17:30, Alex74 a écrit : il existe déjà un utilitaire prévu à cet effet: JavaRa
De plus, si tu lis les posts tu as vu mon commentaire là-dessus : JavaRa est très bien mais ici c'est un forum AutoIt
Re: [..] Script pour la suppression des versions de Java
Posté : lun. 26 sept. 2011 15:21
par Neustradamus
Bonjour,
Merci pour vos réponses
Mais le script donne uniquement la ou les clé(s).
Est-ce qu'il est possible que le script détecte les versions et les suppriment automatiquement à la suite (version plus récente à la plus vieille) ?
Je vous remercie d'avance!
Re: [..] Script pour la suppression des versions de Java
Posté : jeu. 29 sept. 2011 23:00
par mikell
Neustradamus a écrit :Est-ce qu'il est possible que le script détecte les versions et les suppriment automatiquement à la suite (version plus récente à la plus vieille)
Oui
► Afficher le texte
Code : Tout sélectionner
#include <Array.au3>
Dim $checks[20], $javas[20][3] ; [3] = [nom, version, uninstallstring]
$n = 0
_CheckJava()
;_ArrayDisplay($javas) ; vérif
$gui = GuiCreate("Désinstallation Java", 680, 300)
GuiCtrlCreateLabel("Liste des applications Java installées :", 20, 20, 150, 40)
GuiCtrlCreateLabel("Version :", 200, 25, 70, 40)
GuiCtrlCreateLabel("Chemin de désinstallation :", 280, 25, 150, 40)
For $i = 0 to $n-1
$checks[$i] = GuiCtrlCreateCheckBox($javas[$i][0], 20, 40+($i+1)*20, 150, 20)
GuiCtrlCreateLabel($javas[$i][1], 200, 40+($i+1)*20, 70, 20)
GuiCtrlCreateLabel($javas[$i][2], 280, 40+($i+1)*20, 400, 20)
Next
$selectall = GuiCtrlCreateButton("Sélectionner tout", 20, 260, 120, 25)
$delete = GuiCtrlCreateButton("Désinstaller", 160, 260, 100, 25)
$progress = GUICtrlCreateProgress(300, 260, 200, 20, 1)
GuiSetState()
While 1
$msg = GuiGetMsg()
If $msg = -3 Then Exit
If $msg = $selectall Then
For $i = 0 to $n-1
GUICtrlSetState($checks[$i], 1) ; $GUI_CHECKED ; coche toutes les checkbox
Next
EndIf
If $msg = $delete Then
$upd = 0
For $i = 0 to $n-1
If GuiCtrlRead($checks[$i]) = 1 Then ; vérifie les checkbox
If $javas[$i][2]<>"aucun" Then
$dat = StringSplit($javas[$i][2], "/")
$upd += 1
GUICtrlSetData($progress, ($upd/$n)*200)
msgbox(0,"", "MsiExec.exe /qn /norestart /" & $dat[2]) ; debug
; ou
; RunWait("MsiExec.exe /qn /norestart /" & $dat[2]) ; desinstall
EndIf
EndIf
Next
EndIf
Wend
Func _CheckJava() ; détection
$search = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
For $i = 1 to 999
$test_key = RegEnumKey($search, $i)
If @error <> 0 then ExitLoop
If StringInStr(RegRead($search & "\" & $test_key, "DisplayName"), "Java") Then
$n += 1
$javas[$n][0] = RegRead($search & "\" & $test_key, "DisplayName")
$javas[$n][1] = RegRead($search & "\" & $test_key, "DisplayVersion")
$javas[$n][2] = RegRead($search & "\" & $test_key, "Uninstallstring")
If @error Then $javas[$n][2] = "aucun"
EndIf
Next
_ArraySort($javas, 1, 0, 0, 1) ; classement par numéro de version descendant
ReDim $javas[$n][3]
EndFunc
