;======================================================================================================================= ; appel des librairies ;======================================================================================================================= #Include #include #include #include #include #include ;======================================================================================================================= ; déclaration des variables ;======================================================================================================================= Opt("MustDeclareVars", 1) ; définition des constantes GLOBAL Const $constUninstall = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" GLOBAL Const $constARPCache = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Management\ARPCache\" ; variables spécifiques à la fenetre LOCAL $supprimer, $annuler, $reponse, $strFin, $afficher, $fermer LOCAL $progresshot, $progresslog, $progresscle, $progressmsp LOCAL $intTOP = 20 LOCAL $intTOPhot, $intTOPlog, $intTOPcle, $intTOPmsp LOCAL $intHauteur = 300 LOCAL $intNombre = 0 LOCAL $labelMessage ; définition des couleurs LOCAL $color_BOUTON = "0x0000FF" LOCAL $color_FOND = "0x595454" LOCAL $color_TEXTE = "0xFFF380" LOCAL $color_FENETRE = "0x737CA1" LOCAL $color_AFFICHER = "0xF75D59" LOCAL $color_MESSAGE = "0x347C2C" LOCAL $color_CADRE = "0xC9C299" ; définition des tableaux GLOBAL $arrHotfix[1][1] GLOBAL $arrLogs[1] GLOBAL $arrRegistre[1][1] GLOBAL $arrMsp[1] ; définition des compteurs LOCAL $ctrHot LOCAL $ctrLog LOCAL $ctrCle LOCAL $ctrMsp ; autres variables LOCAL $strAfficher, $intLongueur ;======================================================================================================================= ; début du programme ;======================================================================================================================= ; on prépare le message à afficher $strAfficher = "Recherche des « hotfix » en cours ..." ; on calcule la longueur du message $intLongueur = StringLen($strAfficher) * 9 ; on affiche le message SplashTextOn("", $strAfficher, $intLongueur, 70, -1, -1, 0 + 1 + 16 + 32, "Times New Roman", 12, 800) ; on met une pause pour que l'utilisateur puisse lire le message Sleep(1000) ;----------------------------------------------------------- ; on appelle la fonction de recherche des HOTFIX installés ;----------------------------------------------------------- ; on stocke le nombre de hotfix dans la première case du tableau $arrHotfix[0][0] = 0 ; on appelle la fonction _ListeHotfix(@WindowsDir) ;----------------------------------------------------------- ; on appelle la fonction de recherche des logs HOTFIX orphelins ;----------------------------------------------------------- ; on stocke le nombre de logs hotfix dans la première case du tableau $arrLogs[0] = 0 ; on appelle la fonction _ListeLogs(@WindowsDir) ;----------------------------------------------------------- ; on appelle la fonction de recherche des clés de registre ;----------------------------------------------------------- ; on stocke le nombre de clés de registre dans la première case du tableau $arrRegistre[0][0] = 0 ; on appelle la fonction pour la ruche Uninstall _ListeRegistre($constUninstall, "OUI") ; on appelle la fonction pour la ruche ARPCache _ListeRegistre($constARPCache, "NON") ;----------------------------------------------------------- ; on appelle la fonction de recherche des fichiers msp ;----------------------------------------------------------- ; on stocke le nombre de fichiers msp dans la première case du tableau $arrMsp[0] = 0 ; on appelle la fonction _ListeMsp(@WindowsDir & "\Installer\") ; on efface le message SplashOff() ;----------------------------------------------------------- ; On ouvre la boite de dialogue ;----------------------------------------------------------- GUICreate("Désinstallation des HOTFIX", 400, $intHauteur, -1, -1, $WS_EX_CLIENTEDGE) ; on affiche le label des HOTFIX GUICtrlCreateLabel("Nombre de désinstallations de HOTFIX :", 20, $intTOP, 250, 20, 0x01) ; on change la couleur du fond, la couleur du texte et les attributs de la police GUICtrlSetBkColor ( -1, $color_FOND ) GUICtrlSetColor ( -1, $color_TEXTE ) GUICtrlSetFont ( -1, 9, 800, 4) ; on affiche le nombre de HOTFIX installés GUICtrlCreateLabel($arrHotfix[0][0], 270, $intTOP, 40, 20, 0x01) GUICtrlSetBkColor ( -1, $color_AFFICHER ) GUICtrlSetColor ( -1, $color_TEXTE ) GUICtrlSetFont ( -1, 10, 800) ; on sauvegarde la position pour la barre de progression If $arrHotfix[0][0] > 0 Then $intTOPhot = $intTOP + 20 $intTOP = $intTOP + 40 ; on affiche le label des LOGS de hotfix GUICtrlCreateLabel("Nombre de LOG de HOTFIX orphelins :", 20, $intTOP, 250, 20, 0x01) ; on change la couleur du fond, la couleur du texte et les attributs de la police GUICtrlSetBkColor ( -1, $color_FOND ) GUICtrlSetColor ( -1, $color_TEXTE ) GUICtrlSetFont ( -1, 9, 800, 4) ; on affiche le nombre de LOG de hotfix GUICtrlCreateLabel($arrLogs[0], 270, $intTOP, 40, 20, 0x01) GUICtrlSetBkColor ( -1, $color_AFFICHER ) GUICtrlSetColor ( -1, $color_TEXTE ) GUICtrlSetFont ( -1, 10, 800) ; on sauvegarde la position pour la barre de progression If $arrLogs[0] > 0 Then $intTOPlog = $intTOP + 20 $intTOP = $intTOP + 40 ; on affiche le label des clés de registre orphelines GUICtrlCreateLabel("Nombre de clés de registre orphelines :", 20, $intTOP, 250, 20, 0x01) ; on change la couleur du fond, la couleur du texte et les attributs de la police GUICtrlSetBkColor ( -1, $color_FOND ) GUICtrlSetColor ( -1, $color_TEXTE ) GUICtrlSetFont ( -1, 9, 800, 4) ; on affiche le nombre de clés de registre orphelines GUICtrlCreateLabel($arrRegistre[0][0], 270, $intTOP, 40, 20, 0x01) GUICtrlSetBkColor ( -1, $color_AFFICHER ) GUICtrlSetColor ( -1, $color_TEXTE ) GUICtrlSetFont ( -1, 10, 800) ; on sauvegarde la position pour la barre de progression If $arrRegistre[0][0] > 0 Then $intTOPcle = $intTOP + 20 $intTOP = $intTOP + 40 ; on affiche le label des fichiers MSP GUICtrlCreateLabel("Nombre de correctifs Windows Installer :", 20, $intTOP, 250, 20, 0x01) ; on change la couleur du fond, la couleur du texte et les attributs de la police GUICtrlSetBkColor ( -1, $color_FOND ) GUICtrlSetColor ( -1, $color_TEXTE ) GUICtrlSetFont ( -1, 9, 800, 4) ; on affiche le nombre de MSP de hotfix GUICtrlCreateLabel($arrMsp[0], 270, $intTOP, 40, 20, 0x01) GUICtrlSetBkColor ( -1, $color_AFFICHER ) GUICtrlSetColor ( -1, $color_TEXTE ) GUICtrlSetFont ( -1, 10, 800) ; on sauvegarde la position pour la barre de progression If $arrMsp[0] > 0 Then $intTOPmsp = $intTOP + 20 ;----------------------------------------------------------- ; On prépare le bas de la fenetre ;----------------------------------------------------------- ; on prépare le label des messages $intTOP = $intTOP + 50 $labelMessage = GUICtrlCreateLabel("", 20, $intTOP, 360, 15, 0x01) ; on change la couleur du texte et les attributs de la police GUICtrlSetBkColor ( $labelMessage, $color_CADRE ) GUICtrlSetColor ( $labelMessage, $color_MESSAGE ) GUICtrlSetFont ( $labelMessage, 9, 450, 2) $intTOP = $intTOP + 40 ; on affiche le bouton AFFICHER $afficher = GUICtrlCreateButton("Afficher", 20, $intTOP - 10, 80, 30) ; on change la couleur du texte et les attributs de la police GUICtrlSetColor ( $afficher, $color_BOUTON ) GUICtrlSetFont ( $afficher, 9, 800) ; on affiche le bouton ANNULER et on lui attribut la valeur PAR DEFAUT $annuler = GUICtrlCreateButton("Annuler", 225, $intTOP - 10, 70, 30) GUICtrlSetState ( $annuler, $GUI_DEFBUTTON) ; on change la couleur du texte et les attributs de la police GUICtrlSetColor ( $annuler, $color_BOUTON ) GUICtrlSetFont ( $annuler, 9, 800) ; on affiche le bouton FERMER $fermer = GUICtrlCreateButton("Fermer", 305, $intTOP - 10, 80, 30) ; on change la couleur du texte et les attributs de la police GUICtrlSetColor ( $fermer, $color_BOUTON ) GUICtrlSetFont ( $fermer, 9, 800) ; on cache le bouton FERMER GUICtrlSetState ( $fermer, $GUI_DISABLE + $GUI_HIDE) ; on affiche le bouton SUPPRIMER $supprimer = GUICtrlCreateButton("Supprimer", 305, $intTOP - 10, 80, 30) ; on change la couleur du texte et les attributs de la police GUICtrlSetColor ( $supprimer, $color_BOUTON ) GUICtrlSetFont ( $supprimer, 9, 800) ; on change la couleur de fond GUISetBkColor($color_FENETRE) ; on valide l'affichage de la fenetre GUISetState() ; on récupère le nombre de HOTFIX + le nombre de LOG + le nombre de CLES $intNombre = $arrHotfix[0][0] + $arrLogs[0] + $arrRegistre[0][0] + $arrMsp[0] If $intNombre = 0 Then GUICtrlSetState ( $supprimer, $GUI_DISABLE) ;----------------------------------------------------------- ; On traite les évènements de la fenetre ;----------------------------------------------------------- Do $reponse = GUIGetMsg() $strFin = "NON" Select Case $reponse = $supprimer ; on désactive les boutons ANNULER et SUPPRIMER GUICtrlSetState ( $afficher, $GUI_DISABLE) GUICtrlSetState ( $annuler, $GUI_DISABLE) GUICtrlSetState ( $supprimer, $GUI_DISABLE) ; on vérifie si on a trouvé des hotfix If $arrHotfix[0][0] > 0 Then ; on affiche une barre de progression $progresshot = GUICtrlCreateProgress(20, $intTOPhot, 290, 10) ; on traite chaque hotfix For $ctrHot = 1 to ($arrHotfix[0][0]) Step 1 ; on met à jour la barre de progression GUICtrlSetData($progresshot, $ctrHot * (100 / $arrHotfix[0][0])) ; on affiche un message pour informer l'utilisateur GUICtrlSetData ( $labelMessage, "Suppression de « " & $arrHotfix[$ctrHot][1] & " »...") ; on appelle la fonction de suppression du HOTFIX _SupprimerHotfix($arrHotfix[$ctrHot][0], $arrHotfix[$ctrHot][1]) Next EndIf ; on vérifie si on a trouvé des logs orphelins If $arrLogs[0] > 0 Then ; on affiche une barre de progression $progresslog = GUICtrlCreateProgress(20, $intTOPlog, 290, 10) ; on traite chaque log orphelin For $ctrLog = 1 to ($arrLogs[0]) Step 1 ; on met à jour la barre de progression GUICtrlSetData($progresslog, $ctrLog * (100 / $arrLogs[0])) ; on affiche un message pour informer l'utilisateur GUICtrlSetData ( $labelMessage, "Suppression de « " & $arrLogs[$ctrLog] & " »...") ; on appelle la fonction de suppression de la LOG _SupprimerLogs($arrLogs[$ctrLog]) Next EndIf ; on vérifie si on a trouvé des clés de registre orphelines If $arrRegistre[0][0] > 0 Then ; on affiche une barre de progression $progresscle = GUICtrlCreateProgress(20, $intTOPcle, 290, 10) ; on traite chaque clé de registre orpheline For $ctrCle = 1 to ($arrRegistre[0][0]) Step 1 ; on met à jour la barre de progression GUICtrlSetData($progresscle, $ctrCle * (100 / $arrRegistre[0][0])) ; on affiche un message pour informer l'utilisateur GUICtrlSetData ( $labelMessage, "Suppression de « " & $arrRegistre[$ctrCle][1] & " »...") ; on appelle la fonction de suppression de la clé de registre _SupprimerCles($arrRegistre[$ctrCle][0], $arrRegistre[$ctrCle][1]) Next EndIf ; on vérifie si on a trouvé des fichiers msps If $arrMsp[0] > 0 Then ; on affiche une barre de progression $progressmsp = GUICtrlCreateProgress(20, $intTOPmsp, 290, 10) ; on traite chaque msp orphelin For $ctrMsp = 1 to ($arrMsp[0]) Step 1 ; on met à jour la barre de progression GUICtrlSetData($progressmsp, $ctrMsp * (100 / $arrMsp[0])) ; on affiche un message pour informer l'utilisateur GUICtrlSetData ( $labelMessage, "Suppression de « " & $arrMsp[$ctrMsp] & " »...") ; on appelle la fonction de suppression du HOTFIX _SupprimerMsp($arrMsp[$ctrMsp]) Next EndIf ; on supprime les boutons GUICtrlDelete($afficher) GUICtrlDelete($annuler) GUICtrlDelete($supprimer) ; ; on affiche un message de fin GUICtrlSetData ( $labelMessage, "Suppressions terminées !") ; on met une pause pour temporiser l'affichage GUICtrlSetState ( $fermer, $GUI_ENABLE + $GUI_SHOW) ;sleep(2000) Case $reponse = $afficher _ArrayDisplay($arrHotfix, "Liste des Hotfix") _ArrayDisplay($arrLogs, "Liste des Logs orphelins") _ArrayDisplay($arrRegistre, "Liste des clés de registres") _ArrayDisplay($arrMsp, "Liste des correctifs Windows Installer") Case $reponse = $fermer $strFin = "OUI" EndSelect Until $reponse = $annuler or $strFin = "OUI" ;======================================================================================================================= ; fonction de recherche des dossiers HOTFIX ;======================================================================================================================= Func _ListeHotfix($strDossierHot) LOCAL $strListeHot = FileFindFirstFile($strDossierHot & "\*") LOCAL $strNomHot LOCAL $intInsererHot LOCAL $strVerifierHot LOCAL $intLongueurHot LOCAL $intDebutHot ; on va parcourir les dossiers un par un While 1 ; on récupère le nom du fichier $strNomHot = FileFindNextFile($strListeHot) If @error Then ExitLoop ; on prépare le nom complet (dossier + fichier) $strVerifierHot = $strDossierHot & "\" & $strNomHot ; on vérifie si c'est un dossier ou un fichier If StringInStr(FileGetAttrib($strVerifierHot), "D") Then ; on vérifie si c'est un dossier hotfix If StringLeft( $strNomHot, 3) = "$Nt" Then ;on récupère le nombre de dossiers $intInsererHot = $arrHotfix[0][0] + 1 ; on redimensionne le tableau des dossiers ReDim $arrHotfix[$intInsererHot + 1][2] ; on stocke le nom du dossier $arrHotfix[$intInsererHot][0] = $strDossierHot & "\" & $strNomHot ; on vérifie le type de hotfix If StringMid( $strNomHot, 4, 9) = "Uninstall" Then $intDebutHot = 13 Else $intDebutHot = 4 EndIf ; on stocke le nom du hotfix $intLongueurHot = StringLen($strNomHot) - $intDebutHot $arrHotfix[$intInsererHot][1] = StringMid($strNomHot, $intDebutHot, $intLongueurHot) ; on enregistre le nombre de dossiers $arrHotfix[0][0] = $intInsererHot EndIf EndIf WEnd ; on ferme la liste des dossiers et fichiers FileClose($strListeHot) EndFunc ;======================================================================================================================= ; fonction de recherche des LOGS hotfix ;======================================================================================================================= Func _ListeLogs($strDossierLog) LOCAL $strListeLog = FileFindFirstFile($strDossierLog & "\*") LOCAL $strNomLog LOCAL $intInsererLog LOCAL $strVerifierLog LOCAL $intPresentLog LOCAL $intLongueurLog LOCAL $strAjouterLog ; on va parcourir les fichiers un par un While 1 ; on récupère le nom du fichier $strNomLog = FileFindNextFile($strListeLog) If @error Then ExitLoop ; on prépare le nom complet (dossier + fichier) $strVerifierLog = $strDossierLog & "\" & $strNomLog ; on vérifie si c'est un dossier ou un fichier If Not StringInStr(FileGetAttrib($strVerifierLog), "D") Then ; on vérifie si c'est un fichier de type log If StringRight( $strNomLog, 3) = "log" Then ; on récupère le nom sans l'extension $intLongueurLog = StringLen($strNomLog) - 4 $strNomLog = StringMid($strNomLog, 1, $intLongueurLog) ; on vérifie si c'est un log de hotfix If StringLeft( $strNomLog, 2) = "kb" Then ; on vérifie si le log correspond à un hotfix installé If $arrHotfix[0][0] > 0 Then $intPresentLog = _ArraySearch($arrHotfix, $strNomLog, 0, 0, 0, 0, 1, 1) If @error Then $strAjouterLog = "OUI" Else $strAjouterLog = "NON" EndIf Else $strAjouterLog = "OUI" EndIf ; on vérifie s'il faut ajouter le log dans le tableau If $strAjouterLog = "OUI" Then ;on récupère le nombre de dossiers $intInsererLog = $arrLogs[0] + 1 ; on redimensionne le tableau des dossiers ReDim $arrLogs[$intInsererLog + 1] ; on stocke le nom du log $arrLogs[$intInsererLog] = $strNomLog ; on enregistre le nombre de dossiers $arrLogs[0] = $intInsererLog EndIf EndIf EndIf EndIf WEnd ; on ferme la liste des dossiers et fichiers FileClose($strListeLog) EndFunc ;======================================================================================================================= ; fonction de recherche des clés de registre ;======================================================================================================================= Func _ListeRegistre($strRucheCle, $strComparerCle) ; définition des variables LOCAL $intPresentCle LOCAL $intInsererCle LOCAL $intCompteurCle = 1 LOCAL $strNomCle LOCAL $strAjouterCle ; on va traiter chaque clé une par une While 1 ; on récupère le nom de la clé $strNomCle = RegEnumKey($strRucheCle, $intCompteurCle) If @error Then ExitLoop ; on vérifie si le nom de la clé commence par KB If StringLeft( $strNomCle, 2) = "KB" Then ; on vérifie si on doit comparer la cle de registre aux valeurs des 2 autres tableaux If $strComparerCle = "OUI" Then ; on vérifie si la cle de registre correspond à un hotfix installé If $arrHotfix[0][0] > 0 Then $intPresentCle = _ArraySearch($arrHotfix, $strNomCle, 0, 0, 0, 0, 1, 1) If @error Then $strAjouterCle = "OUI" Else $strAjouterCle = "NON" EndIf Else ; on vérifie si la cle de registre correspond à un log orphelin If $arrLogs[0] > 0 Then $intPresentCle = _ArraySearch($arrLogs, $strNomCle, 0, 0, 0, 0, 1, 1) If @error Then $strAjouterCle = "OUI" Else $strAjouterCle = "NON" EndIf Else $strAjouterCle = "OUI" EndIf EndIf Else $strAjouterCle = "OUI" EndIf Else ; on vérifie si le nom de la clé contient .KB If StringInStr ( $strNomCle, ".KB" , 1) Then ; on vérifie si on doit comparer la cle de registre aux valeurs des 2 autres tableaux If $strComparerCle = "OUI" Then ; on vérifie si la cle de registre correspond à un hotfix installé If $arrHotfix[0][0] > 0 Then $intPresentCle = _ArraySearch($arrHotfix, $strNomCle, 0, 0, 0, 0, 1, 1) If @error Then $strAjouterCle = "OUI" Else $strAjouterCle = "NON" EndIf Else ; on vérifie si la cle de registre correspond à un log orphelin If $arrLogs[0] > 0 Then $intPresentCle = _ArraySearch($arrLogs, $strNomCle, 0, 0, 0, 0, 1, 1) If @error Then $strAjouterCle = "OUI" Else $strAjouterCle = "NON" EndIf Else $strAjouterCle = "OUI" EndIf EndIf Else $strAjouterCle = "OUI" EndIf Else $strAjouterCle = "NON" EndIf EndIf ; on vérifie s'il faut ajouter la clé dans le tableau If $strAjouterCle = "OUI" Then ;on récupère le nombre de clés de registre $intInsererCle = $arrRegistre[0][0] + 1 ; on redimensionne le tableau des clés de registre ReDim $arrRegistre[$intInsererCle + 1][2] ; on stocke le nom de la ruche $arrRegistre[$intInsererCle][0] = $strRucheCle ; on stocke le nom de la clé $arrRegistre[$intInsererCle][1] = $strNomCle ; on enregistre le nombre de clés de registre $arrRegistre[0][0] = $intInsererCle EndIf $intCompteurCle += 1 WEnd EndFunc ;======================================================================================================================= ; fonction de recherche des fichiers MSP ;======================================================================================================================= Func _ListeMsp($strDossierMsp) LOCAL $strListeMsp = FileFindFirstFile($strDossierMsp & "*.msp") LOCAL $strNomMsp LOCAL $intInsererMsp LOCAL $strVerifierMsp LOCAL $intPresentMsp LOCAL $intLongueurMsp LOCAL $strAjouterMsp ; on va parcourir les fichiers un par un While 1 ; on récupère le nom du fichier $strNomMsp = FileFindNextFile($strListeMsp) If @error Then ExitLoop ; on prépare le nom complet (dossier + fichier) $strVerifierMsp = $strDossierMsp & "\" & $strNomMsp ; on vérifie si c'est un dossier ou un fichier If Not StringInStr(FileGetAttrib($strVerifierMsp), "D") Then ; on récupère le nom sans l'extension $intLongueurMsp = StringLen($strNomMsp) - 4 $strNomMsp = StringMid($strNomMsp, 1, $intLongueurMsp) ;on récupère le nombre de dossiers $intInsererMsp = $arrMsp[0] + 1 ; on redimensionne le tableau des dossiers ReDim $arrMsp[$intInsererMsp + 1] ; on stocke le nom du msp $arrMsp[$intInsererMsp] = $strNomMsp ; on enregistre le nombre de dossiers $arrMsp[0] = $intInsererMsp EndIf WEnd ; on ferme la liste des dossiers et fichiers FileClose($strListeMsp) EndFunc ;======================================================================================================================= ; fonction de suppression de HOTFIX ;======================================================================================================================= Func _SupprimerHotfix($strHotDossier, $strHotNom) ; on supprime le dossier DirRemove($strHotDossier, 1) ; on supprime le fichier LOG FileSetAttrib(@WindowsDir & "\" & $strHotNom & ".log", "-RASHNOT") FileDelete(@WindowsDir & "\" & $strHotNom & ".log") ; on met une pause pour temporiser l'affichage sleep(100) ; on supprime la clé de registre RegDelete ($constUninstall & $strHotNom) EndFunc ;======================================================================================================================= ; fonction de suppression des logs orphelins ;======================================================================================================================= Func _SupprimerLogs($strLogsNom) ; on supprime le fichier LOG FileSetAttrib(@WindowsDir & "\" & $strLogsNom & ".log", "-RASHNOT") FileDelete(@WindowsDir & "\" & $strLogsNom & ".log") ; on met une pause pour temporiser l'affichage sleep(100) ; on vérifie si une cle existe dans la base de registre If RegRead($constUninstall & $strLogsNom, "") Then ; on supprime la clé de registre RegDelete ($constUninstall & $strLogsNom) EndIf EndFunc ;======================================================================================================================= ; fonction de suppression des clés de registre orphelines ;======================================================================================================================= Func _SupprimerCles($strClesRuche, $strClesNom) ; on met une pause pour temporiser l'affichage sleep(100) ; on supprime la clé de registre RegDelete ($strClesRuche & $strClesNom) EndFunc ;======================================================================================================================= ; fonction de suppression des fichiers msps ;======================================================================================================================= Func _SupprimerMsp($strMspNom) ; on supprime le fichier MSP FileSetAttrib(@WindowsDir & "\installer\" & $strMspNom & ".msp", "-RASHNOT") FileDelete(@WindowsDir & "\installer\" & $strMspNom & ".msp") ; on met une pause pour temporiser l'affichage sleep(100) EndFunc