- Используем Powershell для работы с планировщиком заданий для создания и изменения задач
- Работа планировщика в Powershell
- Создание скрипта для тестирования
- Создание выполняемого действия для планировщика
- Создание временного события — триггера
- Регистрация задачи в планировщике
- Запуск и получение дополнительной информации
- Изменение пользователя, параметров безопасности и уровня запуска
- Изменение триггеров и действий
- Бэкап, удаление и восстановление задач планировщика с Powershell
- Резервное копирование
- Удаление, отключение и включение
- Восстановление
- Анализ выполнения и завершения, а так же сравнение
- Вики IT-KB
- Инструменты пользователя
- Инструменты сайта
- Боковая панель
- Содержание
- Как создать задание Планировщика Windows Task Scheduler от имени учётной записи MSA/gMSA в PowerShell
- Создание простого задания
- Изменение созданного задания
- Задания со сложным расписанием
- Триггер -AtStartup
Используем Powershell для работы с планировщиком заданий для создания и изменения задач
18 декабря 2020
В Windows есть механизм под названием ‘Планировщик заданий’ (Task Scheduler). Основная задача планировщика — выполнение задач в определенный момент времени или при определенном действии. В этой статье будет рассмотрены варианты работы с ним через Powershell. На примере мы создадим задание в виде скрипта с Powershell, изменим и удалим его используя только команды.
Навигация по посту
Работа планировщика в Powershell
Отличительной чертой работы Powershell является то, что мы должны создать каждый из объектов (результат команд) планировщика отдельно, а затем объединить их с помощью 1 команды. Сами объекты делятся на следующие:
- Action (Действие) — определяет что мы должны запустить. Действия проявляются как программа (например браузер) с аргументами (открыть определенный сайт). В одной задаче может быть до 32 действий;
- Trigger (Триггер) — это событие при котором должно запуститься действие. Событие может быть привязано к времени или каким-то процессом в системе (включение компьютера, вход пользователя и т.д.). Время можно устанавливать как определенное, например в 14:00, так и интервальное — каждые 2 часа. Так же как и действий триггеров может быть несколько.
- Settings (Настройки) — дополнительные условия обработки задач. Это может быть перезапуск в случае сбоя задачи или самоудаление если задача не используется.
- Security Options (Параметры безопасности) — определяют привилегии и пользователя от имени которого будут запущены задания.
3 и 4 пункт не является обязательными при создании задачи т.к. уже имеет настройки по умолчанию.
За создание задач в планировщике отвечает модуль ScheduledTasks, который имеет следующие команды:
Создание скрипта для тестирования
Что бы продемонстрировать работу планировщика я создам скрипт, который будет сохранять логи с журнала Windows в папку ‘logs’. Ниже находится сам скрипт:
Команды выше не должны выдавать каких либо ошибок. Ошибка может быть, например, с несуществующей папкой ‘logs’. Сам скрипт я сохранил по пути ‘C:\scheduler_task.ps1’. Его запуск не выдает каких-то ошибок:
У вас так же будет создан файл в папке ‘logs’.
Создание выполняемого действия для планировщика
Для создания ‘action’ мы должны указать программу и аргументы. В качестве программы будет сам интерпретатор ‘powershell.exe’, а аргументом будет путь до скрипта. Как говорилось раньше у нас будет несколько объектов (результат команд) и все их нужно будет объединить. Что бы это было возможным мы должны поместить результаты работы в переменные:
Мы так же можем указать параметр ‘WorkingDirectory’, который определяет откуда и будет запущена программа. Учитывая, что ‘powershell.exe’ виден через системные переменные использовать параметр ‘WorkingDirectory’ нам не требуется.
Действия выше аналогичны следующим настройкам в интерфейсе (т.е. так мы обычно добавляем скрипт Powershell в планировщик):
Создание временного события — триггера
Следующим мы определим, когда мы будем запускать задачу. Это делается с помощью команды ‘New-ScheduledTaskTrigger’. Эта команда имеет множество параметров, которые делятся на системные события и временные.
Системные события, которые мы можем использовать, следующие:
- AtLogOn — во время входа пользователя в систему;
- AtStartup — во время запуска системы.
Аргументы связанные со временем:
- At — точное время выполнение скрипта;
- Daily — ежедневно;
- DaysInterval — интервал в днях. Если указать цифру 1, то подразумевается, что задача будет запускаться ежедневно. Если указать 2 — то задача будет запускаться через день;
- DaysOfWeek — день недели, когда будет выполнен запуск. Возможны варианты: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday;
- Once — запуск будет выполнен единожды;
- Weekly — запуск по неделям;
- WeeksInterval — интервал между неделями;
- RandomDelay — указывает задержку между запусками. Задержка определяется случайно от указанного значения. Принимает не число, а объект TimeSpan;
- RepetitionDuration — Срок действия задачи. Принимает не число, а объект TimeSpan.
- RepetitionInterval — время через которое задача будет повторяться. Принимает не число, а объект TimeSpan.
Большую часть команд, связанных со временем, мы можем сочетать вместе. Так, например, мы создадим триггер выполнится однажды в 13:00:
Еще несколько примеров:
Меня интересует ежедневный запуск задачи с периодичностью в 5 минут. Для ‘RepetitionInterval’, который устанавливает такие интервалы, нужно использовать дополнительную команду ‘New-TimeSpan’. В этой команде определим сам интервал:
Регистрация задачи в планировщике
Теперь, после выполнения минимальных требований в виде ‘action’ и ‘trigger’, мы должны объединить эти объекты. Это делается с помощью команды ‘Register-ScheduledTask’. Дополнительно мы можем определить название и описание создаваемого объекта:
Учитывайте, что вы можете использовать несколько триггеров и действий. Для этого вы должны перечислить их через запятую.
TaskPath указывает где была создана задача. В примере выше это произошло в корне планировщика:
Вы можете использовать аналогичный параметр для регистрации задачи в другой директории:
Способа узнать путь два:
- Через графический интерфейс;
- Через команду ‘Get-ScheduledTask’ (будет рассмотрена ниже).
В powershell есть еще одна команда, которая может участвовать в создании задач «New-ScheduledTask». Основное отличие такой команды в том, она не регистрирует (добавляет) задачу в сервис планировщика. Если бы мы использовали обе команды это бы выглядело так:
Запуск и получение дополнительной информации
Для запуска задачи, не зависимо от триггеров, используется команда ‘Start-ScheduledTask’:
У нас так же есть 2 команды, которые возвращают информацию о задачах.
Первая команда просто возвращает список задач, которые есть в каталогах планировщика их статус и путь:
У команды запуска и получения задач из планировщика можно использовать параметры:
- TaskName — имя объекта;
- TaskPath — путь до объекта.
Более полезная команда следующая, так как вернет немного больше информации:
Само собой все эти команды можно использовать в конвейере:
Если задача занимает много времени и ее нужно остановить — можно выполнить следующие действия:
Фильтрация через Where-Object в Powershell с примерами
Изменение пользователя, параметров безопасности и уровня запуска
Создавая задачи в планировщике мы имеем блок ‘Security Options’, который чаще используется с настройками по умолчанию. В этом блоке определяются следующие параметры:
- Пользователь, от имени которого будет выполнен запуск;
- Выполняется ли задача для вошедших в систему пользователей;
- Привилегии запуска (от пользователя/администратора);
- Совместимость.
В графическом интерфейсе эти параметры настраиваются в следующем блоке:
Так же как и в случае с созданием задачи, в случае ее изменения мы создаем разные объекты (результаты команд), которые затем привязываем через команду ‘Set-SchedukedTask’.
С помощью следующих команд мы изменим пользователя, повысим права и изменим совместимость:
Если у вас будет следующая ошибка, то скорее всего она связана с неверным пользователем:
- Set-ScheduledTask : No mapping between account names and security IDs was done.
Само собой эти же объекты можно использовать при создании (регистрации) задачи в планировщике:
Учитывайте, что у New-ScheduledTaskSettingsSet около 30 возможных параметров (работа при отключенной батареи, максимальное количество перезапусков и т.д.). В примере выше рассмотрено лишь несколько.
Изменение триггеров и действий
С помощью Set-ScheduledTask так же добавляются и изменяются триггеры и действия. Изменение будут заключаться в полной замене существующих триггеров и действий у задач. Вам просто нужно создать объект по аналогии с тем, как это делалось в предыдущих разделах:
Бэкап, удаление и восстановление задач планировщика с Powershell
Удобной возможностью использования Powershell является импорт и экспорт задач планировщика. По сути вы можете создать шаблон, который можно использовать на разных компьютерах без особой работы с кодом. По умолчанию, сам Powershell, не предоставляет прямой возможности бэкапа и восстановления, но это можно сделать через другие команды.
Резервное копирование
Для бэкапа мы можем использовать команду Export-CliXml. Для этого нам нужно будет получить задачу и использовать конвейер:
Для экспорта в Powershell так же есть ‘Export-ScheduledTask’, но нет аналогичной команды импорта. Что бы импортировать такие файлы-задачи мы можем использовать только GUI. Из-за этого она не приведена в примере выше.
Удаление, отключение и включение
При удалении задачи, по умолчанию, запрашивается подтверждение. Что бы этого не было добавляется ключ ‘Confirm’:
Если требуется только отключить задачу используйте Disable:
Восстановление
Восстановление выполняется в несколько шагов. Первое — мы должны выполнить импорт XML документа в Powershell:
На одном из сайтов я прочитал, что следующий параметр нужно изменять на «Interactive», так как без него не будет работать задача, но у меня этот параметр не изменялся при экспорте:
Этот параметр связан со входом пользователя через GUI. Аналогичное название в интерфейсе планировщика задач «Выполнять только для пользователей, вошедших в систему». Если этот параметр у вас отличается — вы сможете изменить его так:
Далее нам нужно зарегистрировать эту задачу определяя каждый из параметров отдельно:
Как создавать команды и функции в Powershell вызывать их и передавать параметры
Анализ выполнения и завершения, а так же сравнение
Используя предыдущие команды мы можем выполнить некоторую автоматизацию. Например так мы можем увидеть результат выполненных задач:
Часть этих кодов имеет следующую расшифровку (был использован автоматический переводчик):
- 0 — операция успешно завершена.
- 1 — Вызывается неправильная функция или неизвестная функция. 2 Файл не найден.
- 10 — Неправильная среда.
- 267008 — Задача готова к запуску в следующее запланированное время.
- 267009 — В данный момент идет выполнение.
- 267010 — Задача не будет запущена в запланированное время, потому что она отключена.
- 267011 — Запуск еще не был выполнен.
- 267012 — Для этой задачи больше нет запланированных запусков.
- 267013 — Одно или несколько свойств, необходимых для запуска этой задачи по расписанию, не были установлены.
- 267014 — Последний запуск задачи был прерван пользователем.
- 267015 — Либо у задачи нет триггеров, либо существующие триггеры отключены или не установлены.
- 2147750671 — Учетные данные повреждены.
- 2147750687 — Экземпляр этой задачи уже запущен.
- 2147943645 — Служба недоступна (установлен ли флажок «Запускать только при входе пользователя в систему»?).
- 3221225786 — Приложение было закрыто в результате нажатия CTRL + C.
- 3228369022 — Неизвестное программное исключение.
Альтернативное — вы можете открыть интерфейс планировщика и посмотреть какая ошибка отображается там (она будет текстом).
Далее вы можете создать скрипт для поиска сбойных задач. Например меня интересует только задачи со сбоями, а не успешно работающие. Так как я не знаю всех кодов, мне нужно будет исключить только коды успешного выполнения:
Такой же подход можно использовать при поиске странных сервисов-программ. Например у нас есть эталонный компьютер/сервер и на нем созданы все нужные задачи. Всех их мы помещаем в один объект, а затем сравниваем с другими экземплярами:
Далее, через разные средства, мы можем сравнить этот список на других компьютерах:
Вики IT-KB
Пошаговые руководства, шпаргалки, полезные ссылки.
Инструменты пользователя
Инструменты сайта
Боковая панель
Содержание
Как создать задание Планировщика Windows Task Scheduler от имени учётной записи MSA/gMSA в PowerShell
Графическая оболочка Планировщика заданий Windows Task Scheduler в ОС Windows Server 2012 R2 не умеет работать с учётными записями MSA/gMSA. Однако для настройки задания планировщика Windows, которое должно выполняться от имени сервисной учётной записи MSA/gMSA, мы можем воспользоваться возможностями оболочки PowerShell.
Создание простого задания
Запустим оболочку PowerShell с правами Администратора и создадим простое задание планировщика Windows для запуска некоторого PS-скрипта с ежедневным выполнением, например в 23:00:
Откроем графическую консоль управления планировщиком Windows и проверим корректность созданного задания.
Изменение созданного задания
В случае необходимости изменения созданного задания с использованием учётной записи MSA/gMSA не нужно пытаться изменить здание через графическую консоль, так как это приведёт к запросам аутентификации для учётной записи gMSA и ошибкам сохранения задания. Изменить созданное задание можно с помощью PowerShell. Например, чтобы изменить время запуска задания можем выполнить следующий код:
Задания со сложным расписанием
Рассмотрим ещё один пример создания задачи планировщика, но уже с более сложным расписанием выполнения. Например, нам нужно, чтобы задание выполнялось дважды в день в определённое время. В этом случае в качестве значения триггера используется массив объектов, созданных командлетом New-ScheduledTaskTrigger. Например, задача, выполняемая ежедневно утром и вечером в определённое время может быть создана так:
Если требуется постоянный цикличный запуск задания, например, каждые 5 минут, то значение триггера можно задать следующим образом:
Ещё один пример указания триггера с условием, что задание должно выполняться в определённое время, но только по рабочим дням недели:
Триггер -AtStartup
При создании заданий Планировщика с триггером по запуску ОС (-AtStartup) может потребоваться дополнительно установить в свойствах триггера небольшую задержку по времени для того, чтобы дать возможность завершения инициализации механизмов доменной аутентификации. Пример такой настройки рассмотрен здесь.
Проверено на следующих конфигурациях:
Версия ОС |
---|
Windows Server 2012 R2 Standard EN (6.3.9600) |
Автор первичной редакции:
Алексей Максимов
Время публикации: 06.06.2019 20:51