Impossibile disconnettere, disconnettere o ripristinare l'utente del Terminal Server nell'ambiente di produzione


19

Sto cercando alcune idee su come disconnettersi, disconnettersi o reimpostare la sessione di un utente in un Terminal Server 2008 (impossibile accedere come utente in quanto è completamente bloccato). Questo è un ambiente di produzione, quindi riavviare il server o fare qualcosa a livello di sistema è fuori discussione per ora. Qualche trucco di Powershell per aiutarci in questo?

Abbiamo cercato di disconnettersi, disconnettere l'utente e reimpostare la sessione e anche di uccidere i processi della sessione, direttamente dallo stesso Terminal Server (dal Task Manager, dal Terminal Services Manager e dal Resource Monitor) senza risultati.

Aiuto!


AGGIORNAMENTO: Alla fine abbiamo riavviato il server poiché nessun altro tentativo a cui potessimo pensare ha funzionato. Lascerò aperta questa domanda sperando che qualcuno possa avere maggiori informazioni su questo problema, ed è potenziali correzioni


2
Ho lo stesso identico problema sui miei server terminal Windows 2008 SP1 SP1. Si bloccano in modo casuale e gli utenti non sono in grado di disconnettersi o accedere al server. Non riesco ad accedere localmente come amministratore locale o amministratore di dominio. L'unico modo per connettersi al server è utilizzare compmgmt.msc ma anche qui non riesco a vedere alcun problema nei registri degli eventi. Ad un certo punto ricevo un messaggio che dice che il servizio IMA non risponde e che il server è stato rimosso dalla farm. L'unico modo per risolverlo è riavviare il server Hard. Spegnere e riaccendere. Non sono stato in grado di restringere la causa a nulla e io



1
Link potenzialmente utili per chiunque si trovi ad affrontare questo problema in avanti
JohnLBevan il

Risposte:


7

Ciò che ha funzionato per me per risolvere questo stesso problema è stato annullare tutti i processi in esecuzione con l'account bloccato da Task Manager e quindi sono stato in grado di disconnettermi semplicemente da quell'account (da un account amministratore).

L'utente è stato quindi in grado di accedere nuovamente con l'account.

Non è stato necessario riavviare e non è stato necessario scaricare alcun software di terze parti.


-Grazie, mi ha salvato dal riavvio del server! Davvero non volevo buttare fuori tutti durante la giornata lavorativa a causa di una sessione bloccata.
MAW74656,

È sicuro uccidere questi processi? Il mio utente ha csrss.exe, dwm.exe, LoginUI.exe, e winlogon.exe. Pensavo che uccidere winlogon.exeavrebbe innescato un BSOD ...
binki,

6

Voglio condividere il modo in cui ho resettato l'account senza la necessità di riavviare il server. Prima di tutto devi avere l'accesso come amministratore al server. Uso la seguente opzione di accesso: mstsc / v: servername / console / admin per accedere al server. Quindi in "Windows Taks Manager", vai alla scheda Utenti e procedi con il tasto destro del mouse sull'account che desideri "Disconnetti", seleziona disconnettiti. Ciò dovrebbe liberare la sessione bloccata utilizzata da quell'account.


1
tranne che non sempre. Inoltre l'OP ha detto di aver già provato questo.
BeowulfNode42,

Per questo problema, il pulsante Esci in Task Manager → Utenti non fa nulla.
binki,

5

La semplice risposta è eseguire un prompt dei comandi con privilegi elevati e digitare "Taskmgr" e quindi ti permetterà di disconnettere le sessioni nella scheda USERS. Non funzionerà senza essere nella sessione elevata.


Testato e quella soluzione ha funzionato.
Overmind

1
Non per me. Inoltre, non è possibile utilizzare taskmanager come amministratore per uccidere nessuno dei processi dell'utente.
BeowulfNode42,

3

È possibile avviare un cmd, eseguire una sessione di query , verificare l'id della sessione da terminare e quindi eseguire una sessione di ripristino . Ad esempio, se con la sessione di query si ottiene che il nome della sessione rdp-tcp # 1 è quello che si desidera uccidere, è possibile eseguire il ripristino della sessione rdp-tcp # 1 e farlo uccidere.


Grazie, ma neanche questo ha aiutato.
l0c0b0x

Quando eseguo reset session 9quel comando si blocca e basta. La mia sessione continua ad avere i quattro processi in esecuzione senza apparire per essere attivi: crss.exe, dwm.exe, LogonUI.exe, e winlogon.exe. i.imgur.com/cFM62RA.png e query session 9output No User exists for 9.
binki,

3

Suppongo che lo stesso sia successo oggi sul mio Terminal Server Win2008R2. I sintomi erano: 1. Mi ha telefonato con "il messaggio di" collegamento "si blocca per sempre". È solo un semplice utente, quindi non posso aspettarmi una descrizione dettagliata del problema. 2. Tentativo di disconnessione / reimpostazione della sessione (che in genere aiuta in questi casi) - non ha funzionato. La sessione si blocca ancora nell'elenco con lo stato "disconnesso". 3. Ho provato a uccidere tutti i processi per quell'utente - non ha aiutato. La sessione persiste e si rifiuta di essere ucciso.

La soluzione era: connettiti come utente (accedi con le sue credenziali se puoi reimpostare la sua password o utilizzare un qualche tipo di assistenza remota per vedere cosa succede sul suo computer) e vedere cosa succede nella finestra di accesso. Durante la connessione ho fatto clic sul pulsante "Dettagli" del client RDP - ed eccolo qui, un messaggio di errore che winlogon ha fatto qualcosa di sbagliato, stava aspettando che l'utente facesse clic sui pulsanti "riprova / ignora / etc" e poiché era il winlogon onnipotente che ha causato tutto quel comportamento strano.

ps non sono riuscito a trovare alcun modo per forzare davvero a uccidere una sessione :(


Questo mi ha risolto! Stava aspettando che l'utente scegliesse di disconnettere un altro utente o premere Annulla. Ho premuto Annulla e ora quell'utente bloccato nella scheda Utenti di Task Manager è scomparso. Grazie!
binki,

Ecco come si presentava la mia situazione quando questo era il problema: i.imgur.com/W6eO5wW.png i.imgur.com/EpPwyJc.png i.imgur.com/cFM62RA.png Inoltre, sto usando Windows Server 2016
binki,

3

Abbiamo appena avuto un problema simile con il nostro server Desktop remoto Windows Server 2008 R2. La sessione utente ha mostrato "Attivo" quando si guardava RDS Manager, ma non aveva l'ID sessione associato o il dispositivo collegato visualizzato (entrambi erano vuoti).

Tutti i trucchi sopra non hanno risolto il problema. Durante la connessione come utente in questione, è tornato un messaggio di errore che indicava che Terminal Server era occupato e di riprovare più tardi o contattare l'amministratore.

Abbiamo terminato anche il riavvio del server.


2

Ho avuto lo stesso problema in Windows Server 2016. L'utente non è stato in grado di accedere.

Quindi ho provato i seguenti passaggi per disconnettere la sessione orfana:

  1. nella CLI qwinsta elenca tutte le sessioni disponibili, inattive e attive, c'è una sessione disconnessa (chiamata "getr." nella schermata) senza un nome utente, ma un ID sessione.

mostra sessioni attive e uccidile

  1. con ID sessione (7) da 1. Ho provato a terminare questa sessione con la sessione di ripristino 7 (a proposito : rwinsta è un alias per la sessione di ripristino)

  2. ha funzionato per una sessione, ma la volta successiva non ha avuto alcun effetto, quindi ho aperto il task manager e la scheda utente. Qui trovi un elenco espandibile assegnato a ogni utente del desktop remoto: un elenco non aveva un nome utente e mostrava solo 4 attività in esecuzione.

  3. Ho provato quello ovvio: disconnettersi dall'utente. Senza alcun effetto.

cercando di disconnettere l'utente

  1. Quindi ho provato a terminare quei 4 compiti assegnati a questo utente. Fai attenzione, perché alcune attività, soprattutto csrss.exe, quando vengono uccise, comporterebbero anche un riavvio del sistema. Li ho saltati e ho appena ucciso alcuni ovvi compiti RDP.

Dopo Step / Try 4 anche l'ultima sessione bloccata è stata interrotta e l'utente è stato in grado di accedere nuovamente

  1. Se il problema persiste, prova questa soluzione da un'altra domanda : quando ti connetti con il client RDP, fai clic sul relativo pulsante "dettagli". Lì dovresti vedere un errore e puoi anche fare clic su Riprova o Ignora .

Puoi essere più specifico su quali processi hai ucciso e quali non uccidere? Penso che dovrei saltare winlogon.exe, ma sono sicuro di altri come LoginUI.exe, csrss.exee dwm.exe.
binki,

I sintomi della seconda sessione hanno avuto un suono simile al mio e serverfault.com/a/176080/164429 . Probabilmente potresti aggiungere "Connetti" come passaggio per cercare una soluzione più completa e forse anche evitare di dover interrompere i processi.
binki,

@binki dovrebbe essere "csrss.exe" - se si interrompe questo processo, il sistema si riavvierà.
n.

1

Potrebbe valere la pena verificare che l'utente non abbia una finestra pop-up di credenziali nascosta dietro la finestra del desktop remoto con alt + tab.

Un collega stava avendo lo stesso problema; impossibile disconnettersi o reimpostare e tutti i suoi processi sono stati chiusi manualmente. Quando ho provato ad accedere alla GUI per il sistema da cui stava remotando DA, ho trovato una finestra di credenziali nascosta dietro la sessione remota.


1

Avrei la stessa situazione: un Windows Server 2008 R2 con Servizi Desktop remoto, connessione RDP impostata per disconnettere gli utenti dopo 3 ore di inattività o disconnessione della sessione e alcune sessioni sono rimaste bloccate. Ho provato a disconnetterli con Remote Desktop Manager e qwinsta / quser, senza successo.

Ecco come l'ho risolto:

  1. Ho individuato l'ID sessione con qwinsta.
  2. Ho individuato il PID di winlogon.exeper la sessione sospesa con query process /ID:yourid.
  3. Ho ucciso il processo con taskkill /f /PID yourPID.

Ben fatto. In caso contrario, vorrei trovare una soluzione affinché ciò non accada.


1

Ciò che ha funzionato per me è stato:

  • accedere al server
  • aprire task manager
  • cerca l'utente nella scheda utente
  • tasto destro del mouse, connettiti, inserisci la password utente, ho visto una schermata 'Please wait'
  • premi alt-tab, che mi ha disconnesso dal server e ha disconnesso anche l'utente

1

Ho riscontrato questo problema con gli utenti dell'applicazione Remote Desktop bloccata. Ho scritto questo script Powershell per l'esecuzione su un'attività pianificata per disconnettere gli utenti che sono stati mostrati come disconnessi per più di 2 minuti. L'unica modifica richiesta è il SERVERNAME che ho impostato per escludere il server di broker desktop remoto, tuttavia è possibile escludere qualsiasi server che ti piace, o nessuno.

Il mio script è stato scritto per Windows Server 2012 R2, a proposito ...

Lo script fa questo:

  • Ottiene un elenco di tutte le sessioni utente di Desktop remoto.
  • Ignora le sessioni che non indicano "STATE_DISCONNECTED".
  • Ignora il Broker Server (o qualsiasi altro server)
  • Ignora qualsiasi sessione senza ID sessione unificata
  • Ignora tutte le sessioni che non hanno un tempo di disconnessione
  • Per quelle sessioni che hanno un tempo di disconnessione, controlla l'ora corrente e se la differenza di tempo tra ora e il tempo di disconnessione è superiore a X minuti (in questo caso 2), termina il processo di winlogon.
  • Tenta anche di emettere un comando di disconnessione (molto probabilmente fallirà dopo che il processo di winlogon viene interrotto).

Per me funziona! Spero che aiuti qualcun altro! :)

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 se preferisci una versione che puoi vedere cosa sta succedendo sullo schermo:

 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 file nel blocco note e chiamalo findession.cmd. Inserire il comando Query Session / server: servername | trova / i "% 1" e salva in una directory. Crea un altro file chiamato resetsession.cmd e inserisci il comando Ripristina sessione% 1 / server:% 2 e salva.

Da un prompt dei comandi vai alla directory in cui hai salvato i file e digita username username (login dell'utente che stai cercando di trovare). Premi invio e dovresti vedere il login e l'ID sessione. Digita resetsession.cmd ID Servername e ripristinerà quella sessione. Lo uso quotidianamente ed è super veloce per trovare utenti e ripristinare le loro sessioni.


utilizzare le opzioni di formattazione del testo per evidenziare i comandi e potenziare la leggibilità. È una buona risposta, ma per favore, modificala.
Marco,

Non ha senso scrivere file batch quando i comandi sono così brevi e dovresti comunque passare loro degli argomenti
binki

1
  1. Individua l'ID sessione con qwinsta.
  2. Uccidi tutti i processi nella sessione taskkill /FI "SESSION eq 1" /F, supponendo che l'ID della sessione che desideri terminare restituito da qwinsta sia 1.

Questo ha funzionato su Server 2012 Versione 6.2 Build 9200, mi aspetto che funzioni su tutte le versioni di Windows.


1

Questo script power-shell ha funzionato per me, dà anche un bel file di registro. L'ho preso da qui. : Spero che questo possa aiutare qualcun altro poiché le altre risposte avevano molti prerequisiti e non funzionavano per me.

    # .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"  

Modifica:
originariamente ho usato questo script per disconnettermi e chiudere tutte le sessioni "disconnesse". Abbiamo un paio di applicazioni terminal server con molti utenti e licenze limitate. Le sessioni disconnesse rimarrebbero aperte per molto tempo e talvolta resterebbero aperte indefinitamente. Ciò ha comportato sessioni inutilizzate che avrebbero assorbito alcune delle licenze e di conseguenza altri utenti non sarebbero stati in grado di connettersi.

  • Eseguo lo script utilizzando un'attività pianificata per controllare e
    disconnettere regolarmente le sessioni su alcuni dei miei server. Funziona autonomamente
    senza alcuna interazione necessaria.
  • Lo uso sui sistemi operativi Windows 2008 R2 Server e Windows 2012 R2 Server.
  • Chiude solo le sessioni disconnesse.
  • Aggiorna un file "log" con gli utenti o le sessioni che ha disconnesso.

Potresti spiegare cosa fa?
Konrad Gajewski,

1
Ciao Konrad, ho modificato un po 'la risposta e spero che spieghi cosa fa lo script. Fondamentalmente lo script chiude tutte le sessioni disconnesse che rimangono aperte dopo che un utente remoto si è disconnesso dal server.
9953-div-37,

0

Forse c'è ancora un processo che blocca il processo di disconnessione. Controllare i processi ancora in esecuzione per l'utente interessato. Quindi uccidi il processo uno per uno per vedere che una strega sta causando il problema.

Controllare anche la HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Runchiave del Registro di sistema per avviare solo i processi necessari. A 64 bit lo è HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run.


0

Puoi scaricare lo strumento " Process Explorer " da Microsoft e utilizzarlo per risolvere il tuo problema. Se si dispone degli ID sessione, è possibile trovare i rispettivi processi. Quindi se una sessione utente viene disconnessa, è possibile interrompere il processo con Process Explorer.


0

Non esattamente lo stesso ambiente (abbiamo 2012r2) ma il riavvio del servizio Hyper-V Virtual Machine Management (VMMS) ha rilasciato la connessione per me.


0

È necessario fare clic su per elaborare e mostrare il processo da tutti gli utenti e quindi sarà possibile disconnettersi.

perché non creare un criterio di sessione in Configurazione della sessione dell'host della sessione del desktop remoto terminata disconnesso o sessione inattiva dopo un determinato intervallo.


0

La mia correzione: su un server di rete diverso mi sono collegato al server problematico tramite lo strumento Gestione computer, in sessioni aperte ho fatto clic con il pulsante destro del mouse e chiuso ogni file aperto, quindi sono stato in grado di connettersi tramite mstsc


0

puoi sempre usare PowerShell dal tuo computer locale e farlo da remoto

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

Per rendere la tua risposta ancora più utile, sarebbe utile fornire una spiegazione di base su come funziona questo comando. Non tutti possono avere abbastanza esperienza con PowerShell per capirlo. Grazie per aver contribuito.
Dico Reinstate Monica

-1

Sfortunatamente. La mia sessione utente è stata disconnessa. Il task manager non ha mostrato alcun processo in esecuzione come utente. Non è stato possibile disconnettere l'utente dal Task Manager. Ho provato a reimpostare il comando ID sessione e alla fine ho anche congelato. Ho dovuto finire il login in una sessione diversa come amministratore, eliminare l'account e ricrearne uno nuovo.


-1

Hai provato a disconnetterti dall'utente da Remote Desktop Services Manager? Andare su Strumenti di amministrazione -> Servizi Desktop remoto -> Gestione Servizi Desktop remoto e disconnettersi dalla sessione. Potrebbe funzionare


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.