gifts2017

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

Опубликовал Роман Анисимов (RomanBor) в раздел Администрирование - Сервисные утилиты

Нужно сделать 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

 

ВСЕ

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

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Скрипты завершения сеансов (пароль: 1)
.rar 1,29Kb
04.03.16
6
.rar 1 1,29Kb 6 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Анянов Михаил (insurgut) 04.03.16 21:30
Есть вариант гораздо проще. Например WinRAR может архивировать совместно открытые файлы. Получается что-то вроде бэкапа "налету" как в MSSQL, только для файловой базы.
2. Pavel Fomin (Pasha1st) 04.03.16 23:22
Расскажу одну страшную вещь. Выкидывать пользователей - грубо но надежно если все пользователи терминальные. Если есть клиенты по сети/web - не поможет.
(1) insurgut, Архивирование базы в процессе изменения - оригинальный способ выстрелить себе в ногу.
Но есть решение лучше - теневые копии томов. Советую поискать утилиту vshadow.exe (раздельно для 32 и 64-разрядных систем) и рецепты использования. Позволяет получить моментальную консистентную (физически) копию данных. В т.ч. и для 7.7 с кучей файлов. На случай если база файловая а пользователи непредсказуемые.
3. Игорь Костюк (foxey) 09.03.16 09:10
Скажите, а почему все пункты в последовательности действий пронумерованы исключительно номером "1"?
Этим подчеркнута важность каждого действия или, наоборот, говорит, что последовательность действий не важна и любой пункт может выполняться первым?
4. Роман Анисимов (RomanBor) 09.03.16 09:11
(3) foxey, а это банально ошибка
5. Анянов Михаил (insurgut) 09.03.16 12:33
(2) Pasha1st, в каком процессе изменения? Если я правильно понял - постановка задачи "Бэкап файловой базы в нерабочее время", поэтому терминальные сессии и завершают. Если пользователь забыл закрыть программу, то с базой ничего не происходит, копию налету можно спокойно делать.
6. svk (svk) 09.03.16 18:57
Всё проще. Я в глобальном модуле написал процедуру, которая сама начинает закрывать приложение после 21 часа (например). Пользователю выходит сообщение "В базе проводятся регламентные работы, Закрыть??" с таймаутом.Если никто не нажал "нет", то база закрывается. Если человеку что-то нужно быстро доделать, он нажимает на сообщении нет и доделывает свои дела. Сообщение выходит через каждые 5 минут.
7. Pavel Fomin (Pasha1st) 10.03.16 00:39
(5) insurgut, если что-то может пойти не так - рано или поздно оно пойдет не так. Если мы допускаем что файл базы может быть открыт во время снятия бекапа, то и изменения в него могут вноситься именно в этот момент. Если нет желания зависеть от всех "если" для важных данных - не стоит доверять архиватору получение данных с ключом "открывать совместно используемые файлы". Относительно надежным тут будет рецепт с теневыми копиями - создать временную теневую копию тома, сделать копию файлов 1CD, [освободить теневую копию], поместить скопированное в архив, архив в облако, облако в ... А лучше использовать SQL-базы ;)
8. Роман Анисимов (RomanBor) 10.03.16 07:45
Лучше / хуже / Бекап какая разница есть скрипт закрытия терминальных сессий, как его использовать марока каждого либо для выброса всех пользователей перед обновлением либо еще для чего дело каждого в отдельности.

ЗЫ: Про теневые копии есть у нас один сервачек (ms windows server 2012) там если пользователи остаются в системе и происходит бекап посредством
VSS(Volume Shadow Copy Service) то после бекапа с утра пользователи спокойно приходят поднимают сеанс и начинают работать и база через время падает в основном таблицы с остатками, причем падает оригинальная база бекап нормальный, толи сервак отключает дескрипторы открытых файлов, вообщем разбираемся.
(7) Pasha1st, не увсех есть денежки на сервак 1С
9. Анянов Михаил (insurgut) 10.03.16 10:38
А есть варианты, как выгнать всех сидящих по локальной сети в расшаренной базе?
10. Роман Анисимов (RomanBor) 10.03.16 12:03
(9) insurgut,
встроить в конфу механизм выкидывания
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа