web-dev-qa-db-fra.com

Impossible de se déconnecter, de se déconnecter ou de réinitialiser l'utilisateur du serveur Terminal Server dans l'environnement de production

Je suis à la recherche d'idées sur la façon de déconnecter, fermer la session ou réinitialiser la session d'un utilisateur dans un serveur Terminal Server 2008 (impossible de se connecter en tant qu'utilisateur car il est complètement verrouillé). Il s'agit d'un environnement de production, il n'est donc pas question pour l'instant de redémarrer le serveur ou de faire quelque chose à l'échelle du système. Des astuces Powershell pour nous aider?

Nous avons essayé de déconnecter, de déconnecter l'utilisateur et de réinitialiser la session, ainsi que de tuer les processus de la session également, directement à partir du même serveur Terminal Server (du gestionnaire de tâches, du Gestionnaire des services Terminal Server et du moniteur de ressources) sans résultat.

Aidez-moi!


MISE À JOUR: Nous avons fini par redémarrer le serveur car aucune autre tentative à laquelle nous pourrions penser n'a fonctionné. Je vais laisser cette question ouverte en espérant que quelqu'un pourrait avoir plus d'informations sur ce problème, et ses correctifs potentiels

19
l0c0b0x

Ce qui a fonctionné pour moi pour résoudre ce même problème a été de tuer tous les processus en cours d'exécution sous le compte verrouillé sous le Gestionnaire des tâches, puis j'ai pu simplement me déconnecter de ce compte (à partir d'un compte administrateur).

L'utilisateur a ensuite pu se reconnecter sous le compte.

Aucun redémarrage n'a été nécessaire et aucun logiciel tiers n'a dû être téléchargé.

7
laoslady

Je veux partager la façon dont je réinitialise le compte sans avoir besoin de redémarrer le serveur. Tout d'abord, vous devez avoir un accès administrateur au serveur. J'utilise l'option de connexion suivante: mstsc/v: nom_serveur /console/admin pour accéder au serveur. Ensuite, dans "Windows Taks Manager", accédez à l'onglet tilisateurs et procédez à un clic droit sur le compte que vous souhaitez "Fermer la session", sélectionnez Fermer la session. Cela devrait libérer la session verrouillée utilisée par ce compte.

6
James

La réponse simple consiste à exécuter une invite de commande élevée et à taper "Taskmgr", puis cela vous permettra de vous déconnecter des sessions sous l'onglet UTILISATEURS. Cela ne fonctionnera pas sans être dans la session élevée.

5
John N

Vous pouvez démarrer un cmd, faire une session de requête, vérifier l'id de la session à tuer, puis faire une réinitialiser la session. Par exemple, si avec session de requête vous obtenez que le nom de session rdp-tcp # 1 est celui que vous voulez tuer, alors vous pouvez exécuter réinitialiser la session rdp-tcp # 1 = et faites-le tuer.

3
grem

Nous venons de rencontrer un problème similaire avec notre serveur Bureau à distance Windows Server 2008 R2. La session utilisateur a montré "Actif" lors de la consultation de RDS Manager, mais n'a pas affiché l'ID de session associé ou le périphérique connecté (les deux étaient vides).

Toutes les astuces ci-dessus n'ont pas résolu le problème. Lors de la connexion en tant qu'utilisateur en question, un message d'erreur est revenu indiquant que le serveur Terminal Server était occupé et pour réessayer plus tard ou contacter l'administrateur.

Nous avons également redémarré le serveur.

3
AdmBorkBork

Je suppose que la même chose s'est produite aujourd'hui sur mon serveur Terminal Server Win2008R2. Les sympthoms étaient: 1. Il m'a téléphoné avec "le message" se reliant "se bloque pour toujours". C'est juste un simple utilisateur, donc je ne peux pas m'attendre à une description détaillée du problème. 2. Session de déconnexion/réinitialisation essayée (ce qui aide généralement dans ces cas) - n'a pas fonctionné. La session se bloque toujours dans la liste avec le statut "déconnecté". 3. J'ai essayé de tuer tous les processus pour cet utilisateur - n'a pas aidé. La session persiste et refuse de se faire tuer.

La solution était - connectez-vous en tant qu'utilisateur (connectez-vous avec ses informations d'identification si vous pouvez réinitialiser son mot de passe ou utilisez une sorte d'assistance à distance pour voir ce qui se passe sur son ordinateur) et voir ce qui se passe dans la fenêtre de connexion. Lors de la connexion, j'ai cliqué sur le bouton `` Détails '' du client RDP - et le voilà, un message d'erreur indiquant que winlogon a fait quelque chose de mal, il attendait que l'utilisateur clique sur les boutons `` réessayer/ignorer/etc '' et puisque c'est le winlogon omnipotent qu'il a provoqué tout ce comportement bizarre.

p.s. Je n'ai trouvé aucun moyen de forcer vraiment une session à tuer :(

3
Andys

J'ai eu le même problème dans Windows Server 2016. L'utilisateur n'a pas pu se connecter.

J'ai donc essayé les étapes suivantes pour déconnecter la session orpheline:

  1. sur la CLI qwinsta répertorie toutes les sessions disponibles, inactives et actives, il y a une session déconnectée (appelée "getr." dans la capture d'écran) sans utilisateur nom, mais un identifiant de session.

afficher les sessions actives et les tuer

  1. avec l'identifiant de session (7) de 1. J'ai essayé de tuer cette session avec réinitialiser la session 7 (fyi: rwinsta est un alias pour la session de réinitialisation)

  2. cela a fonctionné pendant une session, mais la prochaine fois, cela n'a eu aucun effet, j'ai donc ouvert le gestionnaire de tâches et l'onglet utilisateur. Vous y trouverez une liste extensible attribuée à chaque utilisateur de bureau à distance - une liste n'avait pas de nom d'utilisateur et ne montrait que 4 tâches en cours d'exécution.

  3. J'ai essayé la plus évidente: déconnecter l'utilisateur. Sans aucun effet.

essayant de déconnecter l'utilisateur

  1. J'ai donc essayé de mettre fin à ces 4 tâches assignées à cet utilisateur. Soyez prudent, car certaines tâches, surtout csrss.exe, une fois tuées, entraîneraient également un redémarrage du système. Je les ai sautés et je viens de tuer des tâches RDP évidentes.

Après l'étape/essai 4, même la dernière session bloquée a été tuée et l'utilisateur a pu se reconnecter

  1. Si cela ne fonctionne toujours pas, essayez cette solution à partir de ne autre question : Lorsque vous vous connectez avec le client RDP, cliquez sur le bouton "Détails". Là, vous devriez voir une erreur et vous pouvez même cliquer sur réessayer ou ignorer.
2
n.r.

Créez un fichier dans le bloc-notes et appelez-le findession.cmd. Placez la commande Query Session/server: servername | recherchez/i "% 1" et enregistrez-le dans un répertoire. Créez un autre fichier appelé resetsession.cmd et exécutez la commande Réinitialiser la session% 1/serveur:% 2 et enregistrez.

À partir d'une invite de commande, accédez au répertoire dans lequel vous avez enregistré ces fichiers et tapez nom d'utilisateur findessions (connexion de l'utilisateur que vous essayez de trouver). Appuyez sur Entrée et vous devriez voir l'identifiant de connexion et de session. Tapez resetsession.cmd ID Servername et il réinitialisera cette session. J'utilise cela quotidiennement et c'est super rapide pour trouver des utilisateurs et réinitialiser leurs sessions.

1
Sysadmin

J'ai rencontré ce problème avec les utilisateurs verrouillés de l'application Bureau à distance. J'ai écrit ce script Powershell pour qu'il s'exécute sur une tâche planifiée pour déconnecter les utilisateurs qui se sont montrés déconnectés pendant plus de 2 minutes. La seule modification requise est le NOM_SERVEUR que j'ai défini pour exclure le serveur Remote Desktop Broker, cependant vous pouvez exclure n'importe quel serveur que vous aimez, ou aucun du tout .

Soit dit en passant, mon script a été écrit pour Windows Server 2012 R2 ...

Le script fait ceci:

  • Obtient une liste de toutes les sessions utilisateur du Bureau à distance.
  • Ignore toutes les sessions qui ne disent pas "STATE_DISCONNECTED".
  • Ignore le serveur Broker (ou tout autre serveur)
  • Ignore toutes les sessions sans ID de session unifiée
  • Ignore toutes les sessions qui n'ont pas de temps de déconnexion
  • Pour les sessions qui ont une heure de déconnexion, il vérifie l'heure actuelle et si la différence de temps entre maintenant et l'heure de déconnexion est supérieure à X minutes (dans ce cas 2), tue le processus winlogon.
  • Il tente également d'émettre une commande de déconnexion (cela échouera très probablement après la fin du processus Winlogon).

Ça marche pour moi! J'espère que ça aide quelqu'un d'autre! :)

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 si vous préférez une version que vous pouvez voir ce qui se passe à l'écran:

 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

Il peut être utile de vérifier que l'utilisateur n'a pas de boîte de dialogue d'informations d'identification cachée derrière la fenêtre du bureau distant avec alt + tab.

Un collègue avait le même problème; n'a pas pu se déconnecter ou se réinitialiser, et tous ses processus ont été arrêtés manuellement. Lorsque j'ai essayé d'accéder à l'interface graphique du système à partir duquel il se connectait, j'ai trouvé une boîte d'informations d'identification se cachant derrière la session distante.

1
Kutrayn
  1. Localisez l'ID de session avec qwinsta.
  2. Tuez tous les processus de la session taskkill /FI "SESSION eq 1" /F, en supposant que l'ID de session que vous souhaitez terminer renvoyé par qwinsta était 1.

Cela a fonctionné sur Server 2012 version 6.2 Build 9200, je m'attendrais à ce qu'il fonctionne sur toutes les versions de Windows.

1
Will

J'aurais la même situation: un Windows Server 2008 R2 avec les services Bureau à distance, une connexion RDP configurée pour déconnecter les utilisateurs après que la session est inactive ou déconnectée 3 heures, et certaines sessions restent verrouillées. J'ai essayé de les déconnecter avec Remote Desktop Manager et qwinsta/quser, sans succès.

Voici comment je l'ai résolu:

  1. J'ai localisé l'ID de session avec qwinsta.
  2. J'ai localisé le PID de winlogon.exe pour la session bloquée avec query process /ID:yourid.
  3. J'ai tué le processus avec taskkill /f /PID yourPID.

Marche à suivre. J'aimerais autrement trouver une solution pour que cela ne se produise pas.

1
curropar

Ce qui a fonctionné pour moi, c'est:

  • connectez-vous au serveur
  • ouvrir le gestionnaire de tâches
  • recherchez l'utilisateur dans l'onglet utilisateur
  • faites un clic droit, connectez-vous, entrez le mot de passe de l'utilisateur, j'ai vu un écran "Veuillez patienter"
  • appuyez sur alt-tab, qui m'a déconnecté du serveur et déconnecté l'utilisateur aussi
1
PhDJ

Ce script Power-Shell a fonctionné pour moi, il donne même un joli fichier journal. Je l'ai obtenu de ici. : J'espère que cela aidera quelqu'un d'autre car les autres réponses avaient beaucoup de prérequis et ou ne fonctionnaient pas pour moi.

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

Modifier:
J'ai initialement utilisé ce script pour fermer la session et fermer toutes les sessions "déconnectées". Nous avons quelques applications de serveur terminal avec de nombreux utilisateurs et des licences limitées. Les sessions déconnectées resteraient ouvertes très longtemps et parfois elles resteraient ouvertes indéfiniment. Cela a entraîné des sessions inutilisées qui occuperaient certaines des licences et les autres utilisateurs ne pourraient alors pas se connecter.

  • J'exécute le script à l'aide d'une tâche planifiée pour vérifier régulièrement et
    déconnectez les sessions sur certains de mes serveurs. Il fonctionne de manière autonome
    sans aucune interaction nécessaire.
  • Je l'utilise sur les systèmes d'exploitation Windows 2008 R2 Server et Windows 2012 R2 Server.
  • Il ferme uniquement les sessions qui étaient déconnectées.
  • Il met à jour un fichier "journal" avec les utilisateurs ou les sessions qu'il a déconnectés.
1
9953-div-37

Pas exactement le même environnement (nous avons 2012r2) mais le redémarrage du service de gestion de machine virtuelle Hyper-V (VMMS) a libéré la connexion pour moi.

0
user244946

vous pouvez toujours utiliser PowerShell à partir de votre machine locale et le faire à distance

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

Ma solution: sur un autre serveur réseau, je me suis connecté au serveur problématique via l'outil de gestion de l'ordinateur, dans les sessions ouvertes, j'ai cliqué avec le bouton droit et fermé chaque fichier ouvert, puis j'ai pu me connecter via mstsc

0
ITGal

Vous devez cliquer sur le processus et afficher le processus de tous les utilisateurs, puis vous pourrez vous déconnecter.

pourquoi ne pas créer une stratégie de session sous la session Bureau à distance La configuration de l'hôte met fin à la session déconnectée ou inactive après un certain intervalle.

0
DisplayName

Il y a peut-être un processus toujours en cours, bloquant le processus de déconnexion. Vérifiez les processus en cours d'exécution pour l'utilisateur concerné. Ensuite, tuez le processus un par un pour voir celui qui cause le problème.

Vérifiez également le HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run Clé de registre qui ne démarre que les processus nécessaires. En 64 bits, c'est HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run.

0
quentin

Vous pouvez télécharger l'outil " Process Explorer " de Microsoft et l'utiliser pour résoudre votre problème. Si vous disposez des ID de session, vous pouvez trouver leurs processus respectifs. Ensuite, si une session utilisateur est déconnectée, vous pouvez tuer le processus avec Process Explorer.

0
Vikram Iyer