7

Возможно ли (с помощью групповой политики и т.д.) Автоматически восстановить сеанс консоли на ПК с Windows 8.1 после отключения сеанса удаленного рабочего стола?

Я знаю, что вы можете выполнить команду "tscon 1 /dest:console" во время сеанса RDP, чтобы отключить себя и повторно подключить сеанс консоли, но возможно ли, чтобы это произошло автоматически?

3 ответа3

3

Создайте командный файл со следующим содержимым с именем что-то вроде restore_console.bat:

@echo off
set LOG_FILENAME=%TEMP%\restore_console_log.txt
echo Script executed at %TIME% > %LOG_FILENAME%
echo qwinsta: >> %LOG_FILENAME%
qwinsta >> %LOG_FILENAME%

echo Checking for pending connection... >> %LOG_FILENAME%
for /f %%i in ('qwinsta ^| findstr /r /C:"^ [ ]*[0-9][0-9]*  Disc"') do (
echo Pending connection detected, finishing. >> %LOG_FILENAME%
goto end
)

echo Checking for disconnection... >> %LOG_FILENAME%
for /f "tokens=2" %%i in ('qwinsta ^| findstr /r /I /C:"^ [ ]*[^ ][^ ]* [ ]*[0-9][0-9]*  Disc"') do (
echo Redirecting session id %%i >> %LOG_FILENAME%
tscon %%i /dest:console /v >> %LOG_FILENAME%
goto end
)

:end

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

  • Общие -> Выполнить независимо от того, вошел ли пользователь в систему или нет, Выполнить с наивысшими привилегиями.
  • Триггеры -> Создать -> При отключении от сеанса пользователя, Любой пользователь, Соединение с удаленным компьютером
  • Действия -> Создать -> Запустить программу -> Программа / скрипт: <ваш пакетный файл>
  • Все остальное по умолчанию.

Примечания относительно реализации:

  • это работает путем синтаксического анализа вывода qwinsta через регулярное выражение findstr, то есть извлечение идентификатора из строки 3 здесь:

     SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE 
    >services                                    0  Disc                        
                       ######                    2  Disc                        
     console                                     7  Conn                        
     #############...                        65536  Listen                      
     rdp-tcp                                 65537  Listen                      
    
  • средний блок необходим, потому что по какой-то причине задача расписания выполняется как при соединении, так и при отключении. Когда это произойдет, результат будет иметь вид:

     SESSIONNAME       USERNAME                 ID  STATE   TYPE        DEVICE 
    >services                                    0  Disc                        
                       ######                    2  Disc                        
                                                 3  Disc                        
     console                                     8  Conn                        
     #############...                        65536  Listen                      
     rdp-tcp                                 65537  Listen                      
    

    Поэтому мы ищем линии шаблона из строки 4.

  • он сбрасывает информацию журнала в% TEMP%\restore_console_log.txt, что не обязательно, но полезно, если скрипт не работает. Без регистрации было бы всего несколько строк.

Это сработало для меня на одной машине с Windows 8.1 - я не знаю, может ли это быть развернуто глобально.

0

@ Ответ Кима великолепен. К сожалению для нас, похоже, Microsoft прервала запуск запланированной задачи по удаленному подключению / отключению в Windows 10. Что бы я ни делал, я не мог выполнить ни одну задачу, тем более эту, при подключении или отключении через удаленный рабочий стол.

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

Измените триггер на "О событии" из журнала «Microsoft-Windows-TerminalServices-LocalSessionManager/Operational», источника «TerminalServices-LocalSessionManager», идентификатора события "24". (Первоначально я рекомендовал 40 - оба, похоже, работают, но 40 немного шумнее, возможно, происходит несколько раз при отключении. Если 24 не работает, попробуйте 40 и дайте нам знать.) Смотрите скриншот ниже.

0

Я знаю, что это немного устарело, но должна быть возможность написать быструю службу Windows, которая контролирует соединения и восстанавливает сеанс консоли, когда обнаруживает, что RDP сейчас находится в отключенном состоянии. Чуть менее трудоемким было бы использовать пакетный файл с использованием srvany для запуска его в качестве службы, просто следите за значениями, возвращаемыми из qwinsta.

Я бы порекомендовал сделать пакет /srvany как конечный автомат. Сначала пакетный файл отслеживает RDP-соединение и продолжает мониторинг, пока не увидит его. Затем он переходит в следующее состояние, в котором он ожидает завершения сеанса RDP. Когда он обнаруживает, что сеанс был отключен (не завершен), он переходит в конечное состояние, которое должно восстановить этот сеанс на консоли. Наконец, он возвращается в исходное состояние мониторинга для сеанса RDP.

Я не говорю, что это будет легко, но это должно быть возможно. Главным образом я хотел предложить предложение, потому что ваш "tscon [sessionID] /dest:console" избавил меня от головной боли.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .