Windows 2019 terminal server завершить все сеансы

Обновлено: 08.07.2024

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

И вот был написан скриптик, который по времени перед бекапом выкидывает пользователей.

Скрипт, кстати, во вложении (точнее, 3 скрипта: выкинуть всех, выкинуть активных и выкинуть отключенных).

Как это работает на примере скрипта, который выкидывает всех пользователей:

query user >user_temp_all.txt

2. Убираем из файла строку со словом “console”, так как консольного юзера не нужно выкидывать;

find "console" user_temp_all.txt > user_temp.txt /V

find "Активно" user_temp.txt > user.txt

4. Убиваем файл start.bat;

del start.bat

5. Вдруг никто не подключен, соответственно файл user.txt будет пустой, а файл скрипта нам нужен в любом случае, надо создать и написать что-то в файл, чтобы он смог запуститься;

@echo rem begin files start.bat>start.bat

6. Обработаем файл user.txt. Синтаксис команды for можно посмотреть по команде for /?, но расскажу по-быстрому: команда фор перебирает файл и разлаживает содержимое строки по переменным, ну и запускает для каждой строки команду, разберем начало for /f "skip=2 tokens=3," %%i

for в принципе сама команда, ключ /F означает перебрать и выполнить команду для каждой строки

параметр skip=2 означает, что пропустим 2-е первые строчки

параметр tokens=3 означает, что берем в строке 3-е значение, разделенное пробелами или «,» или «таб.» и помещаем его в переменную %%i

Разберем следующий кусок in (user.txt) DO echo logoff %%i >>start.bat

In (user.txt) означает, что перебираем файл user.txt

DO echo logoff %%i>>start.bat выполнить команду echo logoff %%i (сюда подставляется ид сеанса или значение переменной %%i) и результат добавить к файлу start.bat, команда эхо просто выводит в поток то, что написано после этого слова

7. Первый этап закончили, теперь нужно обработать неактивные сессии, допишем в файл start.bat строчку «echo rem NoAction session» просто чтобы видеть где закончился 1-й этап скрипта, так как файл start.bat не удаляется, то можно посмотреть что в нем было после запуска;

@echo rem NoAction session >>start.bat

8. Принцип второго этапа аналогичный первому, теперь в файле с сессиями ищем строки со словом «Диск», это те сеансы, которые отключены;

find "Диск" user_temp.txt>user.txt

  1. А вот теперь почему делали в два этапа. Просто файл сессий имеет следующий вид

Файл сессий

И, как видно, из файла строка со статусом «Диск» не имеет Имя сеанса и соответственно в отключенном сеансе ID сеанса является 2-й переменной, если пробел считать разделителем, а при активном сеансе она является 3-й переменной, поэтому в первом этапе параметр tokens=3, а во втором этапе tokens=2, вот поэтому скрипт разбил на 2 части

for /f "skip=2 tokens=2," %%i in (user.txt) DO echo logoff ID %%i >>start.bat

9. Теперь убиваем лишние файлы

del user_temp.txt

del user.txt

10. Запускаем наш батник, который у нас получился, и результат работы выводим в файл log_logoff.txt

start.bat > log_logoff.txt

З.Ы.: почему не убили все файлы? чтобы видеть, какие вообще были сеансы после запуска скрипта.

date

25.05.2020

directory

Windows 10, Windows Server 2016

comments

комментариев 11

По-умолчанию, когда пользователь со своего компьютера закрывает окно своей RDP/RDS сессией в терминальном клиенте (mstsc, rdcman или rdp html web клиент) простым нажатием по крестику в окне, без выполнения выхода (logoff), его сессия переходит в режим disconnected (разъединённый сеанс). В этом режиме все запущенные пользователем программы, открытые документы и окна продолжают работать на удаленном сервере и потреблять ресурсы.

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

На следующем скриншоте видно, что отключенные сессии пользователей на RDS сервере с Windows Server 2016 используют около 35% памяти сервера. Кроме того незавершенные сессии могут блокировать открытые файлы на файловых серверах, вызывать проблемы с корректным сохранением данных в приложениях, профилях или User Profile Disks.

disconnected сесии не отключаются на rds/rdp сервере

С помощью команды quser можно узнать, когда начата RDP сессия пользователя, длительность простоя и статус сессии.

quser - длительность rdp сеансов, простоя rdp сессий

Для автоматического завершения отключенных RDP/RDS сессий через определенный промежуток времени, вам нужно правильно настроить лимиты (таймауты).

При использовании RDS сервера, вы можете настроить параметры таймаутов сессий в настройках RDS коллекций на вкладке Session.

Укажите время, через которое нужно завершить отключенный сеанс в параметре End a disconnected session (по умолчанию срок сеанса неограничен – never). Также вы можете выставить максимальную длительность активной RDP сессии (Active session limit) и отключение бездействующего сеанса (Idle session limit). Это жесткие таймауты применяются для всех сессий в RDS коллекции.

настройка таймаутов сесий и параметров переподключения на rd session host

настройки макс. длительности сессий в свойствах пользователя

Не стоит делать таймауты на время RDP сеанса слишком маленькими, иначе сеансы пользователей будут завершаться при малейшей неактивности.

В Windows Server 2012 R2/2016/2019 можно настроить таймауты RDP сессий с помощью групповых политик. Можно использовать как редактор доменных GPO gpmc.msc, так и редактор локальных групповых политик (gpedit.msc) на конкретном RDS сервере или клиенте (если вы используете десктопную Windows в качестве терминального сервера)

Параметры таймаутов RDP сессий находятся в разделе GPO

Computer Configuration -> Policies -> Administrative Templates -> Windows Components -> Remote Desktop Services -> Remote Desktop Session Host -> Session Time Limits (Конфигурация компьютера -> Политики -> Административные шаблоны -> Компоненты Windows -> Службы удаленных рабочих столов -> Узел сеансов удаленных рабочих столов -> Ограничение сеансов по времени). Доступны следующие политики таймаутов:

  • Set time limit for disconnected session (Задать ограничение по времени для отключенных сеансов)
  • Set time limit for active but idle Remote Desktop Services sessions (Задать ограничение времени для активных, но бездействующих сеансов служб удаленных рабочих столов) – политика позволяет завершить простаивающие RDP сессии, в которых отсутствует ввод со стороны пользователя (движение мышкой, ввод символов с клавиатуры)
  • Set time limit for active Remote Desktop Services sessions (Задать ограничение по времени для активных сеансов служб удаленных рабочих столов) – максимальный срок для любой (даже активной) RDP сессии пользователя, после которого она переводится в состояние disconnected;
  • End Session when time limits are reached (Завершать сеанс при достижении ограничения по времени) – через какое время нужно завершать RDS сессию (logoff) вместо перевода ее в disconnected;
  • Set time limit for logoff of RemoteApp sessions (Задать предел для выхода из сеансов RemoteApp)
Аналогичные настройки по управлению таймаутами RDP есть в секции GPO с настройками пользователи: User Configuration -> Administrative Templates -> Windows Components. С помощью политики из пользовательской секции вы сможете более гибко настроить группы пользователей с различными лимитами на длительность RDP сессий.

политики ограничения времени rdp сеансов по времени

По умолчанию эти параметры не настроены. Чтобы автоматически завершать отключенные RDP сеансы пользователей через 8 часов, включите политику “Set time limit for disconnected session” = Enabled, и в выпадающем списке выберите 8 часов.

политика Set time limit for disconnected session

Сохраните изменения и обновите политики сервера (gpupdate /force). Новые настройки таймаутов будут применяться только к новым RDP сеансам, текущие сеансы придется завершить вручную.

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

отключить сеансы пользователей сервер

Как отключить сеансы неактивных пользователей?

Увидеть сеансы пользователей, вы можете из под своей администраторской учетной записи, на сервере, вызвав "Диспетчер задач" в Windows, и перейдя в вкладку "Пользователи",
выберите пользователя, которого желаете отсоединить от сервера, и нажмите пункт меню "Выйти". Сеанс пользователя будет завершен с закрытием всех открытых у пользователя приложений.

диспетчер задач windows

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

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

удалить сеансы пользователей через диспетчер задач

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

Так же необходимо пояснить пользователям, что грамотным завершением сеанса в конце рабочего дня, является использование кнопки "Завершить сеанс" в меню ПУСК, операционной системы Windows, вашего терминального сервера. При таком завершении сеанса, неизбежно закрываются все программы и предлагается сохранить все данные.

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

Полезные команды cmd, powershell, администрирование, фичи и решения проблем на win/winserver

Рассмотрим такие команды как:

  • query
  • qwinsta (query session)
  • quser (query user)
  • mstsc (RDS shadow)
  • msg
  • change logon
  • shutdown

query

process | session | termserver | user

Более подробно здесь рассмотрятся команды:

а точнее их более короткие аналоги: qwinsta и quser

qwinsta

С помощью этой команды можно узнать, активен ли сеанс пользователя и ID сеанса


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

Ключ /server позволит указать другой сервер:

Показать информацию о сеансе конкретного пользователя:

Также можно узнать информацию о сеансе пользователя на другом сервере:

Остальные параметры и подробная справка по команде:

quser


В остальном, все ключи у возможности, такие же как и у команды qwinsta:

Ключ /server позволит указать другой сервер:

Показать информацию о конкретном пользователе:

Показать информацию о конкретном пользователе на другом сервере:

Справка и все функции:

RDS shadow (mstsc)

Для того, чтобы узнать ID сеанса, нужно воспользоваться одной из вышеупомянутых команд: qwinsta или quser

Теневое подключение без возможности управления сеансом (только просмотр):

Теневое подключение для управления другим сеансом:

ключ /v:servername позволит подключиться к сеансам другого сервера:

ID сеанса можно узнать с помощью уже рассмотренных команд qwinsta или quser


change logon

Полностью отключить вход в терминальные сессии можно командой:

Все возможные ключи смотрим в справке:

shutdown


Так, например, команда shutdown со следующими параметрами:


Удаленно перезагрузить или выключить компьютер или группу компьютеров через GUI можно командой

Читайте также: