首先我要说的是,我绝不是任何类型的服务器管理员。基本上,我对计算机了解最多,所以现在我要弄清楚这一点。
我们公司有一台可供 5 位用户远程连接的 RDP 服务器。它不是域控制器(没有 Active Directory)。
我的问题是,当用户断开与 RDP 会话的连接时,用户的会话不会在设定的时间后结束。我查看了用户列表,并为每个要结束的用户手动将“结束断开连接的会话”字段设置为 2 小时(在“用户属性”的“会话”选项卡下)。然后我结束了每个会话,以便在重新连接到服务器时应用新属性。为了确保万无一失,我还重新启动了服务器。
我这样做的原因是我需要除一个用户之外的所有用户的会话在午夜前结束。
我检查过的步骤:
我已检查以确保 RD 会话主机配置不会覆盖用户的设置。为此,我打开了“服务器管理”窗口,展开“远程桌面服务”,单击“RD 会话主机配置”,右键单击我的服务器,转到属性并查看“会话”选项卡。“覆盖用户设置”字段均未选中。
我还通过打开 gpedit.msc 检查了“组策略”设置,然后转到“计算机配置\管理模板\Windows 组件\远程桌面服务\会话时间限制”并检查以确保没有配置任何选项(未配置)。
根据我的研究,这两个设置将覆盖用户会话设置。但似乎还有其他原因,因为用户可以在我当前的设置下无限期地处于“断开连接”状态。如果我错过了什么,请指出正确的方向。
谢谢您的任何意见/帮助!
答案1
当您进入事件查看器并导航到:Applications and Services Logs
-> Microsoft
-> Windows
->TerminalServices-LocalSessionManager
并打开时,Operational
您会在 Microsoft-Windows-TerminalServices-LocalSessionManager 中找到事件 24,它将显示Remote Desktop Services: Session has been disconnected:
我们可以将其用作任务计划程序中延迟任务的触发器,以运行重置所有断开连接的用户的脚本,并将结果记录在日志文件中,以供我们稍后调查。
在任务计划程序中创建任务并配置以下细节:
盒子Edit Action
里Add arguments (optional):
有这个:
-ExecutionPolicy Bypass c:\scripts\disconnect.ps1
您必须创建两个目录:
c:\脚本\
c:\日志\
然后在 c:\scripts 中创建一个名为 disconnect.ps1 的文件并添加以下内容:
断开连接.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"
每当用户会话结束并且记录断开连接事件时,任务调度程序将等待 2 分钟,然后运行脚本并重置/注销所有断开连接的用户。
希望这对你有帮助。