Для запуска определенных действий по расписанию или при наступлении определенного события в 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 можно запускать при загрузке/входе пользователя или выключении компьютера. Такие скрипт нызываются логон-скриптами.