Bonjour,
rapidement je vous mets à disposition un petit script Powershell qui nous a permis d’automatiser les reboots des serveurs RDS2008R2 d’un client en pleine journée de production.
En effet celui ci rencontre des problèmes d’ouverture de session parfois dans la journée, plus personne ne peut se connecter sur l’un des serveurs de la ferme, avec des chargements de bureau Windows interminable. De plus si le broker décide que c’est ce serveur qui a le moins de session alors il continuera d’envoyer toutes nouvelles ouverture de session dessus.
Nous avons constaté que lorsque ce phénomène ce produit, plusieurs Event ID, le 6004 6005 et 6006 remplissaient le journal d’application.
Pour pallier à cela, une tâche planifiée se déclenche lorsque l’un des Event ID apparait et exécute un script PowerShell qui est le suivant:
La commande exécutée est la suivante:
powershell.exe -ImportSystemModules C:\Scripts\mon-script.ps1
Ci joint le contenu du script:
# On autorise le système d'exploitation à exécuter ce script set-executionpolicy -executionpolicy unrestricted -force # configuration de la variable starttime pour correspondre à l'instant T moins 5min $ts = New-TimeSpan -Minutes 5 $startTime = (get-date) - $ts # On récupère le nom du serveur $name = $env:computername # configuration de la variable Endtime à l'instant T $endTime = (get-date) # récupération des erreurs concernant les problèmes d'ouverture de session sur les 5 dernières minutes $TSE = Get-EventLog -LogName "Application" -source Wlclntfy -After $startTime -before $endTime | where {$_.eventID -eq 6004 -or $_.eventID -eq 6005 -or $_.eventID -eq 6006} # Je récupère ici la valeur présente dans le fichier. Elle est sensé être à 1 en cas de problème voir plus bas, cela me permet de ne pas continuer le script si un redémarrage est déjà enclenché. $file3 = get-content C:\Scripts-CIS\plantage-en-cours.txt if ($file3 -ieq '1'){} else { # on va ensuite compter le nombre d'erreur dans ce créneau de 5min via $TSE.count if ($TSE.count -gt '10'){ # si plus grand que 10, alors on met en maintenance le serveur # on prévient toutes les sessions ouvertes via la fonction msg msg * "Vous êtes actuellement connecté sur $name qui va redémarrer pour maintenance d'ici 20min, merci de bien vouloir fermer votre session. L'équipe informatique." cd RDS: cd .\RDSConfiguration cd .\ConnectionBrokerSettings # une fois dans l’arborescence de la configuration RDS, on retire le serveur de la fonction LoadBalancing Set-Item .\LoadBalancingState 0 # et on programme le redémarrage de celui ci shutdown /r /t 1200 /c "Ce serveur va redémarrer d'ici 20min pour des raisons de maintenance" # De cette façon, le problème d'ouverture de session est détecté tôt, le serveur redémarré au bout de 20min laissant le temps aux utilisateurs de fermer leur session. # J'en profite pour incrémenter un fichier afin de vérifier après plusieurs jour\semaines combien de fois il s'est auto redémarré. $file = get-content C:\Scripts-CIS\count-plantage.txt $file2 = [int]$file + 1 $file2 > C:\Scripts-CIS\count-plantage.txt # Je pousse ensuite la valeur 1 au fichier "plantage-en-cours.txt" # Ce qui évitera au script de refaire la procédure si un autre Event ID arrivait entre temps. echo 1 > C:\Scripts-CIS\plantage-en-cours.txt exit } else { # Si $TSE.count plus petit que 10 je ne sors pas encore le serveur de la ferme RDS # J'en profite même pour forcer le Loab Balancing à 1. Cette partie est néanmoins facultative. cd RDS: cd .\RDSConfiguration cd .\ConnectionBrokerSettings Set-Item .\LoadBalancingState 1 exit }}
Il existe un dernier script powershell a ne surtout pas oublier, qui s’exécute au démarrage du serveur et qui a toute mon attention le voici:
# On remet le compteur plantage-en-cours.txt à zero echo 0 > C:\Scripts-CIS\plantage-en-cours.txt # On replace le serveur dans le LoadBalancing de la ferme RDS cd RDS: cd .\RDSConfiguration cd .\ConnectionBrokerSettings Set-Item .\LoadBalancingState 1 exit
Alors certes, on peut voir cela comme un arrêt de production, mais s’agissant d’une ferme RDS, une réouverture de session par l’utilisateur et celui-ci se reconnecte sur un autre RDS de la ferme.
Ce que j’apprécie est que le client n’a plus à nous appeler en urgence parce que ses utilisateurs n’arrivent plus à se connecter; et mine de rien, la plateforme RDS vie toute seule.
En espérant que vous puissiez vous aider de cela pour une problématique similaire, que sais-je !
ps: je vous rassure, nous nous sommes également penchés sur la réelle cause du problème de chargement de session et il semblerait qu’il existe une ou deux KB (KB2575077 et KB2265716) capables de résoudre ces problèmes, à tester …
Maxime
Votre commentaire