Cerrar sesión de usuarios Citrix con Tarea Programada y Powershell
Hoy vamos a explicaros como generar un Powershell que nos permita cerrar sesiones en Citrix de una forma programada mediante una tarea de Windows que lanzaremos periódicamente.
Os pongo un caso de uso, pero pueden ser varios diferentes, nosotros sabemos que ciertos usuarios de la organización no deberían consumir una sesión en ciertas horas del día. Porque quizás no tienen un turno de trabajo específico, o por otro motivo. Adicionalmente, no tenemos recursos suficientes para muchas sesiones extras, y por seguridad, impongo que las sesiones deben cerrarse fuera del horario laboral…
Cada uno, después de ver el script, puede elegir cómo usarlo. Así que nos aseguramos para las pruebas que existen sesiones que cerrar:
Vamos a usar un grupo de directorio activo, donde meteremos a los usuarios a validar, y adicionalmente utilizaremos los datos que nos proporcionan los Delivery Controller sobre las sesiones.
Hacemos una pequeña prueba vía Powershell, cargando los Snapin de Citrix y extraemos los datos de las sesiones, por ejemplo. Usaremos los siguientes comandos:
1 2 3 |
Add-PSSnapin -Name Citrix* Get-BrokenSession |
Si queremos filtrar por usuario:
1 |
Get-BrokerSession -Property UserName |
Adicionalmente os explico como cerrar sesión por usuario o por máquina:
- Matar todas las sesiones de un usuario:
1 |
Get-BrokerSession -UserName Dominio\Cuenta | Stop-BrokerSession |
- Matar una sesión de una máquina concreta:
1 2 |
$terminar = Get-BrokerDesktop -DNSName maquina.dominio.local Stop-BrokerSession $terminar.SessionUid |
HABILITAR WINRM EN WINDOWS SERVER 2019
También deberemos asegurarnos que la gestión remota de Powershell está habilitada en las máquinas, si queremos lanzar el script de forma remota como lo hago yo en este ejemplo:
1 2 3 |
PS C:\Users\runzue> winrm quickconfig WinRM service is already running on this machine. WinRM is already set up for remote management on this computer. |
SCRIPT CIERRE DE SESIONES CITRIX
El script lo que va a hacer es listar las sesiones, los usuarios de un grupo de directorio activo y si existen en él cierra la sesión. La programación se la daremos al generar la tarea de Windows. Yo he tenido que dar más vueltas por el tipo de salida de los comandos y seguro que hay mil formas de hacerlo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
############################################################## #SCRIPT CIERRE SESIONES USUARIOS EN CITRIX (TAREA PROGRAMADA)# ############# Raúl Unzué - ELBLOGDENEGU ##################### ############################################################## ################################## # SOBRE EL CONTROLADOR DE DOMINIO ################################## # Abrir una sesión persistente y la guardamos en una variable $ConAD $ConAD= New-PSSession -ComputerName neguad01.negu.local # Extraemos los usuarios del grupo a un fichero $UsuariosAD=Invoke-Command -Session $ConAD {Get-ADGroupMember “CITRIXKILL” -recursive | Select-Object -Property name | Format-Wide -Column 1 | Out-String} # Creamos un fichero de texto con el contenido de la variable Out-File -InputObject $UsuariosAD -FilePath C:\Users\runzue\Desktop\UsuariosAD.txt # Limpiamos los espacios en blanco (gc C:\Users\runzue\Desktop\UsuariosAD.txt) | ? {$_.trim() -ne "" } | set-content C:\Users\runzue\Desktop\UsuariosAD.txt # Agregamos el dominio en cada línea de usuario para poder comparar los datos exportados, esto por mi dominio $Dominio="NEGU\" $PathAD= 'C:\Users\runzue\Desktop\UsuariosAD.txt' (get-content $PathAD) | foreach { $Dominio + $_ } | set-content $PathAD ################################# # SOBRE EL DELLIVERY CONTROLLER ################################# # Abrir una sesión persistente y la guardamos en una variable $ConDC $ConDC= New-PSSession -ComputerName ctxroles01.negu.local # Lanzamos sobre la sesión persistente la carga de los Snapin de Citrix Invoke-Command -Session $ConDC {Add-PSSnapin -Name Citrix*} # Extraemos los usuarios del Delivery Controller y los guardamos en una variable $UsuariosDC=Invoke-Command -Session $ConDC {Get-BrokerSession | Select-Object -Property UserName | Format-Wide -Column 1 | Out-String} # Creamos un fichero de texto con el contenido de la variable y limpiamos los espacios Out-File -InputObject $UsuariosDC -FilePath C:\Users\runzue\Desktop\UsuariosDC.txt # Limpiamos los espacios en blanco (gc C:\Users\runzue\Desktop\UsuariosDC.txt) | ? {$_.trim() -ne "" } | Set-Content C:\Users\runzue\Desktop\UsuariosDC.txt ################################ # COMPARAMOS LOS FICHEROS ################################ # Comparamos los dos ficheros TXT, para extraer los que están en el grupo de AD $AD = Get-Content C:\Users\runzue\Desktop\UsuariosAD.txt | ForEach-Object { $_.Trim() } $DC = Get-Content C:\Users\runzue\Desktop\UsuariosDC.txt | ForEach-Object { $_.Trim() } # Si queremos los que están en el grupo de directorio activo $comp=Compare-Object $AD $DC -IncludeEqual -ExcludeDifferent | Select-Object -Property InputObject | Format-Wide -Column 1 | Out-String # Si queremos los que NO están en el grupo de directorio activo # $comp=Compare-Object $AD $DC | Select-Object -Property InputObject | Format-Wide -Column 1 | Out-String Out-File -InputObject $comp -FilePath C:\Users\runzue\Desktop\UsuariosDiff.txt # Limpiamos los espacios en blanco (gc C:\Users\runzue\Desktop\UsuariosDiff.txt) | ? {$_.trim() -ne "" } | Set-Content C:\Users\runzue\Desktop\UsuariosDiff.txt ######################################################################## # # CERRAMOS LA SESION DE LOS QUE ESTEN EN EL GRUPO DE ACTIVE DIRECTORY # # ######################################################################## #Cerramos todas las sesiones de los usuarios del grupo de AD ForEach ($user in $(Get-Content C:\Users\runzue\Desktop\UsuariosDiff.txt)) { Invoke-Command -Session $ConDC {param($user);Get-BrokerSession -Username $user | Stop-BrokerSession} -ArgumentList $user # Generamos log $date= Get-Date $log = Write-Output "$date, Forzamos cierre sesion $user" Add-Content $log -Path "C:\Users\runzue\Desktop\matar-sesiones.log" } ################################# # LIBERAMOS SESIONES EN SERVIDORES ################################# # Obtenemos las sesiones remotas generados y las cerramos Get-PSSession | Remove-PSSession |
Ahora simplemente crearíamos una tarea con una programación concreta:
¿Te ha gustado la entrada SÍGUENOS EN TWITTER?
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?