Расширенная эксплуатация Планировщика заданий и управление триггерами

Обзор

В статье разобраны продвинутые приёмы автоматизации с Планировщиком заданий Windows.
Описаны условные триггеры, запуск по журналу событий, регистрация и управление задачами через PowerShell, а также практики безопасной эксплуатации.

Соглашение о переменных

Переменная Пример Примечание
<<TASK_NAME>> Daily-Backup Имя задачи
<<SCRIPT_PATH>> C:\Scripts\backup.ps1 Путь к исполняемому скрипту
<<EVENT_ID>> 4625 Целевой ID события
<<USERNAME>> Administrator Учетная запись для запуска
<<TASK_PATH>> \MyCompany\Maintenance Папка в библиотеке задач (опц.)

Шаг 1: Регистрация задачи и базовые настройки

При регистрации задачи через PowerShell используются три основных cmdlet:

Cmdlet Назначение
New-ScheduledTaskAction Определяет исполняемую программу/скрипт
New-ScheduledTaskTrigger Определяет момент запуска (время/событие)
Register-ScheduledTask Регистрирует полную задачу (Action + Trigger + Settings)

① Параметры New-ScheduledTaskAction

Параметр Описание Пример
-Execute Исполняемый файл "powershell.exe"
-Argument Аргументы командной строки "-NoProfile -NonInteractive -ExecutionPolicy Bypass -File <<SCRIPT_PATH>>"
-WorkingDirectory Рабочий каталог "C:\Scripts"
-Id Идентификатор действия (для нескольких) "Action1"

💡 Для нескольких действий создайте несколько объектов New-ScheduledTaskAction и передайте массив.


② Параметры New-ScheduledTaskTrigger

Параметр Описание Пример
-Daily Ежедневный запуск вместе с -At 3:00AM
-Weekly Еженедельный -DaysOfWeek Monday,Wednesday
-Once Однократно -At (Get-Date).AddHours(1)
-AtStartup При старте системы
-AtLogOn При входе пользователя
-RepetitionInterval Интервал повторения (New-TimeSpan -Minutes 30)
-RepetitionDuration Общая длительность повторов (New-TimeSpan -Days 1)
-RandomDelay Случайная задержка (New-TimeSpan -Minutes 5)
-StartBoundary / -EndBoundary Период действия "2025-01-01T00:00:00"

⚠️ -RepetitionInterval и -RepetitionDuration работают только для ряда типов триггеров (например, Daily/Once).


③ New-ScheduledTaskSettingsSet (дополнительно)

Параметр Описание Пример
-AllowStartIfOnBatteries Разрешить на батарее $false
-DontStopIfGoingOnBatteries Не останавливать при переходе на батарею $false
-StartWhenAvailable Запуск при появлении условий $true
-Hidden Скрыть задачу $true
-RunOnlyIfNetworkAvailable Только при наличии сети $true
-ExecutionTimeLimit Лимит времени выполнения (New-TimeSpan -Hours 2)
-MultipleInstances Политика многократных экземпляров (IgnoreNew/Parallel/Queue) "IgnoreNew"
-RestartCount / -RestartInterval Повторы и интервал 3, (New-TimeSpan -Minutes 5)

💡 New-ScheduledTaskSettingsSet формирует объект настроек для -Settings, централизуя энергетику, сеть и повторы.


④ Важные параметры Register-ScheduledTask

Параметр Описание Пример
-TaskName Имя задачи "Daily-Backup"
-TaskPath Путь в библиотеке "\MyCompany\Maintenance"
-Action Действие(я) $action
-Trigger Триггер(ы) $trigger
-Settings Доп. настройки $settings
-Description Описание "Daily maintenance backup task"
-User Учетная запись "SYSTEM" или "Administrator"
-RunLevel Уровень прав Highest
-Force Перезапись при наличии

💡 Полная задача — комбинация Action, Trigger и Settings.


⑤ Пример конфигурации

# Действие
$action = New-ScheduledTaskAction -Execute "powershell.exe" `
  -Argument "-NoProfile -ExecutionPolicy Bypass -File <<SCRIPT_PATH>>"

# Триггер (ежедневно в 03:00)
$trigger = New-ScheduledTaskTrigger -Daily -At 3:00AM

# Регистрация
Register-ScheduledTask -TaskName "<<TASK_NAME>>" `
  -TaskPath "<<TASK_PATH>>\Daily" `
  -Action $action -Trigger $trigger `
  -User "<<USERNAME>>" -Description "Ежедневная запланированная задача на 03:00"

⑥ Замечания

  • -ExecutionPolicy Bypass используйте только внутри периметра; рассмотрите подписанные скрипты.
  • Предпочтительны SYSTEM или отдельная служебная учетная запись.
  • Минимальный -RepetitionInterval — 1 минута; типовой предел -RepetitionDuration — 1 день.
  • Для перезаписи требуется -Force.
  • -RunLevel Highest — только для действий, требующих админ-прав.

Шаг 2: Запуск по событиям журнала (XML-шаблон)

New-ScheduledTaskTrigger в PowerShell по-прежнему не поддерживает нативный триггер по событию (например, -OnEvent).
Для запуска по событиям импортируйте XML-описание.

Регистрация:

$xml = @'
<Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Author><<USERNAME>></Author>
    <Description>Запуск скрипта при событии EventID <<EVENT_ID>></Description>
  </RegistrationInfo>
  <Triggers>
    <EventTrigger>
      <Enabled>true</Enabled>
      <Subscription><![CDATA[
        <QueryList>
          <Query Id="0" Path="Security">
            <Select Path="Security">*[System[(EventID=<<EVENT_ID>>)]]</Select>
          </Query>
        </QueryList>
      ]]></Subscription>
    </EventTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>SYSTEM</UserId>
      <RunLevel>HighestAvailable</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>true</StartWhenAvailable>
    <ExecutionTimeLimit>PT1H</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</Command>
      <Arguments>-NoProfile -ExecutionPolicy Bypass -File "<<SCRIPT_PATH>>"</Arguments>
    </Exec>
  </Actions>
</Task>
'@

Register-ScheduledTask -TaskName "<<TASK_NAME>>" -TaskPath "<<TASK_PATH>>\OnEvent" -Xml $xml -User "SYSTEM"

Шаг 3: Комбинация условных триггеров и условий выполнения

Определяйте «условия» задачи (питание, сеть, простой) через New-ScheduledTaskSettingsSet.

$settings = New-ScheduledTaskSettingsSet `
  -AllowStartIfOnBatteries:$false `
  -DontStopIfGoingOnBatteries:$false `
  -StartWhenAvailable:$true `
  -Hidden:$false `
  -RunOnlyIfNetworkAvailable:$true `
  -ExecutionTimeLimit (New-TimeSpan -Hours 2)

Register-ScheduledTask -TaskName "<<TASK_NAME>>_Cond" `
  -TaskPath "<<TASK_PATH>>\Conditional" `
  -Action $action -Trigger $trigger -Settings $settings `
  -User "<<USERNAME>>" -Description "Условная задача (требуется сеть / питание от сети)"

Часто используемые условия

Условие Параметр Пояснение
Только от сети (AC) -AllowStartIfOnBatteries:$false Не запускать на батарее
Требуется сеть -RunOnlyIfNetworkAvailable:$true Пропуск без соединения
Только в режиме простоя XML или COM Нативная поддержка в PowerShell ограничена
Лимит времени -ExecutionTimeLimit Защита от «зависших» задач
Повторы Через XML или триггер-повтор В PowerShell есть ограничения

Шаг 4: Управление существующими задачами

# Список задач
Get-ScheduledTask | Where-Object TaskPath -like "<<TASK_PATH>>*"

# Вкл./выкл.
Enable-ScheduledTask -TaskName "<<TASK_NAME>>"
Disable-ScheduledTask -TaskName "<<TASK_NAME>>"

# Состояние
Get-ScheduledTaskInfo -TaskName "<<TASK_NAME>>" |
  Select-Object TaskName, NextRunTime, LastRunTime, LastTaskResult

Включение эксплуатационного журнала (Operational)

Канал Microsoft-Windows-TaskScheduler/Operational может быть отключен по умолчанию.
Включите его для диагностики и детальной истории.

wevtutil sl Microsoft-Windows-TaskScheduler/Operational /e:true

Шаг 5: Диагностика и проверка логов

# Последний результат выполнения
Get-ScheduledTaskInfo -TaskName "<<TASK_NAME>>"

# Фильтр эксплуатационного журнала по имени задачи
Get-WinEvent -LogName "Microsoft-Windows-TaskScheduler/Operational" -MaxEvents 50 |
  Where-Object { $_.Message -match "<<TASK_NAME>>" } |
  Select-Object TimeCreated, Id, Message | Format-Table -AutoSize

Типовые причины и меры

Причина Действие
Недостаточно прав Пересмотреть права / использовать сервисную учетную запись
Блокировка ExecutionPolicy Подписанный скрипт или -ExecutionPolicy Bypass
Не задан TaskPath/описание Указать -TaskPath и -Description для управляемости
Не срабатывает триггер события Проверить XML и фильтр события
Конфликт условий Пересмотреть логику триггеров и настроек

Шаг 6: Рекомендуемые настройки

  • Используйте SYSTEM или выделенную сервисную учетную запись по принципу минимальных привилегий.
  • В скриптах реализуйте логирование и обработку исключений; фиксируйте успех/ошибки.
  • Версионируйте описания задач в XML (например, в GitHub).
  • Периодически мониторьте через Get-ScheduledTaskInfo, настраивайте оповещения об отклонениях.
  • Удаляйте устаревшие задачи Unregister-ScheduledTask, держите библиотеку в порядке.

Итоги

Планировщик заданий Windows — это не только таймерные запуски.
С триггерами по событиям, условным запуском и интеграцией с PowerShell он превращается в мощную платформу автоматизации.
Стандартизируя регистрацию, управление и мониторинг кодом, вы получаете воспроизводимость, управляемость и безопасность эксплуатации.