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
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é.
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.
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.
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.
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.
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 :(
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:
afficher les sessions actives et les tuer
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)
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.
J'ai essayé la plus évidente: déconnecter l'utilisateur. Sans aucun effet.
essayant de déconnecter l'utilisateur
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
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.
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:
Ç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"
}
}
}
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.
qwinsta
.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.
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:
qwinsta
.winlogon.exe
pour la session bloquée avec query process /ID:yourid
.taskkill /f /PID yourPID
.Marche à suivre. J'aimerais autrement trouver une solution pour que cela ne se produise pas.
Ce qui a fonctionné pour moi, c'est:
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.
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.
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
}
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
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.
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
.
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.