No se puede cerrar sesión, desconectar o restablecer el usuario del servidor terminal en el entorno de producción


19

Estoy buscando algunas ideas sobre cómo desconectar, cerrar sesión o restablecer la sesión de un usuario en un Terminal Server 2008 (tampoco puedo iniciar sesión como usuario ya que está completamente bloqueado). Este es un entorno de producción, por lo que reiniciar el servidor o hacer algo en todo el sistema está fuera de discusión por ahora. ¿Algún truco de Powershell para ayudarnos con esto?

Hemos intentado desconectar, cerrar la sesión del usuario y restablecer la sesión, así como también eliminar los procesos de la sesión, directamente desde el mismo servidor de terminal (desde el administrador de tareas, el Administrador de servicios de terminal y el Monitor de recursos) sin resultados.

¡Ayuda!


ACTUALIZACIÓN: Terminamos reiniciando el servidor ya que ningún otro intento que pudiéramos pensar funcionó. Dejaré esta pregunta abierta con la esperanza de que alguien tenga más información sobre este problema y sus posibles soluciones.


2
Tengo exactamente el mismo problema en mis servidores de Terminal Server Windows 2008 R2 SP1. Simplemente se cuelgan al azar y los usuarios no pueden cerrar sesión o iniciar sesión en el servidor. No puedo iniciar sesión localmente como administrador local o administrador de dominio. La única forma de conectarse al servidor es compmgmt.msc, pero incluso aquí no puedo ver ningún problema en los registros de eventos. En algún momento recibo un mensaje que dice que el servicio IMA no responde y que el servidor se ha eliminado de la granja. La única forma de resolver esto es reiniciar el servidor Hard. Apague y vuelva a encender. No he podido reducir la causa de esto a nada y yo



1
Enlaces potencialmente útiles para cualquiera que encuentre este problema en el
futuro

Respuestas:


7

Lo que funcionó para mí para resolver este mismo problema fue eliminar todos los procesos que se ejecutan bajo la cuenta bloqueada desde el Administrador de tareas y luego pude simplemente cerrar sesión en esa cuenta (desde una cuenta de Administrador).

El usuario pudo volver a iniciar sesión con la cuenta.

No fue necesario reiniciar y no fue necesario descargar software de terceros.


-¡Gracias, me salvó de reiniciar el servidor! Realmente no quería echar a todos durante la jornada laboral debido a 1 sesión estancada.
MAW74656

¿Es seguro matar estos procesos? Mi usuario tiene csrss.exe, dwm.exe, LoginUI.exe, y winlogon.exe. Pensé que matar winlogon.exeprovocaría un BSOD ...
binki

6

Quiero compartir cómo restablezco la cuenta sin la necesidad de reiniciar el servidor. En primer lugar, debe tener acceso de administrador al servidor. Utilizo la siguiente opción de inicio de sesión: mstsc / v: nombre del servidor / consola / administrador para acceder al servidor. Luego, en "Windows Taks Manager", vaya a la pestaña Usuarios y haga clic derecho sobre la cuenta que desea "Cerrar sesión", seleccione cerrar sesión. Esto debería liberar la sesión bloqueada utilizada por esa cuenta.


1
excepto que no siempre. Además, el OP dijo que ya lo habían intentado.
BeowulfNode42

Para este problema, el botón Cerrar sesión en Administrador de tareas → Usuarios no hace nada.
binki

5

La respuesta simple es ejecutar un símbolo del sistema elevado y escribir "Taskmgr" y luego le permitirá cerrar sesión en la pestaña USUARIOS. No funcionará sin estar en la sesión elevada.


Probado y esa solución funcionó.
Overmind

1
No para mí. Tampoco puede usar el administrador de tareas como administrador para eliminar ninguno de los procesos del usuario.
BeowulfNode42

3

Puede iniciar un cmd, hacer una sesión de consulta , verificar la identificación de la sesión que se va a eliminar y luego hacer una sesión de reinicio . Por ejemplo, si con la sesión de consulta obtienes que el nombre de sesión rdp-tcp # 1 es el que quieres matar, entonces puedes ejecutar la sesión de restablecimiento rdp-tcp # 1 y matarlo.


Gracias, pero eso tampoco ayudó.
l0c0b0x

Cuando ejecuto reset session 9ese comando simplemente se cuelga. Mi sesión continúa teniendo los cuatro procesos que se ejecutan sin que parezca que estar activo: crss.exe, dwm.exe, LogonUI.exe, y winlogon.exe. i.imgur.com/cFM62RA.png y query session 9salidas No User exists for 9.
binki

3

Supongo que sucedió lo mismo hoy en mi Terminal Server Win2008R2. Los síntomas fueron: 1. Me llamó por teléfono con "el mensaje de 'conexión' simplemente se cuelga para siempre". Es solo un usuario simple, así que no puedo esperar una descripción detallada del problema. 2. Intenté cerrar sesión / restablecer sesión (que generalmente ayuda en estos casos) - no funcionó. La sesión todavía se cuelga en la lista con el estado 'desconectado'. 3. Intenté matar todos los procesos para ese usuario, no ayudó. La sesión persiste y se niega a ser asesinada.

La solución fue: conectarse como usuario (inicie sesión con sus credenciales si puede restablecer su contraseña o utilizar algún tipo de asistencia remota para ver qué sucede en su computadora) y ver qué sucede en la ventana de inicio de sesión. Cuando me conecté, hice clic en el botón 'Detalles' del Cliente RDP, y aquí estaba, un mensaje de error de que winlogon hizo algo mal, estaba esperando que el usuario haga clic en los botones 'reintentar / ignorar / etc.' y dado que es el winlogon omnipotente que causó todo ese comportamiento extraño.

pd No pude encontrar ninguna manera de forzar realmente a matar una sesión :(


¡Esto me lo arregló! Estaba esperando que el usuario eligiera desconectar a otro usuario o presionar cancelar. Presioné cancelar y ahora ese Usuario que estaba atascado en la pestaña Usuarios del Administrador de tareas desapareció. ¡Gracias!
binki

Así era mi situación cuando este era el problema: i.imgur.com/W6eO5wW.png i.imgur.com/EpPwyJc.png i.imgur.com/cFM62RA.png Además, estoy usando Windows Server 2016
Helsinki

3

Acabamos de tener un problema similar con nuestro servidor de escritorio remoto Windows Server 2008 R2. La sesión de usuario mostró "Activo" al mirar RDS Manager, pero no tenía el número de ID de sesión asociado o el dispositivo conectado (ambos estaban en blanco).

Todos los trucos anteriores no resolvieron el problema. Cuando se conectó como el usuario en cuestión, apareció un mensaje de error que indicaba que Terminal Server estaba ocupado y que intentara más tarde o contacte al administrador.

Terminamos reiniciando el servidor también.


2

Tuve el mismo problema en Windows Server 2016. El usuario no pudo iniciar sesión.

Así que intenté los siguientes pasos para desconectar la sesión huérfana:

  1. en la CLI, qwinsta enumera todas las sesiones disponibles, inactivas y activas, hay una sesión desconectada (llamada "getr." en la captura de pantalla) sin un nombre de usuario, sino una identificación de sesión.

mostrar sesiones activas y matarlas

  1. con el ID de sesión (7) de 1. Traté de matar esta sesión con la sesión de reinicio 7 (para su información: rwinsta es un alias para la sesión de reinicio)

  2. funcionó durante una sesión, pero la próxima vez simplemente no tuvo efecto, así que abrí el administrador de tareas y la pestaña de usuario. Allí encontrará una lista expandible asignada a cada usuario de escritorio remoto: una lista no tenía nombre de usuario y solo mostraba 4 tareas en ejecución.

  3. Intenté lo obvio: cerrar la sesión del usuario. Sin ningún efecto

tratando de cerrar la sesión del usuario

  1. Así que intenté finalizar esas 4 tareas asignadas a este usuario. Tenga cuidado, porque algunas tareas, lo más importante, csrss.exe, cuando se eliminan, también provocarían un reinicio del sistema. Los salté y acabo de matar algunas tareas obvias de RDP.

Después del Paso / Prueba 4, incluso la última sesión bloqueada fue cancelada y el usuario pudo iniciar sesión nuevamente

  1. Si esto todavía no funciona, pruebe esta solución con otra pregunta : cuando se conecte con el cliente RDP, haga clic en el botón "detalles". Allí debería ver un error e incluso puede hacer clic en reintentar o ignorar .

¿Puedes ser más específico sobre qué procesos mataste y cuáles no? Creo que debería saltar winlogon.exe, pero estoy seguro de que otros como LoginUI.exe, csrss.exe, y dwm.exe.
binki

Los síntomas de la segunda sesión que tuvo sonaron similares a los míos y serverfault.com/a/176080/164429 . Probablemente podría agregar "Conectar" como un paso para intentar una solución más completa y tal vez incluso evitar tener que matar procesos.
binki

@binki debería ser "csrss.exe": si elimina este proceso, el sistema se reiniciará.
nr

1

Puede valer la pena comprobar que el usuario no tiene un cuadro emergente de credenciales oculto detrás de la ventana del escritorio remoto con alt + tab.

Un compañero de trabajo tenía el mismo problema; no se pudo cerrar sesión o restablecer, y todos sus procesos se cerraron manualmente. Cuando traté de acceder a la interfaz gráfica de usuario del sistema del que se estaba alejando, encontré un cuadro de credenciales oculto detrás de la sesión remota.


1

En la misma situación: un Windows Server 2008 R2 con Servicios de escritorio remoto, una conexión RDP configurada para cerrar la sesión de los usuarios después de que la sesión esté inactiva o desconectada 3 horas, y aún algunas sesiones permanecieron bloqueadas. Traté de cerrar sesión con Remote Desktop Manager y qwinsta / quser, sin éxito.

Así es como lo resolví:

  1. He localizado la ID de sesión con qwinsta.
  2. He localizado el PID de winlogon.exela sesión bloqueada con query process /ID:yourid.
  3. He matado el proceso con taskkill /f /PID yourPID.

Camino a seguir. De lo contrario, me gustaría encontrar una solución para que esto no suceda.


1

Lo que funcionó para mí fue:

  • iniciar sesión en el servidor
  • administrador de tareas abierto
  • busca al usuario en la pestaña de usuario
  • haga clic con el botón derecho, conéctese, ingrese la contraseña de usuario, vi la pantalla 'Espere'
  • presione alt-tab, eso me cerró la sesión del servidor y también cerró la sesión del usuario

1

Tuve este problema con los usuarios bloqueados de la aplicación de escritorio remoto. Escribí este script de Powershell para ejecutar una tarea programada para cerrar la sesión de los usuarios que se mostraron desconectados durante más de 2 minutos. La única edición que se requiere es el NOMBRE DEL SERVIDOR que configuré para excluir el Servidor de Remote Desktop Broker, sin embargo, puede excluir cualquier servidor que desee o ninguno.

Mi script fue escrito para Windows Server 2012 R2, por cierto ...

El guión hace esto:

  • Obtiene una lista de todas las sesiones de usuario de Escritorio remoto.
  • Ignora cualquier sesión que no diga "STATE_DISCONNECTED".
  • Ignora el servidor de intermediario (o cualquier otro servidor)
  • Ignora cualquier sesión sin ID de sesión unificada
  • Ignora cualquier sesión que no tenga un tiempo de desconexión
  • Para aquellas sesiones que tienen un tiempo de desconexión, verifica la hora actual y si la diferencia de tiempo entre ahora y el tiempo de desconexión es más de X minutos (en este caso 2), mata el proceso de winlogon.
  • También intenta emitir un comando de cierre de sesión (lo más probable es que falle después de que finalice el proceso de winlogon).

¡Esto funciona para mi! ¡Espero que ayude a alguien más! :)

CLS
$RD = Get-RDUserSession | select ServerName, UserName, SessionState, DisconnectTime, UnifiedSessionId, SessionId #Get details about the sessions
foreach ($item in $RD) {
    $UsessionID = $item.UnifiedSessionId -as [int] 
    $sessionID = $item.SessionId -as [int] 
    if ($item.SessionState -eq "STATE_DISCONNECTED" -and $item.ServerName -ne "SERVERNAME" -and $item.DisconnectTime -ne $null -and $item.UnifiedSessionId -ne $null){
        $TimeDiff = New-TimeSpan -start $item.DisconnectTime -end (Get-Date) #check time difference between disconnect time and now. If time is greater than 2 minutes....
        if ($TimeDiff.Minutes -gt 2) {
            #Kill winlogon session for the user
            Get-WmiObject -ComputerName $item.Servername -query "select * from win32_process where name='winlogon.exe'" | Where-Object {$_.SessionId -eq $SessionId} | %{$_.terminate()}
            #Log off user if session still exists (will fail if user kicked)
            Invoke-RDUserLogoff -HostServer $item.ServerName -UnifiedSessionID $UsessionID -Force -erroraction 'silentlycontinue'
            }
         }
      }

O si prefiere una versión en la que pueda ver lo que está sucediendo en la pantalla:

 CLS
    $RD = Get-RDUserSession | select ServerName, UserName, SessionState, DisconnectTime, UnifiedSessionId, SessionId
    foreach ($item in $RD) {
        $UsessionID = $item.UnifiedSessionId -as [int]
        $sessionID = $item.SessionId -as [int]
        if ($item.SessionState -eq "STATE_DISCONNECTED" -and $item.ServerName -ne "SERVERNAME" -and $item.DisconnectTime -ne $null -and $item.UnifiedSessionId -ne $null){
            #On Screen Output
            write-host " Name : " $Item.UserName -ForegroundColor "yellow" -NoNewline
            write-host " Unified Session Id : " $UsessionID -ForegroundColor "darkcyan" -NoNewline
            write-host " User Session Id : " $sessionID -ForegroundColor "darkyellow" -NoNewline
            write-host " Session State : " $item.SessionState -ForegroundColor "magenta" -NoNewline
            write-host " Server : " $item.ServerName -ForegroundColor "cyan" -NoNewline
            write-host " Disconnect Time : " $item.DisconnectTime -ForegroundColor "gray" 
            #End On Screen Output
            $TimeDiff = New-TimeSpan -start $item.DisconnectTime -end (Get-Date)
            if ($TimeDiff.Minutes -lt 2) {
                write-host " Disconnected for less than 2 minutes" -ForegroundColor "Green"}
            else {
                write-host " Disconnected for more than 2 minutes" -ForegroundColor "Red" -BackgroundColor "darkyellow"
                write-host " Killing session : " $item.ServerName " ID : " $UsessionID $item.UserName -ForegroundColor "Red"
                #Kill Process "Winlogon.exe" for the user (this should kill the session)
                Get-WmiObject -ComputerName $item.Servername -query "select * from win32_process where name='winlogon.exe'" | Where-Object {$_.SessionId -eq $SessionId} | %{$_.terminate()}
                #Logout User (if session still exists)
                Invoke-RDUserLogoff -HostServer $item.ServerName -UnifiedSessionID $UsessionID -Force -erroraction 'silentlycontinue'
                Write-host " Done! " -ForegroundColor "Green" -BackgroundColor "blue"
                }
             }
          }

1

Crea un archivo en el bloc de notas y llámalo findession.cmd. Coloque el comando Query Session / server: servername | encuentre / i "% 1" y guárdelo en un directorio. Cree otro archivo llamado resetsession.cmd y coloque el comando Restablecer sesión% 1 / servidor:% 2 y guárdelo.

Desde el símbolo del sistema, vaya al directorio donde guardó esos archivos y escriba el nombre de usuario de findession (inicio de sesión del usuario que está tratando de encontrar). Presione enter y debería ver el inicio de sesión y la ID de sesión. Escriba resetsession.cmd ID Servername y restablecerá esa sesión. Lo uso a diario y es muy rápido para encontrar usuarios y restablecer sus sesiones.


utilice las opciones de formato de texto para resaltar los comandos y permitir la legibilidad. Es una buena respuesta, pero edítela.
Marco

No tiene sentido escribir archivos por lotes cuando los comandos son tan cortos y tendrías que pasarles argumentos de todos modos
binki

1
  1. Localice la ID de sesión con qwinsta.
  2. Elimine todos los procesos de la sesión taskkill /FI "SESSION eq 1" /F, suponiendo que la ID de sesión que desea finalizar devuelta desde qwinsta fuera 1.

Esto funcionó en Server 2012 Versión 6.2 Build 9200, espero que funcione en todas las versiones de Windows.


1

Este script de power-shell funcionó para mí, incluso me da un buen archivo de registro. Lo tengo de aquí. : Espero que esto ayude a alguien más, ya que las otras respuestas tenían muchos requisitos previos y no funcionaron para mí.

    # .SYNOPSIS
    #   Checks for disconnected sessions and logs off the disconnected user sessions.

    #.DESCRIPTION
    #   Checks for disconnected sessions and logs off the disconnected user sessions.

    #.NOTES
    #   File Name: Logoff-DisconnectedSession.ps1
    #   Author   : Bart Kuppens
    #   Version  : 1.1

    #.EXAMPLE
    #   PS > .\Logoff-DisconnectedSession.ps1


    function Ensure-LogFilePath([string]$LogFilePath)
    {
     if (!(Test-Path -Path $LogFilePath)) {New-Item $LogFilePath -ItemType directory >> $null}
    }

    function Write-Log([string]$message)
    {
       Out-File -InputObject $message -FilePath $LogFile -Append
    }

    function Get-Sessions
    {
       $queryResults = query session
       $starters = New-Object psobject -Property @{"SessionName" = 0; "UserName" = 0; "ID" = 0; "State" = 0; "Type" = 0; "Device" = 0;}
       foreach ($result in $queryResults)
       {
          try
          {
             if($result.trim().substring(0, $result.trim().indexof(" ")) -eq "SESSIONNAME")
             {
                $starters.UserName = $result.indexof("USERNAME");
                $starters.ID = $result.indexof("ID");
                $starters.State = $result.indexof("STATE");
                $starters.Type = $result.indexof("TYPE");
                $starters.Device = $result.indexof("DEVICE");
                continue;
             }

             New-Object psobject -Property @{
                "SessionName" = $result.trim().substring(0, $result.trim().indexof(" ")).trim(">");
                "Username" = $result.Substring($starters.Username, $result.IndexOf(" ", $starters.Username) - $starters.Username);
                "ID" = $result.Substring($result.IndexOf(" ", $starters.Username), $starters.ID - $result.IndexOf(" ", $starters.Username) + 2).trim();
                "State" = $result.Substring($starters.State, $result.IndexOf(" ", $starters.State)-$starters.State).trim();
                "Type" = $result.Substring($starters.Type, $starters.Device - $starters.Type).trim();
                "Device" = $result.Substring($starters.Device).trim()
             }
          } 
          catch 
          {
             $e = $_;
             Write-Log "ERROR: " + $e.PSMessageDetails
          }
       }
    }

    Ensure-LogFilePath($ENV:LOCALAPPDATA + "\DisconnectedSessions")
    $LogFile = $ENV:LOCALAPPDATA + "\DisconnectedSessions\" + "sessions_" + $([DateTime]::Now.ToString('yyyyMMdd')) + ".log"

    [string]$IncludeStates = '^(Disc)$'
    Write-Log -Message "Disconnected Sessions CleanUp"
    Write-Log -Message "============================="
    $DisconnectedSessions = Get-Sessions | ? {$_.State -match $IncludeStates -and $_.UserName -ne ""} | Select ID, UserName
    Write-Log -Message "Logged off sessions"
    Write-Log -Message "-------------------"
    foreach ($session in $DisconnectedSessions)
    {
       logoff $session.ID
       Write-Log -Message $session.Username
    }
    Write-Log -Message " "
    Write-Log -Message "Finished"  

Editar:
Originalmente usé este script para cerrar sesión y cerrar todas las sesiones "desconectadas". Tenemos un par de aplicaciones de servidor de terminal con muchos usuarios y licencias limitadas. Las sesiones desconectadas permanecerían abiertas durante mucho tiempo y, a veces, permanecerían abiertas indefinidamente. Esto resultó en sesiones no utilizadas que tomarían algunas de las licencias y otros usuarios no podrían conectarse como resultado.

  • Ejecuto el script usando una tarea programada para verificar y
    desconectar regularmente las sesiones en algunos de mis servidores. Funciona de forma autónoma
    sin ninguna interacción necesaria.
  • Lo uso en los sistemas operativos Windows 2008 R2 Server y Windows 2012 R2 Server.
  • Solo cierra sesiones que fueron desconectadas.
  • Actualiza un archivo 'log' con los usuarios o sesiones que desconectó.

¿Podría explicar qué hace?
Konrad Gajewski

1
Hola Konrad, edité un poco la respuesta y espero que explique lo que hace el guión. Básicamente, el script cierra todas las sesiones desconectadas que permanecen abiertas después de que un usuario remoto se desconecta del servidor.
9953-div-37

0

Tal vez todavía hay un proceso en ejecución que bloquea el proceso de cierre de sesión. Verifique los procesos aún en ejecución para el usuario afectado. Luego, elimine el proceso uno por uno para ver qué bruja está causando el problema.

Compruebe también la HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Runclave del Registro que solo se necesitan. Se inician los procesos. En 64 bits lo es HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run.


0

Puede descargar la herramienta " Process Explorer " de Microsoft y usarla para resolver su problema. Si tiene las ID de sesión, puede encontrar sus respectivos procesos. Luego, si se desconecta una sesión de usuario, puede eliminar el proceso con Process Explorer.


0

No es exactamente el mismo entorno (tenemos 2012r2), pero al reiniciar el servicio de administración de máquinas virtuales de Hyper-V (VMMS) se me liberó la conexión.


0

Debe hacer clic en el proceso y mostrar el proceso de todos los usuarios y luego podrá desconectarse.

¿Por qué no crear una política de sesión en la configuración de host de sesión de escritorio remoto finalizada sesión desconectada o inactiva después de cierto intervalo.


0

Mi solución: en un servidor de red diferente, me conecté al servidor problemático a través de la herramienta Computer Management, en sesiones abiertas hice clic derecho y cerré cada archivo abierto y luego pude conectarme a través de mstsc


0

siempre puedes usar powershell desde tu máquina local y hacerlo de forma remota

Invoke-command -computername <servername> -Credential (get-credential) { 
    $session = ((quser | ? { $_ -match <username> }) -split ' +' )[2]
    logoff $session
} 

Para que su respuesta sea aún más útil, sería útil proporcionar una explicación básica de cómo funciona este comando. No todos pueden tener suficiente experiencia con PowerShell para entenderlo. Gracias por contribuir
Digo reinstalar a Mónica

-1

Desafortunadamente. Mi sesión de usuario fue desconectada. El administrador de tareas no mostró ningún proceso ejecutándose como el usuario. No pude desconectar al usuario del administrador de tareas. Intenté restablecer el comando id de sesión y terminé congelando también. Tuve que terminar de iniciar sesión en una sesión diferente como administrador, eliminar la cuenta y volver a crear una nueva.


-1

¿Ha intentado cerrar la sesión del usuario del Administrador de servicios de escritorio remoto? Vaya a Herramientas administrativas -> Servicios de escritorio remoto -> Administrador de servicios de escritorio remoto y cierre la sesión. Puede funcionar


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.