Использование 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!
+10
22 февраля 2012, 00:44
170
ngelik 2,5

комментарии (11)

+2
Stalker_RED #
От программирования тут один for на всю статью.

schtasks конечно намного круче чем at, но я недоумеваю — почему этот краткий обзор консольной утилиты размещен в блоге «ненормальное программирование»?
+3
bolk #
Потому что программирование на BAT/CMD давно пора отнести к ненормальному программированию и использовать что-то более мощное :) Windows Script Host (JScript/VBScript) или PowerShell.
0
ngelik #
А что по вашему мнению есть программирование?
Если мы используем ключевые слова if, for, while — это программирование, а если пишем на brainfuck, где этих слов нет, то это не будет считаться программированием?
+1
sphinxy #
А нельзя ли вместо конкретного пользователя, да еще и специально нарушающего политику паролей, использовать system?

The following command changes the SecurityScript task so that it runs with permissions of the NT Authority\System account. It uses the /ru "" parameter to indicate the System account.

schtasks /change /tn SecurityScript /ru ""
0
ngelik #
Я так подозреваю, что вашей политикой безопасности запрещено создавать локальных пользователей, у которых не истекает пароль.
NT Authority\System использовать можно, но тут же опять все зависит от того, какой скрипт будет запускаться по расписанию. Если он только копирует файлы из одного каталога в другой, или сжимает логи, то думаю, что проблем с этим быть не должно.
0
adminimus #
как раз недавно этим занимался. Тоже пробовал запускать под System, но обе нужные мне графические программы не работали/работали очень криво при таком запуске. Так что не всегда такое сработает
0
fishbone #
Вопрос к знатокам. Как можно командой schtasks, при типе расписания ONIDLE, настроить остановку задачи после окончания простаивания?

И еще, видимо Win XP и Win 7 по разному трактуют ONIDLE. Нормально отрабатывающее задание после 10 минутного простоя на XP у меня так ни разу не запустилось в 7. ЧЯДНТ?
0
ngelik #
Одному Майкрософту, ну еще и Богу известно, что они считают простоем (IDLE) в своей ОС :)
0
adminimus #
Длинные строки в блоках кода опять не влезают в хабраверстку :( Когда уже сделают автоперенос?
0
vmysla #
почему at не подходит?
0
Stalker_RED #
У schtasks гораздо больше возможностей. Но для некоторых покатит и at.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.