it-swarm.com.de

Terminalserverbenutzer in der Produktionsumgebung können nicht abgemeldet, getrennt oder zurückgesetzt werden

Ich suche nach Ideen, wie Sie die Sitzung eines Benutzers auf einem 2008 Terminal Server trennen, abmelden oder zurücksetzen können (ich kann mich auch nicht als Benutzer anmelden, da dieser vollständig gesperrt ist). Da es sich um eine Produktionsumgebung handelt, kommt ein Neustart des Servers oder systemweite Aktionen vorerst nicht in Frage. Irgendwelche Powershell-Tricks, die uns dabei helfen?

Wir haben versucht, die Verbindung zu trennen, den Benutzer abzumelden und zurückzusetzen sowie die Prozesse der Sitzung direkt vom selben Terminalserver (vom Task-Manager, Terminal Services Manager und Ressourcenmonitor) zu beenden, ohne Ergebnisse zu erzielen.

Hilfe!


PDATE: Am Ende haben wir den Server neu gestartet, da keine anderen Versuche, an die wir denken konnten, erfolgreich waren. Ich werde diese Frage offen lassen, in der Hoffnung, dass jemand mehr Informationen zu diesem einen Problem und den möglichen Korrekturen hat.

19
l0c0b0x

Um dieses Problem zu beheben, konnte ich alle Prozesse, die unter dem gesperrten Konto ausgeführt wurden, im Task-Manager abbrechen und dieses Konto dann einfach abmelden (von einem Administratorkonto).

Der Benutzer konnte sich dann unter dem Konto wieder anmelden.

Es war kein Neustart erforderlich und es musste keine Software von Drittanbietern heruntergeladen werden.

7
laoslady

Ich möchte mitteilen, wie ich das Konto zurückgesetzt habe, ohne den Server neu starten zu müssen. Zunächst müssen Sie Administratorzugriff auf den Server haben. Ich verwende die folgende Anmeldeoption: mstsc/v: Servername /console/admin, um auf den Server zuzugreifen. Gehen Sie dann im "Windows Taks Manager" zur Registerkarte Benutzer und klicken Sie mit der rechten Maustaste auf das Konto, für das Sie sich abmelden möchten. Wählen Sie dann Abmelden. Dadurch sollte die von diesem Konto verwendete gesperrte Sitzung freigegeben werden.

6
James

Die einfache Antwort besteht darin, eine Eingabeaufforderung mit erhöhten Rechten auszuführen und "Taskmgr" einzugeben. Anschließend können Sie die Sitzungen auf der Registerkarte USERS abmelden. Es wird nicht funktionieren, ohne in der erhöhten Sitzung zu sein.

5
John N

Sie können ein cmd starten, eine Abfragesitzung durchführen, die ID der abzubrechenden Sitzung überprüfen und dann eine Sitzung zurücksetzen durchführen. Wenn Sie beispielsweise mit Sitzung abfragen erhalten, dass der Sitzungsname rdp-tcp # 1 derjenige ist, den Sie beenden möchten, können Sie Sitzung rdp-tcp # 1 zurücksetzen ausführen und lass es töten.

3
grem

Wir hatten gerade ein ähnliches Problem mit unserem Windows Server 2008 R2-Remotedesktopserver. In der Benutzersitzung wurde beim Betrachten von RDS Manager "Aktiv" angezeigt, es wurde jedoch nicht die zugehörige Sitzungs-ID # oder das verbundene Gerät angezeigt (beide waren leer).

Alle oben genannten Tricks haben das Problem nicht behoben. Bei der Verbindung als fraglicher Benutzer wurde eine Fehlermeldung angezeigt, die besagte, dass der Terminalserver ausgelastet war, und um es später erneut zu versuchen oder den Administrator zu kontaktieren.

Wir haben auch den Server neu gestartet.

3
AdmBorkBork

Ich nehme an, dass das gleiche heute auf meinem Win2008R2-Terminalserver passiert ist. Die Symptome waren: 1. Er rief mich mit der Nachricht "Verbindung verbinden hängt nur für immer" an. Er ist nur ein einfacher Benutzer, daher kann ich keine detaillierte Problembeschreibung erwarten. 2. Versuchte Abmelden/Zurücksetzen der Sitzung (was normalerweise in diesen Fällen hilfreich ist) - hat nicht funktioniert. Die Sitzung hängt weiterhin in der Liste mit dem Status "Nicht verbunden". 3. Versucht, alle Prozesse für diesen Benutzer zu beenden - hat nicht geholfen. Die Sitzung bleibt bestehen und weigert sich, getötet zu werden.

Die Lösung bestand darin, sich als Benutzer zu verbinden (mit seinen Anmeldeinformationen anzumelden, wenn Sie sein Kennwort zurücksetzen oder mithilfe einer Remote-Hilfe sehen können, was auf seinem Computer passiert) und im Anmeldefenster zu sehen, was passiert. Beim Verbinden klickte ich auf die Schaltfläche "Details" des RDP-Clients - und hier war eine Fehlermeldung, dass winlogon etwas falsch gemacht hat. Es wartete darauf, dass der Benutzer auf die Schaltflächen "Wiederholen/Ignorieren/etc" klickte, und da es sich um die allmächtige Winlogon handelt, die es verursachte all dieses seltsame Verhalten.

p.s. Ich konnte keine Möglichkeit finden, eine Sitzung wirklich zu beenden :(

3
Andys

Ich hatte das gleiche Problem in Windows Server 2016. Der Benutzer konnte sich nicht anmelden.

Daher habe ich die folgenden Schritte ausgeführt, um die verwaiste Sitzung zu trennen:

  1. auf der CLI listet qwinsta alle verfügbaren Sitzungen auf, inaktive und aktive. Es gibt eine getrennte Sitzung (im Screenshot "getr." genannt) ohne Benutzer Name, aber eine Sitzungs-ID.

zeige aktive Sitzungen und töte sie

  1. mit der Sitzungs-ID (7) von 1. Ich habe versucht, diese Sitzung mit entweder Sitzung 7 zurückzusetzen (fyi: ) rwinsta ist ein Alias ​​für die Rücksetzsitzung)

  2. es funktionierte für eine Sitzung, aber das nächste Mal hatte es einfach keine Auswirkung, also öffnete ich den Task-Manager und die Registerkarte Benutzer. Dort finden Sie eine erweiterbare Liste, die jedem Remotedesktopbenutzer zugewiesen ist - eine Liste enthielt keinen Benutzernamen und zeigte nur 4 ausgeführte Aufgaben an.

  3. Ich habe das Offensichtliche versucht: Den Benutzer abmelden. Ohne Wirkung.

versucht den Benutzer abzumelden

  1. Also habe ich versucht, die 4 diesem Benutzer zugewiesenen Aufgaben zu beenden. Seien Sie vorsichtig, da einige Aufgaben, vor allem csrss.exe, beim Beenden auch zu einem Neustart des Systems führen würden. Ich habe sie übersprungen und nur einige offensichtliche RDP-Aufgaben erledigt.

Nach Schritt/Versuch 4 wurde sogar die letzte abgestürzte Sitzung beendet und der Benutzer konnte sich erneut anmelden

  1. Wenn dies immer noch nicht funktioniert, versuchen Sie diese Lösung von eine andere Frage : Wenn Sie eine Verbindung mit dem RDP-Client herstellen, klicken Sie auf die Schaltfläche "Details". Dort sollte ein Fehler angezeigt werden und Sie können sogar auf erneut versuchen oder ignorieren klicken.
2
n.r.

Erstellen Sie eine Datei im Editor und nennen Sie sie findession.cmd. Geben Sie den Befehl Abfragesitzung/Server ein: Servername | finde/i "% 1" und speichere in einem Verzeichnis. Erstellen Sie eine weitere Datei mit dem Namen resetsession.cmd, geben Sie den Befehl Sitzung% 1/Server zurücksetzen:% 2 ein und speichern Sie.

Gehen Sie über eine Eingabeaufforderung in das Verzeichnis, in dem Sie diese Dateien gespeichert haben, und geben Sie den Benutzernamen findession ein (Anmeldung des Benutzers, den Sie suchen). Drücken Sie die Eingabetaste und Sie sollten die Anmelde- und Sitzungs-ID sehen. Geben Sie resetsession.cmd ID Servername ein, und diese Sitzung wird zurückgesetzt. Ich benutze dies täglich und es ist super schnell, um Benutzer zu finden und ihre Sitzungen zurückzusetzen.

1
Sysadmin

Ich hatte dieses Problem mit gesperrten Benutzern der Remotedesktopanwendung. Ich habe dieses Powershell-Skript geschrieben, um es für eine geplante Aufgabe auszuführen und Benutzer abzumelden, die länger als 2 Minuten als nicht verbunden angezeigt wurden. Die einzige Änderung, die erforderlich ist, ist der SERVERNAME , den ich festgelegt habe, um den Remotedesktop-Broker-Server auszuschließen. Sie können jedoch jeden beliebigen oder gar keinen Server ausschließen .

Mein Skript wurde übrigens für Windows Server 2012 R2 geschrieben ...

Das Skript macht das:

  • Ruft eine Liste aller Remotedesktop-Benutzersitzungen ab.
  • Ignoriert alle Sitzungen, die nicht "STATE_DISCONNECTED" sagen.
  • Ignoriert den Broker-Server (oder einen anderen Server)
  • Ignoriert alle Sitzungen ohne einheitliche Sitzungs-ID
  • Ignoriert alle Sitzungen ohne Unterbrechungszeit
  • Bei Sitzungen mit einer Trennungszeit wird die aktuelle Zeit überprüft. Wenn der Zeitunterschied zwischen jetzt und der Trennzeit mehr als X Minuten beträgt (in diesem Fall 2), wird der Winlogon-Prozess abgebrochen.
  • Es wird auch versucht, einen Abmeldebefehl auszugeben (dies wird höchstwahrscheinlich fehlschlagen, nachdem der Winlogon-Prozess beendet wurde).

Für mich geht das! Ich hoffe es hilft jemand anderem! :) :)

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

Oder wenn Sie eine Version bevorzugen, mit der Sie sehen können, was auf dem Bildschirm passiert:

 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
Nullldata

Es kann sinnvoll sein, zu überprüfen, ob der Benutzer kein Popup-Fenster für Anmeldeinformationen hinter dem Remotedesktopfenster mit Alt + Tab versteckt hat.

Ein Mitarbeiter hatte das gleiche Problem; konnte sich nicht abmelden oder zurücksetzen, und alle seine Prozesse wurden manuell heruntergefahren. Als ich versuchte, auf die GUI für das System zuzugreifen, von dem er ein Remoting durchführte, fand ich eine Anmeldeinformationsbox, die sich hinter der Remote-Sitzung versteckte.

1
Kutrayn
  1. Suchen Sie die Sitzungs-ID mit qwinsta.
  2. Beenden Sie alle Prozesse unter der Sitzung taskkill /FI "SESSION eq 1" /F unter der Annahme, dass die von qwinsta zurückgegebene Sitzungs-ID 1 war.

Dies funktionierte unter Server 2012 Version 6.2 Build 9200. Ich würde erwarten, dass es unter allen Windows-Versionen funktioniert.

1
Will

Ich hätte die gleiche Situation: Ein Windows Server 2008 R2 mit Remotedesktopdiensten und einer RDP-Verbindung, die eingerichtet wurde, um Benutzer abzumelden, nachdem die Sitzung 3 Stunden lang inaktiv war oder die Verbindung getrennt wurde, und dennoch blieben einige Sitzungen gesperrt. Ich habe versucht, sie sowohl mit Remotedesktop-Manager als auch mit qwinsta/quser abzumelden, ohne Erfolg.

So habe ich es gelöst:

  1. Ich habe die Sitzungs-ID mit qwinsta gefunden.
  2. Ich habe die PID von winlogon.exe Für die blockierte Sitzung mit query process /ID:yourid Gefunden.
  3. Ich habe den Prozess mit taskkill /f /PID yourPID Abgebrochen.

Gut gemacht. Ich möchte sonst eine Lösung finden, damit dies nicht passiert.

1
curropar

Was für mich funktioniert hat war:

  • melden Sie sich auf dem Server an
  • task-Manager öffnen
  • suchen Sie auf der Registerkarte Benutzer nach dem Benutzer
  • klicken Sie mit der rechten Maustaste, verbinden Sie sich, geben Sie das Benutzerpasswort ein. Ich sah einen Bildschirm "Bitte warten"
  • drücken Sie die Alt-Tab-Taste, um mich vom Server abzumelden und den Benutzer abzumelden
1
PhDJ

Dieses Power-Shell-Skript hat bei mir funktioniert, es gibt sogar eine nette Protokolldatei. Ich habe es von hier. : Ich hoffe, dies wird jemand anderem helfen, da die anderen Antworten viele Voraussetzungen hatten und für mich nicht funktionierten.

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

Bearbeiten:
Ich habe dieses Skript ursprünglich verwendet, um mich abzumelden und alle "getrennten" Sitzungen zu schließen. Wir haben einige Terminalserveranwendungen mit vielen Benutzern und begrenzten Lizenzen. Die getrennten Sitzungen blieben sehr lange offen und manchmal auf unbestimmte Zeit. Dies führte zu nicht verwendeten Sitzungen, die einen Teil der Lizenzen beanspruchten, und andere Benutzer konnten dann keine Verbindung herstellen.

  • Ich führe das Skript mit einer geplanten Aufgabe aus, um und regelmäßig zu überprüfen
    Sitzungen auf einigen meiner Server trennen. Es funktioniert autonom
    ohne Interaktion erforderlich.
  • Ich verwende es unter Windows 2008 R2 Server- und Windows 2012 R2 Server-Betriebssystemen.
  • Es werden nur Sitzungen geschlossen, die nicht verbunden waren.
  • Es aktualisiert eine 'Protokoll'-Datei mit den Benutzern oder Sitzungen, die es getrennt hat.
1
9953-div-37

Nicht genau dieselbe Umgebung (wir haben 2012r2), aber der Neustart des Hyper-V-Verwaltungsdienstes für virtuelle Maschinen (VMMS) hat die Verbindung für mich freigegeben.

0
user244946

sie können jederzeit Powershell von Ihrem lokalen Computer aus verwenden und dies remote tun

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

Mein Fix: Auf einem anderen Netzwerkserver ist über das Computer Management Tool eine Verbindung zum Problemserver hergestellt. In offenen Sitzungen habe ich jede geöffnete Datei mit der rechten Maustaste angeklickt und geschlossen und konnte dann über mstsc eine Verbindung herstellen

0
ITGal

Sie müssen auf Prozess klicken und Prozess von allen Benutzern anzeigen, und dann können Sie die Verbindung trennen.

warum nicht eine Sitzungsrichtlinie unter Remotedesktopsitzung erstellen? Die Hostkonfiguration beendet die Verbindung getrennt oder ist nach einem bestimmten Intervall inaktiv.

0
DisplayName

Möglicherweise wird noch ein Prozess ausgeführt, der den Abmeldevorgang blockiert. Überprüfen Sie die noch laufenden Prozesse für den betroffenen Benutzer. Töte dann den Prozess nacheinander, um zu sehen, welche das Problem verursacht.

Überprüfen Sie auch die HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run Registrierungsschlüssel, für den nur Prozesse benötigt werden. In 64bit ist es HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run.

0
quentin

Sie können das Tool " Process Explorer " von Microsoft herunterladen und damit Ihr Problem lösen. Wenn Sie die Sitzungs-IDs haben, können Sie deren jeweilige Prozesse finden. Wenn eine Benutzersitzung getrennt wird, können Sie den Prozess mit Process Explorer beenden.

0
Vikram Iyer