Gestione delle Sessioni RDS Disconnesse

La configurazione dell’ambiente RDS permette la gestione delle sessioni utente che risultano disconnesse.

È possibile definire un intervallo di tempo entro il quale il server Session Host termina le sessioni disconnesse, questo valore è impostato direttamente nel pannello di configurazione del servizio RDS e prevede una serie di intervalli di tempo selezionabili

Dallo stesso pannello è possibile gestire più in generale i limiti delle sessioni di connessione al di là della sessione disconnessa si può definire il comportamento sia per le sessioni attive che inattive. Una sessione è da considerarsi inattiva quando al suo interno non è presente alcuna attività

Figura 1 time out Sessione disconnessa

Il minimo intervallo di tempo impostabile per terminare una sessione disconnessa è di 1 minuto. In alcuni scenari di impiego di un sistema RDS questo valore può non essere sufficiente.

Sebbene non sia raccomandato, come riportato in questo articolo l’utilizzo di un utente comune di accesso, può essere una scelta implementativa, ed in questo caso la possibilità che in caso di disconnessione i vari utenti accedano a sessioni attive in attesa della terminazione è reale.

Intercettando sul Session Host la sessione disconnessa, è possibile intervenire tramite uno script per forzarne la chiusura, per questo scopo è possibile utilizzare i comandi

  • qwinsta
  • reset

il primo permette di rilevare lo stato delle sessioni RDP, mentre il secondo ne permette il reset sulla base dell’ID, qui di seguito è riportato uno script che avviato con una frequenza maggiore di un minuto intercetta le sessioni in stato disconnesso e ne effettua il reset

### Script per la rilevazione ed il reset di sessioni disconnesse
# Impostare il nome del server Session Host di cui effettuare il controllo delle sessioni Disconnesse
$RdsServer=”rdsh01srv.ictpower.local”
# Comando per la rilevazione delle Sessioni ed il parsing di quelle Disconnesse NON vengono rilevate quelle nelle condizioni dello Statement REGEX tra ()
$RdsSessions=(qwinsta /server:$RdsServer)| Select-String -pattern ‘^(?!.*(services|Conn|rdp-tcp)).*$’
# rilevazione dei soli valori numerici dall’array creato sopra
$IDSessions = $RdsSessions -replace “[^0-9]” ,””
# definizione del comando di reset della sessione
$ResetCmd=”reset.exe “
# definizione del LogFile
$LogFile = “C:\GestioneRds\KillSessionDiconnected\Log\$RdsServer.log”
# Creazione della Funzione di Log
Function LogWrite
{
Param ([string]$LogString)
Add-content $LogFile -value $LogString
}
# Ciclo di lettura dell’Array con il solo ID numerico delle sessioni da cancellare
foreach ($IDSession in $IDSessions)
{
# Controllo della presenza di valori numerici nella variabile ed uscita in caso di variabile non numerica
if ($IDSession -match ‘\d’ )
{
#Formazione della stringa di log
$LogEvent = (Get-Date -Uformat %d-%m-%Y” Ora “%H.%M) + ” Kill ID Sessione “+ $IDSession + ” ” + $RdsServer
Write-Output $LogEvent
# Scrittura ed esecuzione del reset della Sessione
LogWrite $LogEvent
&$ResetCmd session /Server:$RdsServer $IDSession

}
else
{

}

}

Questo script può essere richiamato tramite un ulteriore script PS che è responsabile della sua esecuzione con l’intervallo desiderato, La sola operazione pianificata non può essere utilizzata in quanto anch’essa non permette intervalli di esecuzione minori di un minuto.

#lancio PS di kill RDS session su Session HOST
for ($i=0; $i -le 4)
{
invoke-expression -Command C:\GestioneRDS\KillSessionDiconnected\ResetDisconnectedSession-rdsh01srv.ps1
sleep 10
$i++
}
}

 

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...