用户从RDP Server Windows 2008断开连接时结束会话

我想先说我绝不是任何一种服务器pipe理员。 基本上我最了解电脑,所以现在我可以弄清楚。

我们公司有一个RDP服务器,5个用户可以远程连接。 它不是一个域控制器(没有活动目录)。

我的问题是,当用户从RDP会话断开,用户的会话将不会结束一段时间后结束。 我浏览了用户列表,并为每个想要结束的用户(在用户属性中的“会话”标签下)手动设置“结束断开连接的会话”字段为2小时。 然后,我结束了每个会话,以便重新连接到服务器时应用新的属性。 我也结束了重新启动服务器,以确保。

我这样做的原因是我需要除了一个以外的所有用户的会话在午夜结束。

我检查过的步骤:

我已经检查过,以确保RD会话主机configuration不覆盖用户的设置。 为此,我打开了服务器pipe理窗口,展开了“远程桌面服务”,点击了“RD会话主机configuration”,右键单击我的服务器并转到属性并查看“会话”选项卡。 “覆盖用户设置”字段全部未选中。

我还通过打开gpedit.msc,然后进入“计算机configuration\pipe理模板\ Windows组件\远程桌面服务\会话时间限制”并检查以确保没有configuration这些选项(未configuration)来检查“组策略”设置)。

从我的研究中,这些将是覆盖用户会话设置的两个设置。 但似乎还有其他的东西,用户可以无限期地停留在我的当前设置的“断开”状态。 如果我错过了什么,请指点正确的方向。

感谢您的任何input/帮助!

当您进入事件查看器并导航到: Applications and Services Logs – > Microsoft – > Windows – > TerminalServices-LocalSessionManager并打开Operational您将在Microsoft-Windows-TerminalServices-LocalSessionManager中find事件24,它将声明Remote Desktop Services: Session has been disconnected:

我们可以使用这个作为触发任务计划程序中的delayd任务来运行一个脚本来重置所有断开连接的用户并将结果logging在一个日志文件中供我们稍后调查。

在任务计划程序中创build任务,并configuration以下详细信息:

在这里输入图像说明

在这里输入图像说明

Edit ActionAdd arguments (optional):部分有这个在它:

  -ExecutionPolicy Bypass c:\scripts\disconnect.ps1 

您将不得不创build两个目录:
C:\脚本\
C:\日志\

然后在c:\ scripts中创build一个名为disconnect.ps1的文件,并添加如下内容:

disconnect.ps1:

  <# .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" $LogFile = "c:\Logs\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" 

每当用户会话结束并断开连接事件时,taskscheduler将等待2分钟nrun脚本,并重置/注销所有断开连接的用户。

希望这可以帮助你。