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
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
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
Article(s) suivant(s)
Article(s) précédent(s)