Cerrar sesiones remotas en PowerShell

Cerrar sesiones remotas en PowerShell

Como administrador de una organización, es un problema común en un lugar de trabajo donde un servidor o estación de trabajo específico puede experimentar una degradación del rendimiento.

Esta situación generalmente es causada por múltiples usuarios que se conectan de forma remota a la máquina, especialmente si se trata de una estación de trabajo compartida. Sin embargo, la mayoría de los usuarios que se conectan de forma remota no cierran la sesión correctamente y simplemente presionan el botón Cerrar en su Conexión de escritorio remoto o RDP.

Si el usuario no cierra sesión en la máquina correctamente, su perfil permanecerá activo y consumirá recursos. Como administrador, podemos remediar esto realizando operaciones de cierre de sesión.

Este artículo discutirá cómo podemos cerrar la sesión de usuarios remotos usando la línea de comando y PowerShell.

Cerrar sesiones remotas en PowerShell

Cerrar sesiones remotas programáticamente es fácil. Sin embargo, es mejor usar comandos heredados en lugar de los módulos de comandos integrados de PowerShell en este caso de uso.

Por ejemplo, el comando Invoke-RDUserLogoff del módulo PowerShell tiene sus limitaciones, como que solo se ejecuta en una computadora unida a un dominio y sistemas operativos Windows Server 2012 R2 o 8.1 y anteriores.

Por ahora, centrémonos en un par de comandos heredados para cerrar la sesión de usuarios remotos que todavía se usan ampliamente hasta el día de hoy.

el comando logoff

El comando logoff finalizará la sesión actual de un usuario en un servidor o estación de trabajo local o remoto. Si ejecutamos el comando de ayuda con el código a continuación, podemos ver que el cmdlet logoff usa algunos parámetros como el nombre de la sesión o la identificación y el nombre del servidor, que son críticos.

Código de ejemplo:

logoff /?

Producción :

LOGOFF [sessionname | sessionid] [/SERVER:servername] [/V] [/VM]

Si ya sabemos a qué servidor apuntar, ¿cómo podemos saber la sesión actual en esa máquina? Ahora usaremos el comando de usuario de consulta o quser.

Consulta de la sesión de usuario mediante el comando quser

Por ahora, intente ejecutar quser en su máquina local con el fragmento de código a continuación.

Código de ejemplo:

quser

Producción :

USERNAME              SESSION NAME        ID  STATE   IDLE TIME  LOGON TIME
>marion               console             1  Active      none   6/10/2022 5:56 AM

Ejecutar el comando quser mostrará todas las sesiones actuales en su computadora. Sin embargo, ¿cómo podemos aislar la identificación de sesión de un usuario específico en un servidor remoto sin iniciar sesión en ese servidor?

Recuerde que podemos ejecutar el comando quser localmente mientras apuntamos a una computadora remota. Todo lo que necesita es una cuenta de administrador que tenga derecho a conectarse a computadoras de forma remota.

A partir de este punto es donde necesitaremos Windows PowerShell.

Necesitaremos PowerShell para el fragmento a continuación para realizar operaciones de cadena como -split. Además, el resultado a continuación mostrará la identificación de la sesión del usuario, que necesitamos como parámetro para el comando logoff.

Código de ejemplo:

((quser /server:RDP01 | ? { $_ -match "marion" }) -split ' +')[3]

Producción :

1

Vale la pena señalar que podemos ejecutar comandos heredados en PowerShell como quser y logoff. Entonces, de ahora en adelante, usaremos el terminal de PowerShell en lugar del símbolo del sistema como nuestro intérprete.

Cerrar sesión de usuarios mediante los comandos quser y logoff

Ahora que sabemos cómo obtener el ID de sesión de un usuario sin establecer una sesión remota en la computadora, podemos combinar todos los comandos dentro de PowerShell. Podemos seguir el fragmento de código a continuación como ejemplo.

Set-Alias Query-User quser
Set-Alias Logoff-User logoff

$serverName   = 'RDP01'
$userName = 'marion'

$sessionID = ((Query-User /server:$serverName | ? { $_ -match $userName }) -split ' +')[3]

Logoff-User $sessionID /server:$serverName

Como puede notar, hemos creado nuevos alias para los comandos quser y logoff. Este paso es opcional, pero lo hemos hecho para sumergirnos aún más en las secuencias de comandos de PowerShell mediante el uso del formato de comando Verbo-Sustantivo.

Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn