Как в MS Windows server завершить сессии пользователей в терминале в определенное время

Нужно сделать backup базы, но пользователи не выходят нормально из 1С и висят терминальные сессии, что делать?
Просто поставь скрипт в задачи сервера, например, за час до бекапа, и вуаля — все пользователи вышли.
Скрипт ниже 🙂

Преамбула:

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

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

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

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

  1. Формируем файл со списком созданных сессий;

query user >user_temp_all.txt

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

find «console» user_temp_all.txt > user_temp.txt /V

    3. Находим строки и со словом «Активно» (это чтобы в первый этап собрались сессии активные, почему сделано в два этапа, объясню дальше) и эти строки сохраняем в файл user.txt (кстати, это для руского сервака, если сервак другой, эту строку надо поправить, проверялось на 2008);

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

 

ВСЕ

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

11 Comments

  1. insurgut

    Есть вариант гораздо проще. Например WinRAR может архивировать совместно открытые файлы. Получается что-то вроде бэкапа «налету» как в MSSQL, только для файловой базы.

    Reply
  2. Pasha1st

    Расскажу одну страшную вещь. Выкидывать пользователей — грубо но надежно если все пользователи терминальные. Если есть клиенты по сети/web — не поможет.

    (1) insurgut, Архивирование базы в процессе изменения — оригинальный способ выстрелить себе в ногу.

    Но есть решение лучше — теневые копии томов. Советую поискать утилиту vshadow.exe (раздельно для 32 и 64-разрядных систем) и рецепты использования. Позволяет получить моментальную консистентную (физически) копию данных. В т.ч. и для 7.7 с кучей файлов. На случай если база файловая а пользователи непредсказуемые.

    Reply
  3. foxey

    Скажите, а почему все пункты в последовательности действий пронумерованы исключительно номером «1»?

    Этим подчеркнута важность каждого действия или, наоборот, говорит, что последовательность действий не важна и любой пункт может выполняться первым?

    Reply
  4. RomanBor

    (3) foxey, а это банально ошибка

    Reply
  5. insurgut

    (2) Pasha1st, в каком процессе изменения? Если я правильно понял — постановка задачи «Бэкап файловой базы в нерабочее время», поэтому терминальные сессии и завершают. Если пользователь забыл закрыть программу, то с базой ничего не происходит, копию налету можно спокойно делать.

    Reply
  6. svk

    Всё проще. Я в глобальном модуле написал процедуру, которая сама начинает закрывать приложение после 21 часа (например). Пользователю выходит сообщение «В базе проводятся регламентные работы, Закрыть??» с таймаутом.Если никто не нажал «нет», то база закрывается. Если человеку что-то нужно быстро доделать, он нажимает на сообщении нет и доделывает свои дела. Сообщение выходит через каждые 5 минут.

    Reply
  7. Pasha1st

    (5) insurgut, если что-то может пойти не так — рано или поздно оно пойдет не так. Если мы допускаем что файл базы может быть открыт во время снятия бекапа, то и изменения в него могут вноситься именно в этот момент. Если нет желания зависеть от всех «если» для важных данных — не стоит доверять архиватору получение данных с ключом «открывать совместно используемые файлы». Относительно надежным тут будет рецепт с теневыми копиями — создать временную теневую копию тома, сделать копию файлов 1CD, [освободить теневую копию], поместить скопированное в архив, архив в облако, облако в … А лучше использовать SQL-базы 😉

    Reply
  8. RomanBor

    Лучше / хуже / Бекап какая разница есть скрипт закрытия терминальных сессий, как его использовать марока каждого либо для выброса всех пользователей перед обновлением либо еще для чего дело каждого в отдельности.

    ЗЫ: Про теневые копии есть у нас один сервачек (ms windows server 2012) там если пользователи остаются в системе и происходит бекап посредством

    VSS(Volume Shadow Copy Service) то после бекапа с утра пользователи спокойно приходят поднимают сеанс и начинают работать и база через время падает в основном таблицы с остатками, причем падает оригинальная база бекап нормальный, толи сервак отключает дескрипторы открытых файлов, вообщем разбираемся.

    (7) Pasha1st, не увсех есть денежки на сервак 1С

    Reply
  9. insurgut

    А есть варианты, как выгнать всех сидящих по локальной сети в расшаренной базе?

    Reply
  10. RomanBor

    (9) insurgut,

    встроить в конфу механизм выкидывания

    Reply
  11. Robotron_2007

    Благодарю за Вашу работу!

    Reply

Leave a Comment

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