Добрый день, коллеги.
Уверен, все мы регулярно испытываем потребность в принудительном завершении большого числа RDP-сеансов. Например, при обновлении баз или иных задач "технологического окна".
Во многих "современных" серверных операционных системах интерактивно сделать это или сложно, или вовсе невозможно, но всегда можно сделать это либо через командлет PowerShell, либо посредством скрипта пакетного Bat-файла.
Инфы на этот счёт много, тут мы ее приведем лаконично.
Как-то давно вспомнил про статью о теневом подключении к RDP-сеансам на сервере и используемые там команды.
https://winitpro.ru/index.php/2014/02/12/rds-shadow-v-windows-2012-r2/?ysclid=lfsi8xoecb632726287
Основа статьи это обращение к колонкам таблицы (токенам), возвращаемым командой "query session" и вычленении из нее ID и имен пользователей, которых необходимо разлогинить.
Подробно о "query session" можно почитать тут:
https://learn.microsoft.com/ru-ru/windows-server/administration/windows-commands/query-session
В "батнике" всё довольно просто:
(текстовый спойлер прилагаю, для хороших людей не жалко:), но будьте аккуратны с кодировкой при копировании)
Из, возможно, непонятных моментов отметим несколько инструкций:
EnableDelayedExpansion - означает возможность использовать символа "!" для доступа к представлению значения переменной (как то !переменная!).
Без инструкции "Setlocal EnableDelayedExpansion" в консоль просто выведутся восклицательный знак и имя переменной вместо ее значения.
Подпрограмма ReturnIDCurrentUser, вызываемая оператором Call, посредством регулярных выражений ищет цифры в переданном токене и возвращает 1, если в токене есть символы, отличные от цифр.
Сеансы без числового ID мы не завершаем ибо, скорее всего, это "sheduler task", а не интерактивный пользователь. Да они и не завершатся, выпадет ошибка.
"pause" впишем, чтобы не закрылось командное окно и можно было посмотреть, что происходило при исполнении пакетного файла.
Флаг /f служит для разбора содержимого таблицы "query session". Первая, вторая и третья подстроки из каждой строки (tokens=1,2,3) передаются в тело цикла "for". В мануале "for /f" трактуется так: FOR /F ["ключи"] %переменная IN ("строка") DO команда [параметры].
флаг "/b" обеспечивает выход из текущего пакетного скрипта вместо выхода из Cmd.exe. При выполнении извне пакетного скрипта завершает Cmd.exe.
В мануале так: exit [/b] [<exitcode>]
exitcode задает числовое число (да, да, прямо так написано в справке learn.microsoft.com). Если указан параметр /b , переменной среды ERRORLEVEL присваивается это число. Если вы завершаете работу интерпретатора команд, код выхода из процесса устанавливается в это число.
Собственно завершение сеансов осуществляется с помощью команды "logoff ID_пользователя".
С помощью оператора "neq" (не равно) обойдем пользователей с именами rdp-tcp#... (консоль), Администратор, Administrator (себя, в общем, чтобы не разлогинить САМОГО СЕБЯ).
Здесь повнимательнее, надо вписать сюда имя вашего пользователя (под которым вошли и сеанс которого не надо завершать).
Кодировка файла в моем случае OEM 866 (для создания bat-файла удобно использовать текстовый редактор Notepad++).
Всем удачи.