Não foi possível efetuar logoff, desconectar ou redefinir o usuário do servidor de terminal no ambiente de produção


19

Estou procurando algumas idéias sobre como desconectar, fazer logoff ou redefinir a sessão de um usuário em um Terminal Server 2008 (não é possível fazer login como usuário, pois está completamente bloqueado). Este é um ambiente de produção, portanto, a reinicialização do servidor ou a execução de algo em todo o sistema está fora de questão por enquanto. Algum truque do PowerShell para nos ajudar com isso?

Tentamos desconectar, desconectar o usuário e redefinir a sessão, além de eliminar os processos da sessão, diretamente do mesmo servidor de terminal (do gerenciador de tarefas, do Gerenciador de Serviços de Terminal e do Monitor de Recursos) sem resultados.

Socorro!


ATUALIZAÇÃO: Acabamos reiniciando o servidor como nenhuma outra tentativa que pudemos pensar funcionou. Deixarei essa pergunta em aberto, esperando que alguém possa ter mais informações sobre esse problema e suas possíveis correções.


2
Eu tenho exatamente o mesmo problema nos meus servidores de terminal do Windows 2008 R2 SP1. Eles são interrompidos aleatoriamente e os usuários não conseguem fazer logoff ou logon no servidor. Não consigo fazer logon localmente como administrador local ou administrador de domínio. A única maneira de conectar-se ao servidor é usando o compmgmt.msc, mas mesmo aqui não consigo ver nenhum problema nos logs de eventos. Em algum momento, recebo uma mensagem informando que o serviço IMA não está respondendo e o servidor foi removido do farm. A única maneira de resolver isso é reiniciar o servidor rígido. Desligue e ligue novamente. Eu não tenho sido capaz de diminuir a causa deste baixo para nada e eu



11
Ligações potencialmente úteis para qualquer um encontrar este problema indo para a frente
JohnLBevan

Respostas:


7

O que funcionou para mim para resolver esse mesmo problema foi eliminar todos os processos em execução na conta bloqueada no Gerenciador de Tarefas e, então, consegui simplesmente fazer logoff dessa conta (de uma conta de Administrador).

O usuário pôde fazer logon novamente na conta.

Nenhuma reinicialização era necessária e nenhum software de terceiros precisava ser baixado.


-Obrigado, me salvou de reiniciar o servidor! Realmente não queria expulsar todo mundo durante o dia de trabalho por causa de uma sessão presa.
MAW74656

É seguro matar esses processos? Meu usuário tem csrss.exe, dwm.exe, LoginUI.exe, e winlogon.exe. Pensei que matar winlogon.exeprovocaria uma BSOD ...
binki

6

Quero compartilhar como redefinir a conta sem a necessidade de reiniciar o servidor. Primeiro de tudo, você precisa ter acesso de administrador ao servidor. Eu uso a seguinte opção de logon: mstsc / v: servername / console / admin para acessar o servidor. Em seguida, no "Windows Taks Manager", vá para a guia Usuários e clique com o botão direito do mouse na conta que deseja "Logoff", selecione logoff. Isso deve liberar a sessão bloqueada usada por essa conta.


11
exceto que nem sempre. Além disso, o OP disse que já tentou isso.
BeowulfNode42

Para esse problema, o botão Sair no Gerenciador de tarefas → Usuários não faz nada.
binki

5

A resposta simples é executar um prompt de comando elevado e digite "Taskmgr" e, em seguida, permitirá que você faça o logoff das sessões na guia USUÁRIOS. Não funcionará sem estar na sessão elevada.


Testado e que a solução funcionou.
Overmind

11
Não para mim. Também não pode usar o gerenciador de tarefas como administrador para eliminar qualquer um dos processos do usuário.
BeowulfNode42

3

Você pode iniciar um cmd, fazer uma sessão de consulta , verificar o ID da sessão a ser eliminada e, em seguida, fazer uma sessão de redefinição . Por exemplo, se com a sessão de consulta você obtiver o nome da sessão rdp-tcp # 1 que você deseja matar, poderá executar a redefinição da sessão rdp-tcp # 1 e matá-la.


Obrigado, mas isso também não ajudou.
L0c0b0x

Quando executo reset session 9esse comando, simplesmente trava. Minha sessão continua a ter os quatro processos em execução sem aparecer para ser activo: crss.exe, dwm.exe, LogonUI.exe, e winlogon.exe. i.imgur.com/cFM62RA.png e query session 9saídas No User exists for 9.
binki

3

Suponho que o mesmo aconteceu hoje no meu Terminal Server Win2008R2. Os sintomas foram: 1. Ele me telefonou com a mensagem "'conectar' trava para sempre". Ele é apenas um usuário simples, então não posso esperar uma descrição detalhada do problema. 2. Tentei desconectar / redefinir a sessão (o que geralmente ajuda nesses casos) - não funcionou. A sessão ainda trava na lista com o status 'desconectado'. 3. Tentei matar todos os processos para esse usuário - não ajudou. A sessão persiste e se recusa a ser morta.

A solução foi - conectar-se como usuário (faça o login com suas credenciais, se você puder redefinir sua senha ou usar algum tipo de assistência remota para ver o que acontece no computador) e ver o que acontece na janela de logon. Ao conectar, cliquei no botão 'detalhes' do RDP Client - e aqui estava uma mensagem de erro dizendo que o winlogon fazia algo errado, estava esperando o usuário clicar nos botões 'repetir / ignorar / etc' e, já que é o onipotente winlogon que causou todo esse comportamento estranho.

ps Eu não encontrei nenhuma maneira de realmente forçar a matar uma sessão :(


Isso consertou para mim! Ele estava esperando o usuário optar por desconectar outro usuário ou clicar em cancelar. Apertei cancelar e agora o usuário que estava preso na guia Usuários do Gerenciador de Tarefas desapareceu. Obrigado!
binki

Esta era a minha situação quando este foi o problema: i.imgur.com/W6eO5wW.png i.imgur.com/EpPwyJc.png i.imgur.com/cFM62RA.png Além disso, estou usando o Windows Server 2016
binki

3

Acabamos de ter um problema semelhante com o servidor da Área de Trabalho Remota do Windows Server 2008 R2. A sessão do usuário mostrou "Ativo" ao analisar o RDS Manager, mas não exibiu o ID da sessão associado ou o dispositivo conectado (ambos estavam em branco).

Todos os truques acima não resolveram o problema. Ao conectar-se como usuário em questão, uma mensagem de erro retornava informando que o Terminal Server estava ocupado e para tentar novamente mais tarde ou entre em contato com o administrador.

Acabamos reiniciando o servidor também.


2

Eu tive o mesmo problema no Windows Server 2016. O usuário não pôde fazer login.

Então, tentei as seguintes etapas para desconectar a sessão órfã:

  1. na CLI, o qwinsta lista todas as sessões disponíveis, inativas e ativas, há uma sessão desconectada (chamada "getr." na captura de tela) sem um nome de usuário, mas um ID de sessão.

mostre sessões ativas e mate-as

  1. com o ID de sessão (7) de 1. Tentei encerrar esta sessão com a sessão de redefinição 7 (fyi: rwinsta é um alias para redefinir a sessão)

  2. funcionou por uma sessão, mas na próxima vez não teve efeito, então abri o gerenciador de tarefas e a guia do usuário. Lá, você encontra uma lista expansível atribuída a todos os usuários da área de trabalho remota - uma lista não tinha nome de usuário e mostrava apenas quatro tarefas em execução.

  3. Eu tentei o óbvio: desconectando o usuário. Sem nenhum efeito.

tentando fazer logoff do usuário

  1. Então, tentei terminar as 4 tarefas atribuídas a esse usuário. Tenha cuidado, porque algumas tarefas, principalmente a csrss.exe, quando eliminadas, também resultariam em uma reinicialização do sistema. Eu os ignorei e acabei de matar algumas tarefas óbvias de RDP.

Após a Etapa / Tente 4, até a última sessão travada foi interrompida e o usuário pôde fazer login novamente

  1. Se isso ainda não estiver funcionando, tente esta solução com outra pergunta : Quando você se conectar ao cliente RDP, clique no botão "detalhes". Você verá um erro e poderá clicar em tentar novamente ou ignorar .

Você pode ser mais específico sobre quais processos você matou e quais não matar? Eu acho que eu deveria pular winlogon.exe, mas estou inseguro sobre outros como LoginUI.exe, csrss.exe, e dwm.exe.
binki

Os sintomas da segunda sessão foram semelhantes aos meus e serverfault.com/a/176080/164429 . Você provavelmente poderia adicionar o “Connect” como uma etapa para tentar uma solução mais completa e talvez até evitar a necessidade de interromper os processos.
binki

@binki deveria ser "csrss.exe" - se você matar esse processo, o sistema será reiniciado.
nr

1

Pode valer a pena verificar se o usuário não possui uma caixa pop-up de credenciais escondida atrás da janela da área de trabalho remota com alt + tab.

Um colega de trabalho estava tendo o mesmo problema; não pôde fazer logoff ou redefinir, e todos os seus processos foram desligados manualmente. Quando tentei acessar o GUI do sistema que ele estava remotando, encontrei uma caixa de credenciais escondida atrás da sessão remota.


1

Eu teria a mesma situação: um Windows Server 2008 R2 com Serviços de Área de Trabalho Remota, conexão RDP configurada para fazer logoff de usuários após a sessão ficar inativa ou desconectada por 3 horas e ainda algumas sessões permanecerem bloqueadas. Tentei desconectá-los com o Remote Desktop Manager e o qwinsta / quser, sem êxito.

Aqui está como eu resolvi isso:

  1. Eu localizei o ID da sessão com qwinsta .
  2. Localizei o PID da winlogon.exesessão suspensa comquery process /ID:yourid .
  3. Eu matei o processo com taskkill /f /PID yourPID.

Caminho a percorrer. Caso contrário, gostaria de encontrar uma solução para que isso não aconteça.


1

O que funcionou para mim foi:

  • faça logon no servidor
  • gerenciador de tarefas aberto
  • procure o usuário na guia do usuário
  • clique com o botão direito do mouse, conecte, digite a senha do usuário, vi a tela 'Aguarde'
  • pressione alt-tab, que me desconectou do servidor e também desconectou o usuário

1

Eu tive esse problema com usuários bloqueados do aplicativo de área de trabalho remota. Eu escrevi esse script do Powershell para executar uma tarefa agendada para fazer logoff de usuários que se mostraram desconectados por mais de 2 minutos. A única edição necessária é o SERVERNAME que eu defini para excluir o Remote Desktop Broker Server; no entanto, você pode excluir qualquer servidor que desejar, ou nenhum.

Meu script foi escrito para o Windows Server 2012 R2, a propósito ...

O script faz o seguinte:

  • Obtém uma lista de todas as sessões de usuário da área de trabalho remota.
  • Ignora as sessões que não dizem "STATE_DISCONNECTED".
  • Ignora o Broker Server (ou qualquer outro servidor)
  • Ignora todas as sessões sem ID de sessão unificado
  • Ignora todas as sessões que não têm um tempo de desconexão
  • Para as sessões que possuem um horário de desconexão, ele verifica o horário atual e se a diferença de horário entre agora e o horário de desconexão for superior a X minutos (neste caso, 2), interrompe o processo de logon.
  • Ele também tenta emitir um comando de logoff (isso provavelmente falhará após a interrupção do processo do winlogon).

Funciona para mim! Espero que ajude outra pessoa! :)

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'
            }
         }
      }

Ou, se você preferir uma versão, poderá ver o que está acontecendo na tela:

 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

Crie um arquivo no bloco de notas e chame-o foundession.cmd. Coloque o comando Query Session / server: servername | encontre / i "% 1" e salve em um diretório. Crie outro arquivo chamado resetsession.cmd e coloque o comando Redefinir sessão% 1 / server:% 2 e salve.

Em um prompt de comando, vá para o diretório em que você salvou esses arquivos e digite o nome de usuário foundession (login do usuário que você está tentando encontrar). Pressione Enter e você deverá ver o login e a ID da sessão. Digite resetsession.cmd ID Servername e ele redefinirá essa sessão. Eu uso isso diariamente e é super rápido para encontrar usuários e redefinir suas sessões.


use as opções de formatação de texto para destacar comandos e habilitar a legibilidade. É uma boa resposta, mas por favor, edite-a.
Marco

Não há nenhum ponto de escrever arquivos em lote, quando os comandos são tão curto e você precisa passá-los argumentos de qualquer maneira
binki

1
  1. Localize o ID da sessão com qwinsta .
  2. Mate todos os processos da sessão taskkill /FI "SESSION eq 1" /F, assumindo que o ID da sessão que você deseja encerrar retornado de qwinsta seja 1.

Isso funcionou no Server 2012 Versão 6.2 Build 9200, eu esperaria que funcionasse em todas as versões do Windows.


1

Esse script do power-shell funcionou para mim e até fornece um bom arquivo de log. Eu peguei daqui. : Espero que isso ajude outra pessoa, pois as outras respostas tinham muitos pré-requisitos e ou não funcionaram para mim.

    # .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 usei esse script para fazer logoff e fechar todas as sessões "desconectadas". Temos alguns aplicativos de servidor de terminal com muitos usuários e licenças limitadas. As sessões desconectadas permaneceriam abertas por um período muito longo e, às vezes, permaneceriam abertas indefinidamente. Isso resultou em sessões não utilizadas que ocupariam algumas das licenças e outros usuários não poderiam se conectar como resultado.

  • Executo o script usando uma tarefa agendada para verificar e
    desconectar regularmente sessões em alguns dos meus servidores. Funciona de forma autônoma,
    sem nenhuma interação necessária.
  • Eu o uso nos sistemas operacionais Windows 2008 R2 Server e Windows 2012 R2 Server.
  • Ele fecha apenas as sessões que foram desconectadas.
  • Ele atualiza um arquivo 'log' com os usuários ou sessões que ele desconectou.

Você poderia explicar o que faz?
219 Konrad Gajewski

11
Olá Konrad, editei um pouco a resposta e espero que ela explique o que o script faz. Basicamente, o script fecha todas as sessões desconectadas que permanecem abertas depois que um usuário remoto se desconecta do servidor.
9953-div-37

0

Talvez ainda exista um processo em andamento, bloqueando o processo de logoff. Verifique os processos ainda em execução para o usuário afetado. Em seguida, mate o processo um por um para ver qual deles está causando o problema.

Verifique também a HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Runchave do Registro que apenas os processos necessários foram iniciados. Em 64 bits é HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run.


0

Você pode baixar a ferramenta " Process Explorer " da Microsoft e usá-la para resolver seu problema. Se você tiver os IDs de sessão, poderá encontrar seus respectivos processos. Se uma sessão do usuário estiver desconectada, você poderá interromper o processo com o Process Explorer.


0

Não exatamente o mesmo ambiente (temos 2012r2), mas reiniciar o serviço de gerenciamento de máquina virtual Hyper-V (VMMS) liberou a conexão para mim.


0

Você precisa clicar no processo e mostrar o processo de todos os usuários e, em seguida, poderá desconectar.

por que não criar uma política de sessão em Configuração de host de sessão de área de trabalho remota e desconectar ou sessão inativa após determinado intervalo.


0

Minha correção: em um servidor de rede diferente, eu me conectei ao servidor do problema por meio da ferramenta de gerenciamento do computador, em sessões abertas, cliquei com o botão direito do mouse e fechei todos os arquivos abertos, em seguida, consegui me conectar via mstsc


0

você sempre pode usar o PowerShell da sua máquina local e fazê-lo remotamente

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

Para tornar sua resposta ainda mais útil, seria útil fornecer uma explicação básica de como esse comando funciona. Nem todo mundo pode ter experiência suficiente com o PowerShell para entendê-lo. Obrigado por contribuir.
Eu digo Reinstate Monica

-1

Infelizmente. Minha sessão do usuário foi desconectada. O gerenciador de tarefas não mostrou nenhum processo em execução como usuário. Não consegui desconectar o usuário do gerenciador de tarefas. Tentei redefinir o comando id da sessão e acabei congelando também. Eu tive que terminar o login em uma sessão diferente como administrador, excluindo a conta e recriando uma nova.


-1

Você tentou fazer logoff do usuário no Remote Desktop Services Manager? Vá para Ferramentas administrativas -> Serviços de área de trabalho remota -> Gerenciador de serviços de área de trabalho remota e faça logoff da sessão. Isso pode funcionar.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.