Option Explicit '2013 12 13 version : add looking for "down" session Dim objFSO, objFichierLog, objFichierBat, CheminScriptActuel, CheminFichierdeLog, CheminFichierBatch, CheminFichierBatchLog, NomFichier, NumeroLigne Dim WSHShell, ObjExec01, ObjExec02, PIDMonExe Dim vSystemRoot Dim Commande, UneLigneDeResultat Dim Position, PositionFinChiffre, PositionCarActif, PositionID, SessionCitrixTrouvee, Compteur Dim NumeroSession Redim MonTableauDynamiquePourResultat(0) Dim ActualDay, MyDay, MyMonth Const ForReading = 1 Const ForWritting = 2 Const ForAppending = 8 MyDay = Day(Now) MyMonth = Month(Now) If Len(MyDay) = 1 Then MyDay = "0" & MyDay If Len(MyMonth) = 1 Then MyMonth = "0" & MyMonth ActualDay = Year(Now) & "-" & MyMonth & "-" & MyDay CheminScriptActuel = Left(wscript.scriptfullname,Len(wscript.scriptfullname)-Len(wscript.scriptname)-1) NomFichier = wscript.scriptname Position = InstrRev(NomFichier,".") NomFichier = Left(NomFichier, Position - 1) CheminFichierdeLog = CheminScriptActuel & "\" & NomFichier & "_Log_" & ActualDay & ".txt" CheminFichierBatch = CheminScriptActuel & "\" & NomFichier & "_bat.bat" CheminFichierBatchLog = CheminScriptActuel & "\" & NomFichier & "_bat_log_" & ActualDay & ".txt" Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFichierLog = objFSO.OpenTextFile(CheminFichierdeLog, ForWritting, True) Set objFichierBat = objFSO.OpenTextFile(CheminFichierBatch, ForWritting, True) Set WSHShell = CreateObject("WScript.Shell") vSystemRoot = WSHShell.ExpandEnvironmentStrings("%SystemRoot%") objFichierLog.WriteLine(Now) objFichierLog.WriteLine(VbTab & "vSystemRoot : " & vSystemRoot) Commande = "cmd.exe /C ""query session""" Set ObjExec01 = WSHShell.Exec(Commande) objFichierLog.WriteLine(VbTab & "Commande : " & Commande) PIDMonExe = ObjExec01.ProcessID objFichierLog.WriteLine(VbTab & "PID de l'exe : " & PIDMonExe) objFichierBat.WriteLine("REM Debut du script de deconnexion des sessions locales") NumeroLigne = 0 Do While Not ObjExec01.StdOut.AtEndOfStream 'On récupère la ligne NumeroLigne = NumeroLigne + 1 UneLigneDeResultat = ObjExec01.StdOut.ReadLine() objFichierLog.WriteLine(VbTab & "UneLigneDeResultat : " & UneLigneDeResultat) If NumeroLigne = 1 Then 'Si c'est la première ligne, elle contient les noms de colonnes PositionID = InStrRev(UneLigneDeResultat,"ID ") If (PositionID > 0) Then SessionCitrixTrouvee = 1 objFichierLog.WriteLine(VbTab & VbTab & "PositionID trouvé. La valeur est : " & PositionID) End If Else Compteur = Instr(1, Lcase(UneLigneDeResultat), "console") If Compteur > 1 Then objFichierLog.WriteLine(VbTab & VbTab & "Les sessions console ne sont pas traitees") Else If IsNumeric(MID(UneLigneDeResultat,PositionID+1,1)) Then 'Si on est en présence d'un chiffre Compteur = PositionID+1 'On récupère la position du dernier chiffre Do while (IsNumeric(Mid(UneLigneDeResultat, Compteur, 1)) = True) Compteur = Compteur - 1 'wscript.echo "carac isole : " & Mid(UneLigneDeResultat, Compteur, 1) Loop Compteur = Compteur + 1 'Compteur contient la position du début du numéro de la session PositionFinChiffre = PositionID+1 NumeroSession = Mid(UneLigneDeResultat, Compteur, ((PositionFinChiffre +1)-Compteur)) 'wscript.echo "NumeroSession : " & NumeroSession If (IsNumeric(NumeroSession) And (NumeroSession < 65500) And (NumeroSession > 0)) = True Then Commande = "logoff " & NumeroSession & " /V" objFichierLog.WriteLine(VbTab & "Commande : " & Commande) objFichierBat.WriteLine("REM Traitement de cette ligne : " & UneLigneDeResultat) 'objFichierBat.WriteLine(Commande) 'objFichierBat.WriteLine("START ""Logoff L" & NumeroLigne & """ CMD /C" & Commande &" > " & CheminFichierBatchLog) objFichierBat.WriteLine("START ""Logoff session " & NumeroSession & """ CMD /C " & Commande) objFichierBat.WriteLine("@timeout /t 15 /nobreak >nul") objFichierBat.WriteLine("START ""Taskkill session " & NumeroSession & """ taskkill /F /FI ""SESSION eq " & NumeroSession & """") objFichierBat.WriteLine("START ""Reset Session " & NumeroSession & """ Reset Session " & NumeroSession) Else objFichierLog.WriteLine(VbTab & VbTab & "Session non traitée") End If End If End If End If 'LignesTableauResultat = LignesTableauResultat & UneLigneDeResultat & CHR(1) 'If Len(LignesTableauResultat) > 0 Then 'LignesTableauResultat = Left(LignesTableauResultat, (Len(LignesTableauResultat) - Len(CHR(1)))) 'End If 'WScript.Sleep 1000 'Attente de 1 seconde 'Wscript.echo "Code de sortie : " & ObjExec01.ExitCode 'MonTableauDynamiquePourResultat = Split(LignesTableauResultat, CHR(1)) Loop objFichierBat.Close Set objFichierBat = Nothing 'Commande = "CMD /C """ & CheminFichierBatch & """" 'Commande = "CMD /C """ & CheminFichierBatch & """" 'Commande = "cmd.exe /C " & CheminFichierBatch 'Commande = CheminFichierBatch & " > " & CheminFichierBatchLog Commande = CheminFichierBatch objFichierLog.WriteLine("Lancement de la commande ci-dessous") objFichierLog.WriteLine(Commande) WSHShell.Run Commande 'Set ObjExec02 = WSHShell.Exec(Commande) 'Dim eee 'eee = ObjExec02.ProcessID 'Wscript.echo "Pid : " & eee 'Set ObjExec02 = Nothing 'On attend et on reexecute le .bat pour s assurer que les sessions seront bien fermees WScript.Sleep 30000 'Attente de 30 seconde objFichierLog.WriteLine("Second lancement pour s assurer de la bonne fermeture") Set ObjExec02 = WSHShell.Exec(Commande) Set ObjExec02 = Nothing 'Set ObjExec02 = Nothing 'On attend que le programme soit terminé 'Do While ObjExec01.Status = 0 'WScript.Sleep 1000 'Attente de 1 seconde 'Loop objFichierLog.WriteLine("Terminé") 'Wscript.echo "Exe terminé" Set ObjExec01 = Nothing Set WSHShell = Nothing objFichierLog.Close Set objFichierLog = Nothing