Ненормальное программирование / Использование bat файлов для создания «Заданий по расписанию»

в 20:44, , рубрики: bat, метки:

Продолжаю тему создания нетривиальных bat-файлов для тривиальных задач, начатую здесь.

Наверняка многие сталкивались с задачей, когда для каких-либо целей в ОС Windows необходимо создать задание, выполняемое по расписанию (scheduled task).
Для этих целей имеется простой графический интерфейс. Однако как поступить, если задание должно создаваться автоматически?
Попробуем решить эту задачу с использованием примитивного bat-скрипта, который будет выполняться в практически любой версии Windows.

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

:: Имя локального пользователя, под которым будем работать
set user_name=test_user
:: Пароль для локального пользователя
set user_passw=test_passw

А как известно пользователь должен находиться в группе с определенными правами. Вот тут и возникает определенная сложность, т.к. если в скрипте четко задать имя группы, то могут возникнуть проблемы на машине с другой локализацией, например китайской. И как будет называться на китайском группа «Пользователи» узнать будет не очень просто. К счастью, в ОС Windows группы привязаны к так называемому Group SID. Зная, к примеру, Group SID группы «Администраторы», мы можем использовать его в скрипте. Например, S-1-5-32-545 — это локальные пользователи, а S-1-5-32-544 — администраторы.
Теперь нужно определить имя для заданного Group SID, используемого в данной локализации. Тут нам на помощь придет WMIC (WMI command-line).

:: S-1-5-32-545 - локальные пользователи
Set GroupSID=S-1-5-32-545
Set GroupName=
For /"UseBackQ Tokens=1* Delims==" %%I In (`WMIC Group Where "SID = '%GroupSID%'" Get Name /Value ^| Find "="`) Do Set GroupName=%%J
Set GroupName=%GroupName:~0,-1%

Нужно знать еще один нюанс. При создании пользователя, в зависимости от системных настроек, задается время истечения пароля. И если пароль нужно будет поменять, то задание по расписанию не будет выполняться. Для этого нам нужно создать пользователя, у которого никогда не истекает пароль. Задать это в стандартной команде net user нельзя (expires:never — задает, что пользователь не может поменять пароль), поэтому опять прибегнем к помощи WMIC:

:: Создание пользователя
net user %user_name% %user_passw% /add  /comment:"User for works with application" /expires:never /fullname:%user_name% /passwordchg:no
:: Устанавливаем, чтобы пароль не истекал никогда
:: Либо так - wmic path Win32_UserAccount where Name='%user_name%' set PasswordExpires=false
wmic USERACCOUNT where Name='%user_name%' set PasswordExpires=false
:: Добавление локального пользователя в заданную локальную группу
net localgroup %GroupName% %user_name% /ADD

Обратите внимание, что если вы удаляете пользователя командой net user test_user /DELETE, то вам нужно будет вручную удалить его каталог по пути %USERS%test_user либо предусмотреть его удаление в скрипте.

Ну а далее создаем само задание, выполняемое по расписанию:

:: Имя запланированного задания, под которым будет работать приложение
set task_name=Test_task_bat
:: Путь к приложению
set my_app_path="d:test.bat"
:: Интервал работы приложения во временном задании
::  Valid schedule types: MINUTE, HOURLY, DAILY, WEEKLY, MONTHLY, ONCE, ONSTART, ONLOGON, ONIDLE.
:: ЕЖЕМИНУТНО, ЕЖЕЧАСНО, ЕЖЕДНЕВНО, ЕЖЕНЕДЕЛЬНО, ЕЖЕМЕСЯЧНО ПРИ ЗАПУСКЕ ВХОДЕ В СИСТЕМУ ПРИ ПРОСТОЕ
set schtasks_time=MINUTE
:: Начальное время старта приложения во временном задании
set schtasks_start=08:00:00
 
:: Создание запланированного задания
schtasks /create /tn "%task_name%" /tr %my_app_path% /sc %schtasks_time% /st %schtasks_start% /ru %user_name% /rp %user_passw%

Вот и все. Надеюсь, что мой небольшой мануал окажется полезен и вы не сэкономите свое время при выполнении данной задачи.

P.S.
Предвижу подобные вопросы и комментарии: есть же более удобные инструменты, почему именно bat?
Just for fun!

Автор: ngelik


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js