TUTOS.EU

Fermer toutes les sessions Citrix

Comment fermer toutes les sessions Citrix ouvertures sur un serveur avec VbScript

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