TUTOS.EU

Citrix Check automatique de l ecouteur

Check automatique de l ecouteur ICA Citrix

De base, ce simple .bat permet de faite un reset des écouteurs :

Echo Yes|reset session rdp-tcp
Echo Yes|reset session Ica-tcp
Lien vers le fichier : cliquez ici Copier le code

Exécuté manuellement, une ligne donne ceci :

De base, vous pouvez simplement déclencher un bat au démarrage du système pour faire un reset des écouteurs après un reboot pour être certain de les mettre d'équerre

Le paramétrage de la tâche pour qu'elle se déclenche au boot

Pensez à associer un compte de service qui a les droits nécessaires

Le bat est directement déclenché

Dans le bat pensez à attendre 4mn avant de faire un reset pour être certain que tout a eu le temps de se lancer après le boot

Il vous faudra accorder des droits supplémentaires au compte qui exécute la tâche planifiée sous peine d'avoir ce message :

Lancez gpedit.msc
accordez le droit
logon as batch job

qui est sous
Computer Configuration>Windows Settings>Security Settings>Local Policies>User Rights Management

Il faudra redémarrer la machine

Maintenant vous pouvez passer par un VbScript qui analyse l'état des différentes sessions et qui effectue un reset sur celles qui sont "down" :

Le VbScript sera déclenché par un bat lui même lancé par une tâche planifiée

%SystemDrive%
Cd %SystemDrive%\RepertoireAvecScripts
@timeout /t 90 >nul 
Cscript.exe VbScript_Citrix_Session_Check.vbs
Lien vers le fichier : cliquez ici Copier le code

Le script en .vbs qui vérifie que l'écouteur Citrix est bien fonctionnel

Option Explicit
'2013 12 13 version : add looking for "down" session
Dim objFSO, objFichierLog, CheminScriptActuel, CheminFichierdeLog, NomFichier
Dim WSHShell, ObjExec01, ObjExec02, PIDMonExe
Dim vSystemRoot
Dim Commande, UneLigneDeResultat
Dim Position, ErreurTrouvee
Dim NumeroSession
Redim MonTableauDynamiquePourResultat(0)


Const ForReading = 1
Const ForWritting = 2
Const ForAppending = 8

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.txt"

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFichierLog = objFSO.OpenTextFile(CheminFichierdeLog, ForAppending, True)

Set WSHShell = CreateObject("WScript.Shell")
vSystemRoot = WSHShell.ExpandEnvironmentStrings("%SystemRoot%")


objFichierLog.WriteLine(Now)
objFichierLog.WriteLine(VbTab & "vSystemRoot : " &  vSystemRoot)

'Commande = vSystemRoot & "\System32\" & "unexe.exe"
'Commande = "cmd.exe /C ""dir c:\"""
'Commande = "query session"
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)

Do While Not ObjExec01.StdOut.AtEndOfStream

	'On récupère la ligne
	UneLigneDeResultat = ObjExec01.StdOut.ReadLine()
	objFichierLog.WriteLine(VbTab & "UneLigneDeResultat : " &  UneLigneDeResultat)

	'Recheche d une session HS
	ErreurTrouvee = 0
	Position = Instr(1,Lcase(UneLigneDeResultat),"hors service")
	If Position > 0 Then ErreurTrouvee = 1

	Position = Instr(1,Lcase(UneLigneDeResultat),"down")
	If Position > 0 Then ErreurTrouvee = 1
	
	If ErreurTrouvee > 0 Then
		objFichierLog.WriteLine(VbTab & "Hors service détecté")
		UneLigneDeResultat = Trim(UneLigneDeResultat)
		
		NumeroSession = Left(UneLigneDeResultat, 5)
		If IsNumeric(NumeroSession) = True Then
			'Commande = "reset session " & NumeroSession
			Commande = "reset.exe session " & NumeroSession
			'Commande = "cmd.exe /C ""reset session " &  NumeroSession & """"
			objFichierLog.WriteLine(VbTab & "Commande : " &  Commande)

			Set ObjExec02 = WSHShell.Exec(Commande)
			PIDMonExe = ObjExec02.ProcessID
			objFichierLog.WriteLine(VbTab & "PID de l'exe : " &  PIDMonExe)
			WScript.Sleep 2000
			ObjExec02.StdIn.Write "o"
			ObjExec02.StdIn.Write VbCrLf

			'WshShell.AppActivate PIDMonExe
			'WScript.Sleep 2000

			'WshShell.SendKeys "O"
			'WSHShell.SendKeys "{ENTER}"
			objFichierLog.WriteLine(VbTab & "Envoi de la touche O et Enter fait.")

			Do While Not ObjExec02.StdOut.AtEndOfStream
				UneLigneDeResultat = ObjExec02.StdOut.ReadLine()
				UneLigneDeResultat = Trim(Lcase(UneLigneDeResultat))				
				objFichierLog.WriteLine(VbTab & ObjExec02.StdOut.ReadLine())
				If Left(UneLigneDeResultat, 7) = "ica-tcp" Then
					objFichierLog.WriteLine(VbTab & "Service ICA de nouveau actif.")
				End If
			Loop
			Set ObjExec02 = Nothing
			
		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

'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
Lien vers le fichier : cliquez ici Copier le code

2