Для запуска определенных действий по расписанию или при наступлении определенного события в Windows используется встроенный планировщик заданий (
Task Scheduler
). В этой статье мы рассмотри, как настроить автоматический запуск PowerShell скрипта с помощью планировщика задач Windows. Скрипт должен запускаться в фоновом режиме, не выдавать всплывающих окон и запускаться независимо от текущих настроек политики выполнения скриптов PowerShell.
В этом примере я хочу каждые 10 минут запускать PowerShell скрипт, который проверяет письма в почтовом ящике и, если есть новые письма с определенным отправителем и темой, отправляет содержимое в виде уведомления в Телеграм. Путь к файлу скрипта:
"C:\PS\OutlookEmailtoTG.ps1"
- Откройте консоль планировщика Task Scheduler, выполнив команду
taskschd.msc
. - Разверните дерево библиотеки Task Scheduler. Для удобства для хранения ваших кастомных заданий можно создать отдельную папку. Щелкните по ней и выберите Create Task
- На первой вкладке General нужно указать имя задания и пользователя, под которым оно будет запускаться. Задание может запускаться автоматически:
— когда пользователь вошел в систему пользователя (Run only the task is logged in)
— или независимо от того, выполнил ли пользователь вход или нет (Run whether user is logged on or not).
Второй режим используется чаще всего. Во втором случае можно указать, что задание будет запускаться от имени определенного пользователя (придется сохранить его пароль в диспетчер учетных данных Credentials Manager). Если для выполнения задания требуется повышение привилегий, нужно включить Run with highest privileges.Чтобы не использовать сохраненный пароль можно настроить запуск задания с максимальными привилегиями от имени NT AUTHORITY\SYSTEM. Для этого в поле User укажитеSYSTEM
.
В среде AD можно настроить запуск заданий от имени сервисной учетной записи gMSA (пароль учетной записи gMSA не хранятся на компьютере в явном виде, вам не нужно их шифровать или защищать). - На вкладке Триггеры (Triggers) нужно задать условие или время запуска задания планировщика. Например, чтобы запустить задание при входе пользователя, выберите тип триггера At log on и в поле Repeat task every выберите частоту повторного запуска каждые 10 минут.
- Если задание запускается от имени SYSTEM или пользователя с сохраненным паролем, нужно выбрать что задание должно быть запущено при загрузке Windows (At startup) и периодически перезапускаться.
- Либо с помощью триггера On a schedule можно настроить точное время запуска задания. У одного задания можно настроить несколько триггеров запуска.Также планировщик может запускать задание при появлении определенного события в журнале Event Viewer.
- Затем перейдите на вкладку Actions. Здесь указывается, что нужно сделать при срабатывании любого из триггеров. В нашем случае мы хотим запустить PowerShell скрипт. Выберите New -> Start a program. Укажите следующе настройки задания:
Program/script:powershell.exe
Add arguments (optional):-ExecutionPolicy Bypass -NonInteractive -WindowStyle Hidden -File "C:\PS\OutlookEmailtoTG.ps1"
Рекомендуем предварительно проверить, что ваш PowerShell скрипт работает корректно. Воспользуйтесь, такой командой:powershell.exe -file C:\PS\OutlookEmailtoTG.ps1 -NoExit
- При запуске скрипта используются следующие опции:
-File
– полный путь к файлу скрипта (PS1)
-ExecutionPolicy
— позволяет задать настройки выполнения PowerShell скриптов для текущего сеанса. Когда указано Bypass, текущие настройки политики игнорируются и скрипт будет выполнен в любом случае;
-NonInteractive
– не выводить интерактивные запросы к пользователю
-WindowStyle Hidden
– не показывать окно консоли PowerShell пользователю (скрипт запускается скрыто). Если задание планировщика настроено на запуск при входе пользователя в систему, при запуске скрипт может появляться и пропадать окно PowerShell. Морганий не будет только со скриптами, которые запускаются в сеансе 0 (вне зависимости от входа пользователя).-NoProfile
— если скрипт может работать без использования профиля пользователя, добавьте эту опцию. Она предотвращает загрузку профиля пользователя, что ускоряет выполнение скрипта; - На вкладке Settings можете включить следующие полезные опции:
Allow task to be run on demand — разрешить ручной запуск задания по запросу.
If the running task does not end when requested, force it to stop — завершить предыдущую задачу, если он не завершилась к моменту повторного запуска.
Do not start a new instance — не запускать новые экземпляры задания, если оно выполняется. - Сохраните настройки задания. Проверьте что задание появилось в консоли Task Scheduler. Чтобы протестировать работу задания, щелкните по нему и выберите Run.
Если PowerShell скрипт был успешно запущен, в поле Last Run Result появится сообщение The operation completed sucessfully (0x0).Рекомендуем добавить в PowerShell скрипт функцию записи всех действий в текстовый лог файл. Это позволит в любой момент получить детальную информацию о всех выполненных действиях. - На вкладке History можно отслеживать историю и результаты предыдущих запусков задания. По умолчанию Task Scheduler не ведет историю запусков заданий. Включается с помощью кнопки Enable All Tasks History в правой панели Actions консоли.
Можно создать задание планировщика для запуска скрипта PowerShell из командной строки:
$TaskName="CheckMailbox"
$Trigger = New-ScheduledTaskTrigger -AtStartup
$Trigger.Repetition = (New-ScheduledTaskTrigger -once -at "12am" -RepetitionInterval (New-TimeSpan -Minutes 10) -RepetitionDuration (New-TimeSpan -Minutes 10)).repetition
$User= "NT AUTHORITY\SYSTEM"
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-ExecutionPolicy Bypass -NonInteractive -WindowStyle Hidden -File C:\PS\OutlookEmailtoTG.ps1"
Register-ScheduledTask -TaskName $TaskName -Trigger $Trigger -User $User -Action $Action -RunLevel Highest -Force
Некоторые дополнительные моменты, которые нужно учитывать при запуске скриптов PowerShell через планировщик заданий Windows:
- Если вы планируете выполнять скрипт в среде PowerShell Core 7.x, вместо powershell.exe нужно запускать pwsh.exe.
- Если к компьютеру, на котором запускается PowerShell скрипт с привилегированными правами имеют доступ другие пользователи, нужно изменить NTFS права доступа к файлу PS1 так, чтобы они не смогли его отредактировать.
- Если задание запускается от имени непривилегированного пользователя, его учетную запись нужно добавить в локальную политику безопасности Log on as a batch job (gpedit.msc -> Computer Configuration -> Windows Settings -> Security Settings -> Local Policies -> User Rights Assignment). При создании такого задания появится предупреждение: This task requires that the user account specified has Log on as batch job rights
- В домене AD PowerShell скрипты с помощью GPO можно запускать при загрузке/входе пользователя или выключении компьютера. Такие скрипт нызываются логон-скриптами.
Сферический конь в вакууме 😉
Для каждого скрипта есть своя специфика. Напишите про создание скриптом в шедулере таблиц Excel 🙂
у меня странное что-то, в журнале скрипта пишет что скрипт отработан нормально :
«Планировщик заданий успешно завершил экземпляр «{28186c29-93ab-4f0b-9f39-20cd9ae8b923}» задачи «\очистка кэша»
но в колонке «результат последнего запуска» стоит вовсе не The operation completed sucessfully (0x0), а 0xFFFD0000
в общем, не работает через палнировщик… хоть с -ExecutionPolicy Bypass -NonInteractive -WindowStyle Hidden запускай, хоть без
просто скрипт работает, а через планировщик — ошибка 0xFFFD0000
причём в скрипт вставлял Start-Transcript/Stop-Transcript
Запуск вручную скрипта создаёт лог, запуск через планировщик — нет. то есть даже до отработски скрипта не доходит.
пробовал так же под SYSTEM запускать — результат нулевой.
Где-то 3 месяца назад также столкнулся с подобной проблемой.
Задания на исполнение скриптов распространяются через GPO, иногда запуск таски приводит к выполнению, иногда заканчивается ошибкой 0xFFFD0000.
Если попытаться выполнить проверку через запуск скрипта локально в powershell ругается, что не может найти файл, хотя содержимое файла вполне спокойно отдает через Get-Content.
Решения пока не нашел.
Попробуйте указать полный путь к powershell.exe:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Если нет:
Проверяйте путь к скрипту (кавычки в пути если пробелы, сами кавычки чтобы правильные были, пробелы), разрешения на PS1 файл, убедитесь что вы не используете никаких переменных окружения, которые привязаны к пользователю или его профилю.
Можно дополнительно блокировать загрузку профиля:
-NoProfile -ExecutionPolicy Bypass -NonInteractive -WindowStyle Hidden -File "C:\PS\OutlookEmailtoTG.ps1"
не помогло ((
такое впечатление что планировщику запрещено павершелл использовать, запуска скрипта просто даже не происходит
Какие настройки execution policy на машине?
с вставкой скриншотов тут беда просто….
поборол через обычный cmd… в нём команда на запуск скрипта:
Спасибо, попробую переделать некоторые задания через cmd, хотя конечно выглядит как костыль.
Заметил также, что данная проблема наблюдается только на ОС версии Windows Server 2022 (10.0.20348) Standard и Datacenter edition, версия powershell 5.1
у меня на 2016 Standart такая ошибка