Назад | Перейти на главную страницу

Завершение сеанса при отключении пользователя от RDP Server Windows 2008

Я хотел бы начать с того, что я ни в коем случае не являюсь администратором сервера. По сути, я больше всего разбираюсь в компьютерах, так что теперь я должен в этом разобраться.

В нашей компании есть RDP-сервер, к которому удаленно подключаются 5 пользователей. Это не контроллер домена (без Active Directory).

Моя проблема в том, что когда пользователи отключаются от сеанса RDP, сеанс пользователя не заканчивается через установленное время. Я просмотрел список «Пользователи» и вручную установил в поле «Завершить отключенный сеанс» значение 2 часа для каждого пользователя, которого я хотел завершить (в «Свойствах пользователя» на вкладке «Сеансы»). Затем я заканчивал каждый сеанс, чтобы новые свойства применялись при повторном подключении к серверу. Я также перезагрузил сервер, чтобы быть уверенным.

Причина, по которой я это делаю, заключается в том, что мне нужно, чтобы все пользователи, кроме одного, завершили свои сеансы к полуночи.

Шаги, которые я проверил:

Я проверил, что конфигурация узла сеанса удаленных рабочих столов не переопределяет настройки пользователя. Для этого я открыл окно «Управление сервером», развернул «Службы удаленных рабочих столов», щелкнул «Конфигурация узла сеансов удаленных рабочих столов», щелкнул правой кнопкой мыши мой сервер, перешел в свойства и просмотрел вкладку «Сеансы». Все поля "Переопределить пользовательские настройки" были сняты.

Я также проверил параметр «Групповая политика», открыв gpedit.msc, затем перейдя в «Конфигурация компьютера \ Административные шаблоны \ Компоненты Windows \ Службы удаленных рабочих столов \ Ограничения времени сеанса» и проверив, что ни один из этих параметров не был настроен (не настроен ).

Согласно моему исследованию, это будут две настройки, которые переопределяют настройку сеанса пользователя. Но, похоже, есть кое-что еще, поскольку пользователь может оставаться в состоянии «Отключено» на неопределенный срок с моими текущими настройками. Если я что-то упустил, укажите мне правильное направление.

Спасибо за любой ввод / помощь!

Когда вы переходите в Просмотр событий и переходите к: Applications and Services Logs -> Microsoft -> Windows -> TerminalServices-LocalSessionManager и открыть Operational вы найдете событие 24 в Microsoft-Windows-TerminalServices-LocalSessionManager, в котором будет указано Remote Desktop Services: Session has been disconnected:

Мы можем использовать это как триггер для отложенной задачи в планировщике задач для запуска сценария, который сбрасывает всех отключенных пользователей и записывает результаты в файл журнала, чтобы мы могли изучить их позже.

Создайте задачу в планировщике заданий со следующими настройками:

В Edit Action упаковать Add arguments (optional): часть имеет это в нем:

    -ExecutionPolicy Bypass c:\scripts\disconnect.ps1  

Вам нужно будет создать два каталога:

c: \ scripts \
c: \ журналы \

Затем создайте файл с именем disconnect.ps1 в c: \ scripts и добавьте его содержимое, как показано ниже:

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"  

Всякий раз, когда пользовательский сеанс заканчивается и событие отключения регистрируется, планировщик задач будет ждать 2 минуты, затем запустить скрипт и сбросить / выйти из системы всех отключенных пользователей.

Надеюсь, это тебе поможет.