Сброс сессий терминалов в XP.

Октябрь 6, 2011 at 16:59 Оставьте комментарий

Ни для кого не секрет, что в Windows XP есть полноценный сервер терминалов от 2003 Windows Server. Но он искусственно обрезан до одного возможного подключения. Есть множество патчей, которые позволяют делать большее количество одновременных сеансов. Это очень удобно в том случае, если у вас есть однопользовательская дорогая программа, которую вы поставили на одно рабочее место, но хотите, чтобы ей по очереди пользовались несколько людей.
Про беготню к какому-то компьютеру речи нет, можно было бы обойтись и стандартным терминалом XP (один удаленный пользователь или один локальный), но у это варианта есть неприятный нюанс — если один пользователь уже работает в терминале, то следующий заходящий его «выдавливает», то есть сессия первого обрывается и продолжается у нового зашедшего. Поэтому пользователям приходится созваниваться и договариваться об очереди, что ужасно. Итак, допустим, что сервер терминалов мы сделали. Как правило, часть однопользовательской программы, ответственная за соблюдение лицензии, достаточно умна, чтобы сообщить пользователю, что один экземпляр уже запущен и больше ничего не делать, поэтому тут никаких вопросов. Есть проблема в том, когда пользователь попользовался программой, сохранил результаты труда и вышел из терминала, а программу не закрыл. Сразу оговорюсь, что стандартные средства клиента по запуску программы одновременно с терминалом не всегда работают. Так вот, сервер терминалов любовно сохранит сессию и больше никто программу не запустит!
Пока не придет администратор и не прибьет ее. Но администратор приходить не хочет. Он пишет скрипт!
Вот соображения:
Windows Shell имеет команды qwinsta (Query Windows Station) и rwinsta (Reset Windows Station). Qwinsta возвращает список пользователей, вошедших в систему, их ID и состояние (Активно или Диск). Rwinsta сбрасывает сессию пользователя с заданным ID.
Следовательно, необходимо распарсить вывод команды qwinsta и передать ID пользователей, сессия которых спит на диске, команде rwinsta.
Сначала хочу выразить глубокую ненависть batch по сравнению с bash. Но cygwin, mingw, а также приблуды типа powershell и Windows Host использовать для такой штуки не хотелось совсем.
Теперь краткий экскурс в мир DOS.

  1.   Цикл For.
  2. FOR /F "tokens=n[,m*] delims=[ccc]" %%A IN ('имя файла ИЛИ множество ИЛИ команда в одинарных кавычках') DO command %%A
    

    Если он используется в cmd, то управляющая переменная предваряется одним знаком процента %, а если в скрипте, то двумя.
    tokens — номера «слов» из строки результата работы цикла, которые будут использованы(выведены). Все они могут быть использованы как переменные в теле цикла.
    delims — символы, которые являются разграничителями между словами в строке. Аналог третьего параметра split в boost.
    Есть еще skip=n (сколько первых строк пропустить), eol=ссс — признак конца строки и usebacq — опция, которая определяет что использовать — апостроф или одинарную кавычку, когда параметр цикла(который в скобках) трактуется как команда, а когда — как строка.

  3. Команда Find
  4. Find «substring» — возвращает всю строку, содержащую подстроку substring;
    опция /V — наоборот, возвращает все строки, не содержащие данную подстроку;
    опция /I — делает поиск нечувствительным к регистру.

  5. Конвейер команд.
  6. Можно передавать результат выполнения одной команды на вход следующей с помощью символа |
    Но это просто в cmd.
    А если внутри параметра цикла, то ^|

Итак: фильтруем вывод qwinsta с помощью find. Ищем только строки, содержащие слово Диск и исключаем локальные сеансы (wdcon). Можно исключать и каких-то пользователей(в примере — Катя). Перебираем результат в цикле, находя в строках ID и с помощью rwinsta сбрасываем сессии. Важный аспект: скрипт, в котором есть кириллица (в нашем случае — слово Диск), надо писать в кодировке MS-DOS.

For /F "tokens=2 delims= " %%A IN ('qwinsta ^| find "Диск" ^| find /V "wdcon" ^| find /V "Катя" ') do rwinsta %%A

ID — это второе «слово» в строке вывода qwinsta, delims стандартные — пробел или знак табуляции, а в %%A соотвественно попадет единственный token — ID пользователя, зашедшего в систему удаленно и не активного в данный момент.
Я запускаю скрипт по расписанию раз в сутки. Надо помнить, что rwinsta работает около минуты на стареньких машинах, поэтому часто это делать не стоит. Кроме того, это скорее страховка на случай забывчивости пользователей, а не обязательная мера.

Реклама

Entry filed under: windows xp. Tags: , , , , .

Преобразование в таблицу Excel текстового файла с CSV-разделителями. bash и его пробелы

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

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

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

Trackback this post  |  Subscribe to the comments via RSS Feed



%d такие блоггеры, как: