我正在寻找一些关于如何断开,注销或重置2008terminal服务器中的用户会话的一些想法(无法以用户完全locking的方式login)。 这是一个生产环境,所以重新启动服务器或者在系统上做一些事情现在已经不存在了。 任何PowerShell技巧来帮助我们呢?
我们尝试断开连接,将用户closures并重置会话以及直接从相同的terminal服务器(从任务pipe理器,terminal服务pipe理器和资源监视器)直接终止会话的进程,而没有任何结果。
帮帮我!
更新:我们结束了重新启动服务器,因为没有其他的尝试,我们可以想到的工作。 我会留下这个问题,希望有人可能有更多关于这个问题的信息,这是潜在的修复
我想分享如何重置帐户,而无需重新启动服务器。 首先你需要有pipe理员对服务器的访问权限。 我使用以下login选项: mstsc / v: servername / console / admin为了访问服务器。 然后在“Windows Taks Manager”中,转到用户选项卡,然后在想要“注销”的帐户上单击鼠标右键,select注销。 这应该释放该帐户使用的locking的会话。
对我来说,解决这个问题的办法是从任务pipe理器中closures在locking帐户下运行的所有进程,然后我就可以简单地从pipe理员帐户注销该帐户。
用户然后能够在该帐户下重新login。
不需要重新启动,也不需要下载第三方软件。
简单的答案是运行提升的命令提示符并键入“Taskmgr”,然后它将允许您注销USERS选项卡下的会话。 没有进入高架会议将无法正常工作。
你可以开始一个cmd,做一个查询会话 ,检查会话的id被杀死,然后做一个重置会话 。 例如,如果使用查询会话 ,会话名称rdp-tcp#1是您想要终止的会话名称,则可以执行重置会话rdp-tcp#1并将其终止。
我想今天在我的Win2008R2terminal服务器上也是这样。 Sympthoms是:1.他用“连接”信息打电话给我,只是永远挂起。 他只是一个简单的用户,所以我不能指望详细的问题描述。 2.试图注销/重置会话(这通常有助于在这些情况下) – 没有工作。 会话仍挂在“断开”状态的列表中。 3.试图杀死该用户的所有进程 – 没有帮助。 会议依然存在,拒绝被杀。
解决方法是 – 以用户身份连接(如果可以重置密码或使用某种远程协助来查看计算机上发生的事情,请使用凭据login),然后查看login窗口中会发生什么情况。 当连接时,我点击RDP客户端的“详细信息”button – 这里是一个错误消息,winlogon做错了,它正在等待用户点击“重试/忽略/等”button,因为它是它所造成的万能的winlogon所有那些怪异的行为。
PS我找不到任何方法来真正强制杀死一个会话:(
我们刚刚与Windows Server 2008 R2远程桌面服务器有类似的问题。 用户会话在查看RDSpipe理器时显示为“活动”,但未显示关联的会话ID或连接的设备(均为空白)。
以上所有的技巧都没有解决问题。 以相关用户身份进行连接时,出现错误消息,指出terminal服务器正忙,稍后再试或联系pipe理员。
我们结束重启服务器。
可能值得检查的是,用户在远程桌面窗口后面没有隐藏凭据popup框,使用alt +选项卡。
同事有同样的问题; 无法注销或重置,并且他的所有进程都被手动closures。 当我尝试访问系统的远程访问gui时,我发现隐藏在远程会话后面的凭证框。
在记事本中创build一个文件,并将其命名为findsession.cmd。 放置命令Query Session / server: servername | find/我“%1”并保存到一个目录。 创build另一个名为resetsession.cmd的文件,并将命令Reset Session%1 / server:%2并保存。
从命令提示符转到您保存这些文件的目录,然后inputfindsession用户名(您正在尝试查找的用户的login名)。 按Enter键,你应该看到login和会话ID。 键入resetsession.cmd ID Servername,它将重置该会话。 我每天都在使用它,而且对于查找用户和重新设置会话来说,速度非常快。
qwinstafind会话ID。 taskkill /FI "SESSION eq 1" /F下的所有进程,假设您想要从qwinsta返回的会话ID为1。 这在Server 2012版本6.2 Build 9200上工作,我希望它可以在所有版本的Windows上工作。
也许有一个进程仍在运行,阻止注销过程。 检查受影响的用户仍在运行的进程。 然后一个一个杀死进程,看到一个人正在造成这个问题。
检查HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Runregistry项,只需要启动进程。 在64位是HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run 。
您可以从Microsoft下载“ Process Explorer ”工具,并使用它来解决您的问题。 如果你有会话ID,你可以find他们各自的进程。 然后,如果用户会话断开连接,则可以使用Process Explorer终止进程。
不完全相同的环境(我们有2012r2)但重新启动Hyper-V虚拟机pipe理服务(VMMS)为我发布连接。
我也会遇到同样的情况:Windows Server 2008 R2带有远程桌面服务,RDP连接在会话处于非活动状态或者断开连接3小时后设置为注销用户,还有一些会话保持locking状态。 我试图用远程桌面pipe理器和qwinsta / quser注销它们,但没有成功。
以下是我解决它的方法:
qwinsta的会话ID。 winlogon.exe的PID,用于query process /ID:yourid的挂起会话。 taskkill /f /PID yourPID杀死了进程。 去的路。 否则,我想find一个解决scheme,这不会发生。
对我有效的是:
您需要点击进程并显示来自所有用户的进程,然后才能断开连接。
为什么在远程桌面会话主机configuration结束断开连接或空闲会话之后,在一定的时间间隔之后不创build会话策略。
我的修复:在一个不同的networking服务器,我通过计算机pipe理工具连接到问题服务器,在打开的会话中,我右键单击并closures每个打开的文件,然后能够通过mstsc
我有locking远程桌面应用程序用户的这个问题。 我编写了这个Powershell脚本来运行一个计划任务,以注销显示为断开连接2分钟以上的用户。 唯一需要的编辑是我设置为排除远程桌面代理服务器的SERVERNAME ,但是您可以排除任何您喜欢的服务器,或者根本不排除任何服务器。
我的脚本是为Windows Server 2012 R2编写的,顺便说一下…
这个脚本是这样的:
它适合我! 我希望它能帮助别人! 🙂
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' } } }
或者,如果您更喜欢一个版本,您可以看到屏幕上正在发生的事情:
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" } } }
你总是可以使用本地机器的PowerShell,并远程执行
Invoke-command -computername <servername> -Credential (get-credential) { $session = ((quser | ? { $_ -match <username> }) -split ' +' )[2] logoff $session }
我在Windows Server 2016中遇到了同样的问题。用户无法login。
所以我尝试了以下步骤来断开孤立的会话:
显示活动会话并杀死他们
与会议ID(7)从1我试图杀死这个会话与重置会话7(rwinsta是重置会话的别名)
它工作了一个会话,但下一次它没有效果,所以我打开任务pipe理器和用户选项卡。 在那里,您可以find一个分配给每个远程桌面用户的可扩展列表 – 一个列表中没有用户名,只显示4个任务正在运行。
我试图明显的:注销用户。 没有任何影响。
试图注销用户
在Step / Try 4之后,即使最后一次崩溃的会话被终止,用户也能够再次login
这PowerShell脚本为我工作,它甚至给出了一个不错的日志文件。 我从这里得到它 :我希望这会帮助别人,因为其他答案有很多先决条件,或者不适合我。
<# .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"
不幸。 我的用户会话被断开。 任务pipe理器没有显示以用户身份运行的任何进程。 我无法将用户从任务pipe理器中注销。 我尝试重置会话id命令,并最终冻结了。 我必须以pipe理员的身份login另一个会话,删除该帐户并重新创build一个帐户。
您是否尝试从远程桌面服务pipe理器注销用户? 转到pipe理工具 – >远程桌面服务 – >远程桌面服务pipe理器并注销会话。 它可能工作。
去开始窗口,点击你的名字
在这里看到示例