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

ИТ-аутсорсинг в Туле. Обслуживание 1С в Туле. Кассовые решения. Автоматизация торговли — Тула. Тел. 58-95-99

Автоматическое завершение сессии терминального сервера по имени пользователя

Автоматическое завершение сессии терминального сервера по имени пользователя

reset_sessionПролог На терминальном сервере Windows Server зарегистрировано 9 пользователей с именами user1..user9 , через rdp к ним подключаются терминалы на базе thinstation. Необходимо через командную строку, либо через задание по времени — выключать терминалы и завершать сессии по имени пользователя.
Хронология Существует команда logoff, но по некоторым параметрам она не подходит, воспользуемся командой reset session. Разница между ними такова
Цитата из саппорта микрософт:
«An administrator has the option to either reset or logoff existing Terminal Server sessions. The differences between these options are:
1. Logging off from a session will tell the session to log off normally. Applications will be closed. The user profile will be written. Application data could be lost, however.
2. Resetting a session frees it immediately. You lose all user profile changes. Applications are not terminated gracefully, and you lose data.»
Приблизительный смысл logoff выходит из сессии корректно с завершением приложений и пользовательских настроек, reset session напротив рвет сессию без сохранения данных. Тут как раз тот случай, когда приложение, запущенное в качестве оболочки, подвисает, и logoff будет ожидать его завершения по максимальному таймауту системы, а может и вовсе не завершиться. Reset session не понимает user name, справка windows дает следующую информацию:

C:\Users\User4\reset session /?
Сброс значений подсистем оборудования и программ сеанса в начальное состояние.
 
RESET SESSION {sessionname | sessionid} [/SERVER:servername] [/V]
 
  sessionname         Задает имя сеанса.
  sessionid           Задает сеанс с идентификатором ID.
  /SERVER:сервер    Сервер терминалов (по умолчанию текущий).
  /V                  Вывод подробной информации.

Решение проблемы сводится к определению sessionname или sessionid по username. Узнать полную информацию об открытых сессиях rdp можно командой query user:

C:\Documents and Settings\User4\query user
 ПОЛЬЗОВАТЕЛЬ          СЕАНС              ID  СТАТУС  БЕЗДЕЙСТВ. ВРЕМЯ ВХОДА
 user4                 rdp-tcp#27          1  Активно          .  18.01.2013 1:58
 user6                 rdp-tcp#22          2  Активно          .  18.01.2013 2:01
 user5                 rdp-tcp#23          3  Активно          .  18.01.2013 2:01
 user8                 rdp-tcp#20          5  Активно          .  18.01.2013 2:01
 user7                 rdp-tcp#19          8  Активно          .  18.01.2013 2:17
 user9                 rdp-tcp#21          4  Активно          .  18.01.2013 2:18
 user2                 rdp-tcp#26         10  Активно       6:36  18.01.2013 10:08
 user1                 rdp-tcp#25          6  Активно       6:40  18.01.2013 14:40
 user3                 rdp-tcp#31          7  Активно          7  19.01.2013 16:36

Но sessionname в данном контексте не совсем корректно, потому как, если сессию закрыть(именно закрыть, а не выйти), сессия останется висеть, но sessionname у неё не будет. На основании выше изложенного собран bat скрипт — ищет соотношение username во всех открытых на компьютере rdp сессиях и рвет искомую по id.
Ниже указан частный пример скрипта для перезагрузки станций thinstation зная ip и одновременном закрытии сессий на сервере терминалов.

set ident=%1
C:\"Program Files"\PuTTY\plink.exe -ssh root@192.168.1.%ident% -pw 111111 -m C:\reboot
set USER=user%ident%
for /f "tokens=1,2,3" %%i in ('query user') do (
if %%i==%USER% reset session %%k)

Вызов производится по части имени, которая передается bat файлу и части ip адреса,т.е. «new.bat 8» будет справедлив для имени пользователя User8 с ip адресом станции thinstation 192.168.1.8.
Универсальный скрипт для выкидывания пользователя по имени будет выглядеть так

set USER=%1
for /f "tokens=1,2,3" %%i in ('query user') do (
if %%i==%USER% reset session %%k)

2 комментария на “Автоматическое завершение сессии терминального сервера по имени пользователя”

  • Денис:

    Приветствую! у меня настроен аналогичный скрипт, который работал стабильно долгое время, а с недавних пор стал выдавать следующее сообщение:
    Если выполнить сброс сеанс, все пользователи, использующие этот протокол, будут отключены. Продолжить (Нет=N)?

    ОС Windows 2003 Server R2 SP2
    Скрипт запускается под админом.

    Если сталкивались с этой проблемой напишите плиз!

  • SS_:

    После сообщения обычно код ошибки, либо в логах ошибка. Возможно какое то ПО не дает сессии завершиться. Необходимо отслеживать что поменялось за последнее время: дополнительное ПО, замена сетевых интерфейсов или драйверов на них, установка обновлений ПО связанных с RDP или сетевыми драйверами. Возможно мешает KB971143.


Notice: Undefined variable: comment_form_default_fields in /var/www/blog.adminvtule.ru/wp-content/themes/black-with-orange/comments.php on line 24

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

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