Как завершить сессию пользователя на терминальном сервере

Обновлено 16.04.2019

User logoДобрый день! Уважаемые читатели и гости IT портала Pyatilistnik.org. Вчера я вас научил определять номер и ID сеанса пользователя на RDS ферме или терминальном сервере. Там я вам рассказывал, что это нужно в случаях, когда вам необходимо завершить сессию пользователя, по ряду причин, одна из таких, это просто ее зависание. После чего человек и подключиться не может заново и не может выйти из своего сеанса. Вы как администратор, должны уметь решать проблему с зависшими RDP сессиями, ниже я покажу свои методы и алгоритмы.

Описание проблемы

Есть RDS ферма из 15 хостов подключений на Windows Server 2012 R2. Сервера на то они и сервера, что работают постоянно. Если у вас на ферме не настроены тайм ауты времени беспрерывной работы, то пользователи могут неделями или месяцами висеть в авторизованных подключениях. Логично предположить, что это не очень хорошо и ведет к различным последствиям, одно из которых, это полное зависание сеанса, при котором человек не может подключиться к терминальному серверу и видит сообщение "Работает служба профилей пользователей" или еще вариант "Не удается завершить требуемую операцию", я уже не говорю про повреждение пользовательского профиля. В результате того, что RDS брокеры видят. что пользователь уже залогинен, они не дают ему переподключиться к другому Session Host серверу, даже если вы закроете на текущем новые подключения. Пока вы не сделаете выход пользователя из системы для этой сессии, она так и будет мешать. Давайте разбираться, как это делать.

Методы завершения сессии пользователя не терминале

Существует несколько методов позволяющие выкинуть пользователя с сервера.

  • Завершить сессию пользователя (Сделать log off) вы можете из оснастки управления RDS фермой
  • Разлогинить пользователя можно и на самом терминальном сервере из диспетчера задач
  • Выход пользователя можно выполнить из утилиты командной строки rwinsta
  • Утилита командной строки log off
  •  Утилита reset session
  • * Командлет Stop-TSSession

Как выкинуть пользователя из оснастки управления RDS

И так, у меня есть мой любимый, тестовый пользователь в Active Directory, по имени Барбоскин Геннадий Викторович. Предположим, что он зашел на терминальный стол и нам по причине зависания его сессии, нужно сделать ему выход. Первый метод, это использование оснастки по управлению RDS фермой, я вам рассказывал, как ее собирать. Открываем раздел с вашей коллекцией RDS фермы. В поисковом фильтре указываем логин или фамилию нужного сотрудника. В результате получаем хост, где он работает.

выход пользователя

Щелкаем по нему правым кликом. В контекстном меню будет пункт "Выйти", это и соответствует завершению сессии (Log off). Так же есть пункт "Отключиться", если выберите его, то пользователь будет выброшен с терминального сервера, но его сессия останется на нем, данная операция равносильна тому, если пользователь просто нажал в окне с названием терминального сервера крестик.

как выкинуть пользователя-03

После того, как вы выбрали пункт "Выйти", начнется корректное завершение сессии пользователя на RDS ферме. Сам пользователь увидит сообщение "Работает служба профилей пользователей" и у него закроется окно без ошибки.

Второй метод разлогинить пользователя на терминальном сервере

Второй метод, похож на первый, за исключением того, что нам необходимо залогиниться на нужный сервер, открыть оснастку "Диспетчер задач" и уже из него произвести выход пользователя. Сказано сделано, о том, как вам попадать на нужного участника RDS фермы я рассказывал. Далее щелкаем правым кликом по области пуска и из контекстного меню выбираем пункт "Диспетчер задач". Кстати, вызвать "Диспетчер задач" можно и через сочетание клавиш CTRL+SHIFT+ESC.

как выкинуть пользователя-04

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

Выход пользователя в диспетчере задач

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

Использование утилиты RWINSTA

Если вы попали в ситуацию, когда графические методы не позволяют вам произвести выход пользователя из системы, а это необходимо, то вам на помощь придут утилиты из командной строки. RWINSTA - это встроенная в Windows утилита, которая позволяет сбрасывать сессии, по ID и имени сеанса. Первым делом вам нужно вычислить или ID сессии или ее имя, я вам рассказывал, о всех известных мне методах. можете ознакомиться. Я выберу утилиту qwinsta. Пишем команду:

qwinsta | findstr barboskin.g (Локально)

или удаленно qwinsta /server:имя сервера | findstr barboskin.g

В моем примере имя сеанса rdp-tcp#172 и ее ID 515. Пишем команду:

rwinsta rdp-tcp#172 /server:localhost или rwinsta 515 /server:localhost

Использование утилиты RWINSTA

И в первом и во втором случае, пользователь будет разлогинен с данного сервера. Данную команду можно запускать удаленно, со своего рабочего места, главное, чтобы были права на log off. Данный метод меня ни раз выручал в моей практике, например случай с зависшей сессией на Windows Server 2016, где вместо логина пользователя было имя (4).

Как отключить пользователя через reset session

Завершить сессию пользователя можно и с помощью утилиты командной строки Reset Session. В текущем примере у моего Барбоскина Геннадия Викторовича имя сеанса rdp-tcp#16 с его ID 11. Данную утилиту можно применять как локально на самом терминальном сервере, так и на своей рабочей станции, тут так же есть ключ /server.

reset session rdp-tcp#16 или reset session 11

Как отключить пользователя через reset session

Подробнее про утилиту reset session вы можете почитать на сайте Microsoft - https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/reset-session

Как отключить пользователя через logoff

Разлогинить пользовательскую учетную запись и даже зависшую, можно и через утилиту командной строки "LogOff". В данном примере у Геннадия Барбоскина имя сессии rdp-tcp#43. В командной строке от имени администратора введите:

logoff rdp-tcp#43 /server:localhost (Имя сервера можно менять) или logoff 54 /server:localhost

Как отключить пользователя через logoff

Выход пользователя через командлет Stop-TSSession

Есть такой замечательный командлет Stop-TSSession. Посмотрим на сервере ID и имя сеанса, для этого в открытой оболочке PowerShell введите:

Get-TSSession | FT

В итоге я вижу, что у пользователя barboskin.g SessionID 3. Далее пишем

Stop-TSSession 3 или принудительно Stop-TSSession 3 -Force

Выход пользователя через командлет Stop-TSSession

Соглашаемся с тем, что будет производиться log off для данного пользователя. Проверяем, что сессия завершена. Можно вот таким простеньким скриптом из планировщика задач, разлогинивать сессии:

Import-Module PSTerminalServices
Get-TSSession -ComputerName SERVER_NAME -filter {$_.sessionID -ne 0 -AND $_.sessionID -ne 1 -AND $_.sessionID -ne 65536}| Stop-TSSession –Force

Выход пользователя через командлет Stop-TerminalSession

Данный командлет устанавливается отдельно, совместно с пакетом Pscx. Первым делом посмотрим локально или удаленно идентификаторы сессии пользователя, для которого мы хотим сделать log off. Выполняем команду:

Get-TerminalSession -ComputerName имя сервера

Get-TerminalSession

Нужный мне ID сеанса 427. Далее воспользуемся командлетом Stop-TerminalSession, чтобы выкинуть пользователя и завершить его сессию.

Stop-TerminalSession -ComputerName имя сервера -Id 427 -Force

Stop-TerminalSession

Как видите сессия 427 больше не существует, и у нас с помощью командлета Stop-TerminalSession получилось выкинуть пользователя из RDS сеанса. На этом у меня все. Остались вопросы, то пишите их в комментариях. С вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.

Автор - Сёмин Иван

12 Responses to Как завершить сессию пользователя на терминальном сервере

  1. Михаил:

    Спасибо, было интересно, но «Указанный модуль «psterminalservices» не был загружен, так как ни в одном из каталогов модулей не был обнаружен действительный файл модуля.»

  2. Иван Семин:

    Он доставляется отдельно

  3. Александр:

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

  4. Иван Семин:

    Вам подойдет Terminal Services Manager

  5. Aemnanino:

    Обстоятельно и актуально, спасибо большое!

  6. Андрей:

    Классная статья ! Спасибо за статью !
    Можно ли сделать командный файл (cmd скрипт) с большой кнопкой для юзера,
    чтобы корректно юзер мог закрывать сесию ?
    Напишите пожалуйста такой скрипт.
    Я думаю многим будет интересно.

  7. Den:

    Мне кажется, было бы полезным задавать время работы пользователей RDP равным рабочему времени. Странно, но в функционале настройки сессий я такого не нашел. Только ограничение по времени работы сессии, что конечно же не то.
    Скажем, рабочее время с 8 до 17, задать время работы с 7 до 19 и хватит. Есть мысли, как это сделать корректно? На ум приходит запуск по таймеру скрипта, которое добавит в 7 часов разрешение на вход группе удаленных пользователей, а в 19 запретит. Чтобы случайно не закрыть вход админу?

  8. Den:

    «Можно ли сделать командный файл (cmd скрипт) с большой кнопкой для юзера,
    чтобы корректно юзер мог закрывать сесию ?»
    1. Создайте ссылку на
    %windir%\system32\logoff.exe
    поместите на рабочий стол
    2. Выберите для неё значок
    3. Скопируйте готовое всем пользователям

  9. Дмитрий:

    Просьба подсказать как можно снять зависшие сессии с ситуации с RDS HA. Конфигурация — выделенный сервер с настроенным HA + 4 сервера RDS. При выключении одного из серверов в ферме из 4х RDS, пользователи которые находились на этом сервере не могут зайти на другие. При попытке сделать выход для пользователя в оснастке получаю ошибку «unable to disconnect session N». Помогает только перезагрузка сервера с HA либо возврат в строй сервера на которым были пользователи.

  10. Сергей:

    Подскажите, как можно снимать сессии сразу нескольких пользователей?
    Если у меня есть сервер, на нем около 30-50 сессий в состоянии отключено, как через PS или другой инструмент завершить?

  11. Иван Семин:

    например Terminal Services Manager

  12. Борис:

    Спасибо за информацию. Скажите, есть ли способ не «разлогинивать» пользователя, а обрывать подключение? Чтобы сессия сохранялась и окна оставались открытыми. По аналогии с закрытием «крестиком».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *