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
Lien vers le fichier : cliquez ici
Exemple de .bat pour lancer le script
set datetime=%date:~-4%-%date:~3,2%-%date:~0,2%
echo %datetime%
C:
cd C:\Batch
cscript LogofCitrixSessions.vbs
@timeout /t 10 /nobreak > NUL
%systemroot%\System32\shutdown.exe /r /f /t 00
Lien vers le fichier : cliquez ici
Article(s) en relation(s)