En diferentes escenario un administrador necesitará finalizar sesiones de usuarios en otras máquinas de manera remota, por ejemplo para permitirnos la conexión a un servidor a través de escritorio remoto cuando se haya alcanzado ya el límite de conexiones o para expulsar a un usuario por cualquier motivo. Hoy vamos a ver hasta tres opciones para llevar esta tarea a cabo desde Powershell.

powershell

Para el primer método usaremos el comando logoff. Para ejecutarlo necesitamos conocer el ID de la sesión que queramos finalizar, para esto a su vez podemos utilizar por ejemplo los comandos quser o qwinsta. Ambos pueden ser lanzados con opciones similares aunque qwinsta ofrece alguna opción más. Para el propósito de este ejemplo con quser tenemos suficiente.

Podemos lanzar el siguiente comando contra por ejemplo el servidor "servidorejemplo"

quser /server:servidorejemplo

este comando nos devolverá un listado de los usuarios logueados mostrando el nombre de usuario, el nombre de la sesión, su ID, su estado, su tiempo inactivo y la fecha y hora de login. Una vez que ya tenemos el ID de la sesión que queremos finalizar es tan facil como lanzar el comando logoff con ese ID

logoff ID /server:servidorejemplo

El segundo método es utilizando una clase WMI y el método Win32Shutdown(). Con esta opción no tenemos que especificar un ID de sesión pero tampoco permite especificar que sesión queremos finalizar, podremos eso si forzar eso para todos los usuarios logueados en una máquina. En este caso el comando para terminar inmediatamente la sesión de todos los usuarios sería:

Invoke-CimMethod -ClassName Win32_Operatingsystem -ComputerName servidorejemplo -MethodName Win32Shutdown -Arguments @{ Flags = 4 }

Como vemos al final del comando especificamos un valor para la variable Flags. Esto puede tener los siquientes valores dependiendo de lo que queramos realizar.

  • 0 - Finaliza la sesión de los usuarios logueados. Terminando primero todos los procesos asociados a la sesión, mostrando un aviso en pantalla que se va a proceder a terminar la sesión y finalmente hace log off de los usuarios.
  • 4 - Finaliza la sesión de los usuarios logueados. A diferencia del anterior este lo hace inmediatamente sin esperar a los procesos abiertos (posible pérdida de datos) ni avisar al usuario.
  • 1 - Apaga la máquina - Cierra los procesos, avisa a los usuarios y inicia el proceso de apagar la máquina hasta la pantalla en la que se muestra que es seguro apagar el ordenador
  • 5 - Apagado forzado - Este combina las opciones 1 y 4, apaga inmediatamente los procesos y procede a apagar la máquina hasta la pantalla en la que indica que es seguro apagar el ordenador.
  • 2 - Reinicio - Apaga y reinicia la máquina
  • 6 - Reinicio forzado - Combina las opciones 2 y 4
  • 8 - Apagado y corte de alimentación - Si la maquina lo soporta esta opción apaga y desactiva la energía hacia la máquina.
  • 12 Apagador y corte de alimentación forzado - Combina las opciones 8 y 4

El tercer método es posible si lo estamos lanzando desde una máquina la última versión de Windows, en este caso dispondremos del cmdlet Invoke-RDUserLogoff, con esta opción de nuevo necesitaremos el ID de la sesión a finalizar. Una vez tenemos este dato podemos lanzar le comando de la siguiente manera:

Invoke-RDUserLogoff -HostServer servidorejemplo -UnifiedSessionId ID

Estos son solo tres ejemplos de como podemos llevar a cabo esta tarea. Para cada una de ellas como siempre podemos crear scripts para automatizar los procesos, vosotros usais alguno de estos métodos o algún otro?

Fuente Microsoft (1), Microsoft (2)