Quantcast
Channel: Blog Virtualizacion
Viewing all articles
Browse latest Browse all 679

Cerrar sesión de usuarios Citrix con Tarea Programada y Powershell

$
0
0

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:

cerrar-sesion-de-usuarios-citrix-con-tarea-programada-y-powershell-1

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:

Add-PSSnapin -Name Citrix*

Get-BrokenSession

cerrar-sesion-de-usuarios-citrix-con-tarea-programada-y-powershell-2

Si queremos filtrar por usuario:

Get-BrokerSession -Property UserName

Adicionalmente os explico como cerrar sesión por usuario o por máquina:

  • Matar todas las sesiones de un usuario:
Get-BrokerSession -UserName Dominio\Cuenta | Stop-BrokerSession
  • Matar una sesión de una máquina concreta:
$terminar = Get-BrokerDesktop -DNSName maquina.dominio.local
Stop-BrokerSession $terminar.SessionUid
Empezamos a preparar el entorno, vamos al controlador de dominio y generamos un grupo de usuarios con los que vamos a cerrar:

cerrar-sesion-de-usuarios-citrix-con-tarea-programada-y-powershell-3

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:

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:

##############################################################
#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() }
    $comp=Compare-Object $AD $DC -IncludeEqual -ExcludeDifferent | 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

    }

#################################
# 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:

cerrar-sesion-de-usuarios-citrix-con-tarea-programada-y-powershell-3

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Cerrar sesión de usuarios Citrix con Tarea Programada y Powershell se publicó primero en Blog VMware y Citrix.


Viewing all articles
Browse latest Browse all 679