' ---------------------------------------------------------- ' Script de suppression des fichiers contenus dans ' le dossier %systemroot%\SoftwareDistribution ' ' C'est dans ce dossier que sont stockées les mises à jour ' automatiques (via Windows Update ou un serveur WSUS), ' en particulier dans le sous-dossier "download". ' ' Au bout d'un certain temps, l'espace occupé par ces fichiers ' devient gigantesque (jusqu'à plusieurs Go). ' ' Ce script supprime proprement ces fichiers devenus inutiles ' ' Syntaxe: ' ClearSD.vbs ' ' ce script doit être exécuté sous un compte administrateur ' ' JC BELLAMY © 2009 ' ---------------------------------------------------------- Const SW_HIDE=0 Const SW_SHOWNORMAL=1 Set net = Wscript.CreateObject("WScript.Network") Set shell = WScript.CreateObject("WScript.Shell") Set fso = WScript.CreateObject("Scripting.FileSystemObject") TestHost false wscript.echo "Avertissement : " & VBCRLF & "Ce script doit être exécuté en tant qu'administrateur" & VBCRLF Set objLocator = CreateObject("WbemScripting.SWbemLocator") If Err.Number then msg="Erreur 0x" & CStr(Hex(Err.Number)) & " survenue dans la création de l'objet locator." If Err.Description <> "" Then msg=msg & " : " & Err.Description Err.Clear wscript.echo msg wscript.quit End If Remote=ucase(net.ComputerName) NameSpace="root\CIMV2" Set ObjService = objLocator.ConnectServer(Remote, NameSpace, "", "") If Err.Number then msg="Erreur 0x" & CStr(Hex(Err.Number)) & " survenue dans la connexion à " & remote If Err.Description <> "" Then msg=msg & " : " & Err.Description wscript.echo msg wscript.quit End If ObjService.Security_.impersonationlevel = 3 Set ServiceSet=ObjService.ExecQuery("SELECT * FROM Win32_service") SoftwareDistribution=shell.ExpandEnvironmentStrings("%systemroot%\SoftwareDistribution\") wscript.echo "*************************************************" & VBCRLF & _ "Suppression des fichiers contenus dans le dossier" & VBCRLF & _ SoftwareDistribution & VBCRLF & _ "*************************************************" & VBCRLF Svcname="wuauserv" for each Service in ServiceSet ' *** Arrêt du service Windows Update (wuauserv) s'il est démarré*** If lcase(Service.Name)=Svcname Then DN=Service.DisplayName If Service.started then coderet=Service.StopService If coderet=0 Then msg= "Le service " & DN & " a été arrêté correctement" & VBCRLF Else msg= "Erreur à l'arrêt du service " & DN msg=msg & VBCRLF & MsgFromCode(coderet) msg=msg & VBCRLF & "Script abandonné" End If Wscript.echo msg If coderet<>0 Then Wscript.quit end if ' *** Suppression des fichiers *** cumul=0 Wscript.echo "Fichier supprimé dans le dossier Datastore :" Datastore=SoftwareDistribution & "DataStore\DataStore.edb" Set File=fso.GetFile(Datastore) cumul=File.Size File.Delete true Wscript.echo " Datastore.edb" & VBCRLF Logs=SoftwareDistribution & "DataStore\Logs" If fso.FolderExists(Logs) then Set ObjLogs=fso.GetFolder(Logs) For each File in ObjLogs.files cumul=cumul+File.size Wscript.echo " " & File.Name File.Delete true Next end if Download=SoftwareDistribution & "Download" Set ObjD=fso.GetFolder(Download) Wscript.echo "Dossiers supprimés dans le dossier Download :" For each Folder in ObjD.SubFolders cumul=cumul+Folder.Size Wscript.echo " " & Folder.Name Folder.Delete true Next Wscript.echo "Fichiers supprimés dans le dossier Download :" For each File in ObjD.files cumul=cumul+File.size Wscript.echo " " & File.Name File.Delete true Next unit=" octets" If cumul>1024 Then cumul=cumul/1024 unit=" ko" If cumul>1024 Then cumul=cumul/1024 unit=" Mo" end if End If wscript.echo Int(cumul) & unit & " récupérés" ' Redémarrage du service Windows Update Service.StartService If coderet=0 Then msg= "Le service " & DN & " a redémarré correctement." else msg= "Erreur au redémarrage du service " & DN msg=msg & VBCRLF & MsgFromCode(coderet) end if wscript.echo VBCRLF & msg exit for end if next Wscript.quit '-------------------------------------------------------------------- 'Sous-programme de test du moteur 'Vu les sorties générées, c'est CSCRIPT (et non pas WSCRIPT) 'qui doit être utilisé de préférence Sub TestHost(force) dim rep strappli=lcase(Wscript.ScriptFullName) strFullName =lcase(WScript.FullName) i=InStr(1,strFullName,".exe",1) j=InStrRev(strFullName,"\",i,1) strCommand=Mid(strFullName,j+1,i-j-1) if strCommand<>"cscript" then If force then Init="Ce script doit être lancé avec CSCRIPT" Else Init="Il est préférable de lancer ce script avec CSCRIPT" End If rep=MsgBox(Init & VBCRLF & _ "Cela peut être rendu permanent avec la commande" & VBCRLF & _ "cscript //H:CScript //S /Nologo" & VBCRLF & _ "Voulez-vous que ce soit fait automatiquement?", _ vbYesNo + vbQuestion,strappli) if rep=vbYes then nomcmd="setscript.bat" Set ficcmd = fso.CreateTextFile(nomcmd) ficcmd.writeline "@echo off" ficcmd.writeline "cscript //H:CScript //S /Nologo" ficcmd.writeline "pause" params="" For i = 0 To nbargs-1 params=params & " " & args(i) next ficcmd.writeline chr(34) & strappli & chr(34) & params ficcmd.writeline "pause" ficcmd.close shell.Run nomcmd, SW_SHOWNORMAL,true force=true end if If force then WScript.Quit end if end sub '-------------------------------------------------------------------- Function MsgFromCode(coderet) Select Case coderet Case 0 MsgFromCode="La requête a été acceptée." Case 1 MsgFromCode="La requête n'est pas prise en charge." Case 2 MsgFromCode="L'utilisateur n'a pas l'accès nécessaire." Case 3 MsgFromCode="Le service ne peut pas être arrêté car d'autres services " & VBCRLF & _ "qui sont en cours d'exécution en dépendent." Case 4 MsgFromCode="Le code de contrôle requis n'est pas valide ou n'est pas " & VBCRLF & _ "acceptable pour le service." Case 5 MsgFromCode="Le code de contrôle requis ne peut pas être envoyé au service" & VBCRLF & _ "parce que l'état du service (Win32_BaseService:State) est égal à 0, 1 ou 2." Case 6 MsgFromCode="Le service n'a pas été démarré." Case 7 MsgFromCode="Le service n'a pas répondu à la demande de démarrage dans" & VBCRLF & _ "les temps impartis." Case 8 MsgFromCode="Échec inconnu lors du démarrage du service." Case 9 MsgFromCode="Le chemin d'accès au répertoire à l'exécutable du service" & VBCRLF & _ "n'a pas été trouvé." Case 10 MsgFromCode="Le service est déjà en cours d'exécution." Case 11 MsgFromCode="La base de données sur laquelle ajouter un nouveau service est bloquée." Case 12 MsgFromCode="Une dépendance sur laquelle compte ce service a été supprimée du système." Case 13 MsgFromCode="Le service n'a pas pu trouver le service nécessaire à partir" & VBCRLF & _ "d'un service dépendant." Case 14 MsgFromCode="Le service a été désactivé du système." Case 15 MsgFromCode="Le service n'a pas l'authentification correcte pour " & VBCRLF & _ "fonctionner sur le système." Case 16 MsgFromCode="Ce service est en cours de suppression du système." Case 17 MsgFromCode="Il n'y a pas de thread d'exécution pour le service." Case 18 MsgFromCode="Il y a des dépendances circulaires lors du démarrage du service." Case 19 MsgFromCode="Il y a un service en cours de fonctionnement sous le même nom." Case 20 MsgFromCode="Il y a des caractères non valides dans le nom du service." Case 21 MsgFromCode="Des paramètres non valides ont été passés au service." Case 22 MsgFromCode="le compte sous lequel ce service doit fonctionner est soit invalide" & VBCRLF & _ "ou n'a pas les permissions pour faire fonctionner le service." Case 23 MsgFromCode="Le service existe dans la base de données des services disponibles" & VBCRLF & _ "à partir du système." Case 24 MsgFromCode="Le service est pour l'instant suspendu dans le système." Case else MsgFromCode="Erreur inconnue" End Select End Function '--------------------------------------------------------------------