Как запустить скрипт powershell в планировщике задач
Перейти к содержимому

Как запустить скрипт powershell в планировщике задач

  • автор:

Запуск PowerShell скрипта в Планировщике заданий по расписанию в фоновом режиме

Задача запустить PowerShell скрипт, чтобы он не выдавал всплывающих окон и исполнялся в фоновом режиме по расписанию.

Имеем PowerShell скрипт по пути — «C:\Users\user\Downloads\rdp.ps1» который, например, выводит список залогинившихся по RDP в файл.

Get-WinEvent "Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational" | ? | % < New-Object PSObject -Property @< MachineName = $_.MachineName TimeCreated = $_.TimeCreated User = $_.Properties[0].Value Domain = $_.Properties[1].Value SourceIP = $_.Properties[2].Value >>| export-csv "C:\Users\user\Downloads\rdp-log.txt" -nti

Запускаем планировщик заданий в Windows, справа жмем кнопку создать задачу.
Имя: вводим любое название;
Описание: не обязательное поле;
Выполнять для всех пользователей — выбираем для всех;
Выполнить с наивысшими правами — ставим галку для выполнения с правами администратора;

Переходим на вкладку Триггеры:
Создать — выбираем ежедневно, устанавливаем нужное время, повторять каждые 1 день — жмем ОК;

Переходим на вкладку Действия:
Создать. В поле программа или сценарий вводим:

powershell.exe

Добавить аргументы- вводим:

-ExecutionPolicy RemoteSigned -NonInteractive -WindowStyle Hidden -File "C:\Users\user\Downloads\rdp.ps1"

где:
-ExecutionPolicy-задает политику выполнения скриптов для текущего сеанса, может быть Restricted, AllSigned, RemoteSigned, Unrestricted, Bypass;
RemoteSigned — скрипты, подготовленные на локальном компьютере, можно запускать без ограничений, скрипты, загруженные из Интернета — только при наличии цифровой подписи;
-NonInteractive — отключить вывод интерактивных запросов к пользователю;
-WindowStyle Hidden — запуск окна PowerShell в скрытом режиме, незаметно для пользователя.

Жмем ОК и вводим пароль от учетной записи Windows.
Готово.

Создание и управление заданиями планировщика из PowerShell

date

07.04.2021

user

itpro

directory

PowerShell, Windows 10, Windows Server 2016

comments

комментариев 15

Большинство пользователей и администраторов привыкли использовать графический интерфейс консоли Taskschd.msc для создания заданий планировщика Windows (Task Scheduler), запускаемых по расписанию. Однако в различных скриптах и автоматизируемых задачах для создания заданий планировщика гораздо удобнее использовать возможности PowerShell. В этой статье мы покажем, как создавать и управлять заданиями планировщика Windows из PowerShell.

Управление заданиями Task Scheduler с помощью PowerShell

В Windows 10/Windows Server 2016 для управления задачами в планировщике используется PowerShell модуль ScheduledTasks. Список командлетов в модуле можно вывести так:

Get-Command -Module ScheduledTasks

  • Disable-ScheduledTask
  • Enable-ScheduledTask
  • Export-ScheduledTask
  • Get-ClusteredScheduledTask
  • Get-ScheduledTask
  • Get-ScheduledTaskInfo
  • New-ScheduledTask
  • New-ScheduledTaskAction
  • New-ScheduledTaskPrincipal

powershell командлеты из модуля ScheduledTasks

Совет. Ранее в Windows для создания и управления заданиями планировщика в основном использовались встроенная консольная утилита schtasks.exe.

Как создать задание планировщика с помощью PowerShell?

В современных версиях PowerShell (начиная с PowerShell 3.0 в Windows Server 2012/Windows 8) для создания заданию планировщика нужно использовать командлеты New-ScheduledTaskTrigger и Register-ScheduledTask.

Предположим, наша задача создать задание планировщика, которое должно запускаться при загрузке компьютера (или в определенное время) и выполнять какой-то PowerShell скрипт. Создадим задание планировщика с именем StartupScript_PS. Данное задание должно каждый день в 10:00 запускать PowerShell скрипт, хранящийся в файле C:\PS\StartupScript.ps1 из-под учетной записи системы (SYSTEM). Задание будет выполняться с повышенными привилегиями (галка “Run with highest privileges”).

$Trigger= New-ScheduledTaskTrigger -At 10:00am -Daily
$User= «NT AUTHORITY\SYSTEM»
$Action= New-ScheduledTaskAction -Execute «PowerShell.exe» -Argument «C:\PS\StartupScript.ps1»

Register-ScheduledTask -TaskName «StartupScript_PS» -Trigger $Trigger -User $User -Action $Action -RunLevel Highest –Force

Если задание успешно создано, появится надпись Ready.

создать задание планировщика с помощью Register-ScheduledTask

Теперь ваш PowerShell скрипт будет запускаться по указанному расписанию. Если на вашем компьютере настроена PowerShell Execution Policy, блокирующая запуск скриптов PS1, вы можете запустить скрипт их планировщика с параметром –Bypass.

Используйте такую строку при создании нового задания:

$Action= New-ScheduledTaskAction -Execute «PowerShell.exe» -Argument “-NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File C:\PS\StartupScript.ps1″

Совет. Если нужно, чтобы задание запускалось каждый раз при загрузке компьютера, первая строка должна быть такой:
$Trigger= New-ScheduledTaskTrigger -AtStartup
Если нужно выполнять задание при входе пользователя:
$Trigger= New-ScheduledTaskTrigger –AtLogo n

Откройте консоль Taskschd.msc и проверьте, что проверьте, что в Task Scheduler Library появилось новое задание планировщика.

консоль Task Scheduler с новым заданием планировщика

В версии Powershell 2.0 (Windows 7, Windows Server 2008 R2) для создания повторяющегося задания (ScheduledJob) из PowerShell необходимо воспользоваться COM интерфейсом Schedule.Service (либо обновите версию PowerShell). В этом примере мы создадим задание планировщика, которое во время запускает определённый файл с PowerShell скриптом во время загруки. Задание выполняется с правами системы (System).

$TaskName = «NewPsTask»
$TaskDescription = «Запуск скрипта PowerShell из планировщика»
$TaskCommand = «c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe»
$TaskScript = «C:\PS\StartupScript.ps1»
$TaskArg = «-WindowStyle Hidden -NonInteractive -Executionpolicy unrestricted -file $TaskScript»
$TaskStartTime = [datetime]::Now.AddMinutes(1)
$service = new-object -ComObject(«Schedule.Service»)
$service.Connect()

$rootFolder = $service.GetFolder(«\»)
$TaskDefinition = $service.NewTask(0)
$TaskDefinition.RegistrationInfo.Description = «$TaskDescription»
$TaskDefinition.Settings.Enabled = $true
$TaskDefinition.Settings.AllowDemandStart = $true
$triggers = $TaskDefinition.Triggers
#http://msdn.microsoft.com/en-us/library/windows/desktop/aa383915(v=vs.85).aspx
$trigger = $triggers.Create(8)

Получение информации и запуск заданий планировщика из PowerShell

Вы можете вывести список всех активных заданий планировщика в Windows с помощью команды:

Get-ScheduledTask -TaskPath | ? state -ne Disabled

Чтобы получить информацию о конкретном задании:

Get-ScheduledTask CheckServiceState_PS| Get-ScheduledTaskInfo

LastRunTime : 4/6/2021 10:00:00 AM LastTaskResult : 267011 NextRunTime : 4/7/2021 10:00:00 AM NumberOfMissedRuns : 0 TaskName : CheckServiceState_PS TaskPath : \ PSComputerName :

информация о запуске задания Get-ScheduledTaskInfo

Вы можете отключить это задание:

Get-ScheduledTask CheckServiceState_PS | Disable-ScheduledTask

Чтобы включить задание:

Get-ScheduledTask CheckServiceState_PS | Enable-ScheduledTask

Чтобы запустить задание немедленно (не дожидаясь расписания), выполните:

отключить/включить/запустить задание планировщика с помощью PowerShell

Чтобы полностью удалить задание из Task Scheduler:

Unregister-ScheduledTask -TaskName CheckServiceState_PS

Если нужно изменить имя пользователя, из-под которого запускается задание и, например, режим совместимости, используйте командлет Set-ScheduledTask:

$task_user = New-ScheduledTaskPrincipal -UserId ‘winitpro\kbuldogov’ -RunLevel Highest
$task_settings = New-ScheduledTaskSettingsSet -Compatibility ‘Win7’
Set-ScheduledTask -TaskName CheckServiceState_PS -Principal $task_user -Settings $task_settings

При появлении ошибки “Set-ScheduledTask : No mapping between account names and security IDs was done” проверьте, что у вас указано правильное имя пользователя.

Set-ScheduledTask : No mapping between account names and security IDs was done

Экспорт и импорт заданий планировщика в XML файл

С помощью PowerShell можно экспортировать любое задания планировщика в текстовый XML файл для распространения на другие компьютеры. Вы можете экспортировать задание из графического интерфейса Task Scheduler или из консоли PowerShell.

Следующая команда экспортирует задание StartupScript_PS в файл StartupScript_PS.xml:

Export-ScheduledTask «StartupScript_PS» | out-file c:\temp\StartupScript_PS.xml

Export-ScheduledTask - импорт задания планировщика в xml файла

Командлет Export-ScheduledTask не доступен в PowerShell 2.0. Поэтому в Windows 7 / 2008 R2 для экспорта настроек задания в XML файл лучше воспользоваться встроенной утилитой schtasks, вывод которой нужно перенаправить в текстовый файл:

schtasks /query /tn «NewPsTask» /xml >> «c:\ps\NewPsTask.xml»

После того, как настройки задания планировщика экспортированы в XML файл, его можно импортировать на любой другой компьютер с помощи графической консоли, SchTasks.exe или PowerShell.

Воспользуйте командлетом PowerShell Register-ScheduledTask чтобы параметры задания из файла и зарегистрировать его:

Register-ScheduledTask -Xml (Get-Content “\\Server1\public\NewPsTask.xml” | out-string) -TaskName «NewPsTask»

Примечание. В PowerShell 2.0 (Windows 7/Server 2008 R2) импорт задания также проще выполнить с помощью утилиты schtasks. Первая команда создаст новое задание. Вторая – сразу запустит его (не дожидаясь срабатывания триггера).

schtasks /create /tn «NewPsTask» /xml «\\Server1\public\NewPsTask.xml » /ru corp\aaivanov /rp Pa$$w0rd
schtasks /Run /TN «NewPsTask»

Обратите внимание, что в этом примере указаны данные учетной записи, из-под которой будет запускаться задание. Если имя и пароль учетной записи не указаны, то т.к. они не хранятся в задании, они будут запрошены при импорте.

Предыдущая статьяПредыдущая статья Следующая статья Следующая статья

Используем Powershell для работы с планировщиком заданий для создания и изменения задач

Создаем задачи в планировщике с Powershell изменяем и запускаем их

В Windows есть механизм под названием ‘Планировщик заданий’ (Task Scheduler). Основная задача планировщика — выполнение задач в определенный момент времени или при определенном действии. В этой статье будет рассмотрены варианты работы с ним через Powershell. На примере мы создадим задание в виде скрипта с Powershell, изменим и удалим его используя только команды.

Навигация по посту

  • Работа планировщика в Powershell
    • Создание скрипта для тестирования
    • Изменение триггеров и действий
    • Резервное копирование
    • Удаление, отключение и включение
    • Восстановление

    Работа планировщика в Powershell

    Отличительной чертой работы Powershell является то, что мы должны создать каждый из объектов (результат команд) планировщика отдельно, а затем объединить их с помощью 1 команды. Сами объекты делятся на следующие:

    1. Action (Действие) — определяет что мы должны запустить. Действия проявляются как программа (например браузер) с аргументами (открыть определенный сайт). В одной задаче может быть до 32 действий;
    2. Trigger (Триггер) — это событие при котором должно запуститься действие. Событие может быть привязано к времени или каким-то процессом в системе (включение компьютера, вход пользователя и т.д.). Время можно устанавливать как определенное, например в 14:00, так и интервальное — каждые 2 часа. Так же как и действий триггеров может быть несколько.
    3. Settings (Настройки) — дополнительные условия обработки задач. Это может быть перезапуск в случае сбоя задачи или самоудаление если задача не используется.
    4. Security Options (Параметры безопасности) — определяют привилегии и пользователя от имени которого будут запущены задания.

    Планировщик задач Windows

    3 и 4 пункт не является обязательными при создании задачи т.к. уже имеет настройки по умолчанию.

    За создание задач в планировщике отвечает модуль ScheduledTasks, который имеет следующие команды:

    Get-Command -Module ScheduledTasks

    Создание скрипта для тестирования

    Что бы продемонстрировать работу планировщика я создам скрипт, который будет сохранять логи с журнала Windows в папку ‘logs’. Ниже находится сам скрипт:

    # Папка с логами $log_dir = 'C:\logs\' # Полный путь до файла с генерацией имени файла в виде даты $log_file = $log_dir + "AppLog_$(Get-Date -format 'dd-mm-yyyy').xml" # Получаем 10 последних логов приложений $logs = Get-WinEvent -MaxEvents 10 -LogName application # Сохраняем результат предыдущей команды в файл в формате XML Export-CliXml -InputObject $logs -Path $log_file -Force

    Скрипт сбора логов и сохранения в XML

    Команды выше не должны выдавать каких либо ошибок. Ошибка может быть, например, с несуществующей папкой ‘logs’. Сам скрипт я сохранил по пути ‘C:\scheduler_task.ps1’. Его запуск не выдает каких-то ошибок:

    .\scheduler_task.ps1

    Пример работы скрипта сбора логов и сохранения в XML

    У вас так же будет создан файл в папке ‘logs’.

    Создание выполняемого действия для планировщика

    Для создания ‘action’ мы должны указать программу и аргументы. В качестве программы будет сам интерпретатор ‘powershell.exe’, а аргументом будет путь до скрипта. Как говорилось раньше у нас будет несколько объектов (результат команд) и все их нужно будет объединить. Что бы это было возможным мы должны поместить результаты работы в переменные:

    $task_action = New-ScheduledTaskAction ` -Execute 'powershell.exe' ` -Argument '-File C:\scheduler_task.ps1'

    Создание действия в Powershell для планировщика задач

    Мы так же можем указать параметр ‘WorkingDirectory’, который определяет откуда и будет запущена программа. Учитывая, что ‘powershell.exe’ виден через системные переменные использовать параметр ‘WorkingDirectory’ нам не требуется.

    Действия выше аналогичны следующим настройкам в интерфейсе (т.е. так мы обычно добавляем скрипт Powershell в планировщик):

    Создание задачи в планировщике для работы скрипта 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:

    $task_trigger = New-ScheduledTaskTrigger -Once -At 13:00

    Создание триггера в Powershell для планировщика задач

    Еще несколько примеров:

    # Ежедневно в 14:00 New-ScheduledTaskTrigger -Daily -At 14:00 # Запуск каждые 2 дня в 14:00 New-ScheduledTaskTrigger -Daily -DaysInterval 2 -At 14:00 # Каждый 2-ой понедельник в 14:00 New-ScheduledTaskTrigger -Weekly -WeeksInterval 2 -DaysOfWeek Monday -At 14:00

    Меня интересует ежедневный запуск задачи с периодичностью в 5 минут. Для ‘RepetitionInterval’, который устанавливает такие интервалы, нужно использовать дополнительную команду ‘New-TimeSpan’. В этой команде определим сам интервал:

    $time = New-TimeSpan -Minutes 5 $task_trigger = New-ScheduledTaskTrigger -Once -At 0:00 -RepetitionInterval $time

    Создание триггера в Powershell для планировщика задач с повторением

    Регистрация задачи в планировщике

    Теперь, после выполнения минимальных требований в виде ‘action’ и ‘trigger’, мы должны объединить эти объекты. Это делается с помощью команды ‘Register-ScheduledTask’. Дополнительно мы можем определить название и описание создаваемого объекта:

    $name = 'Сбор логов' $description = 'Сбор логов приложений каждые 5 минут в папку c:\logs' Register-ScheduledTask -TaskName $name ` -Description $description ` -Action $task_action ` -Trigger $task_trigger

    Регистрация задачи для планировщика с помощью Powershell

    Учитывайте, что вы можете использовать несколько триггеров и действий. Для этого вы должны перечислить их через запятую.

    TaskPath указывает где была создана задача. В примере выше это произошло в корне планировщика:

    Просмотр задач в планировщике Windows

    Вы можете использовать аналогичный параметр для регистрации задачи в другой директории:

    Register-ScheduledTask -TaskName 'SomeTask' ` -TaskPath '\Microsoft' ` -Action $action1,$action2 ` -Trigger $trigger1,$trigger2

    Регистрация и создание задачи в планировщике Windows с Powershell

    Способа узнать путь два:

    1. Через графический интерфейс;
    2. Через команду ‘Get-ScheduledTask’ (будет рассмотрена ниже).

    В powershell есть еще одна команда, которая может участвовать в создании задач «New-ScheduledTask». Основное отличие такой команды в том, она не регистрирует (добавляет) задачу в сервис планировщика. Если бы мы использовали обе команды это бы выглядело так:

    # Объединение объектов $task = New-ScheduledTask -Action $action1,$action2 ` -Trigger $trigger1,$trigger2 # Их активация Register-ScheduledTask -TaskName 'SomeTask' ` -TaskPath '\Microsoft' ` -InputObject $task

    Запуск и получение дополнительной информации

    Для запуска задачи, не зависимо от триггеров, используется команда ‘Start-ScheduledTask’:

    Start-ScheduledTask -TaskName 'Сбор логов'

    Запуск задачи планировщика с Powershell

    У нас так же есть 2 команды, которые возвращают информацию о задачах.

    Первая команда просто возвращает список задач, которые есть в каталогах планировщика их статус и путь:

    Get-ScheduledTask

    Получение задач планировщика с Powershell

    У команды запуска и получения задач из планировщика можно использовать параметры:

    • TaskName — имя объекта;
    • TaskPath — путь до объекта.
    Get-ScheduledTask -TaskPath '\'

    Более полезная команда следующая, так как вернет немного больше информации:

    Get-ScheduledTaskInfo -TaskName 'Сбор логов'

    Получение информации о задаче планировщика с Powershell

    Само собой все эти команды можно использовать в конвейере:

    Get-ScheduledTask -TaskName 'Сбор логов' | Start-ScheduledTask

    Если задача занимает много времени и ее нужно остановить — можно выполнить следующие действия:

    Stop-ScheduledTask 'Сбор логов'

    Вам так же будет интересно:

    Фильтрация через Where-Object в Powershell с примерами

    Изменение пользователя, параметров безопасности и уровня запуска

    Создавая задачи в планировщике мы имеем блок ‘Security Options’, который чаще используется с настройками по умолчанию. В этом блоке определяются следующие параметры:

    • Пользователь, от имени которого будет выполнен запуск;
    • Выполняется ли задача для вошедших в систему пользователей;
    • Привилегии запуска (от пользователя/администратора);
    • Совместимость.

    В графическом интерфейсе эти параметры настраиваются в следующем блоке:

    Выполнение задачи планировщика для пользователей вошедших в систему

    Так же как и в случае с созданием задачи, в случае ее изменения мы создаем разные объекты (результаты команд), которые затем привязываем через команду ‘Set-SchedukedTask’.

    С помощью следующих команд мы изменим пользователя, повысим права и изменим совместимость:

    # Изменяем пользователя и повышаем права запуска $task_user = New-ScheduledTaskPrincipal -UserId '.\admin' -RunLevel Highest # Изменяем совместимость $task_settings = New-ScheduledTaskSettingsSet -Compatibility 'Win8' # Добавляем объекты созданные выше к существующей задаче Set-ScheduledTask -TaskName 'Сбор логов' -Principal $task_user -Settings $task_settings

    Использование совместимости и другого пользователя в планировщике задач с Powershell

    Если у вас будет следующая ошибка, то скорее всего она связана с неверным пользователем:

    • Set-ScheduledTask : No mapping between account names and security IDs was done.

    Само собой эти же объекты можно использовать при создании (регистрации) задачи в планировщике:

    $name = 'Task 3' Register-ScheduledTask -TaskName $name ` -Action $task_action ` -Trigger $task_trigger ` -Principal $task_user ` -Settings $task_settings

    Учитывайте, что у New-ScheduledTaskSettingsSet около 30 возможных параметров (работа при отключенной батареи, максимальное количество перезапусков и т.д.). В примере выше рассмотрено лишь несколько.

    Изменение триггеров и действий

    С помощью Set-ScheduledTask так же добавляются и изменяются триггеры и действия. Изменение будут заключаться в полной замене существующих триггеров и действий у задач. Вам просто нужно создать объект по аналогии с тем, как это делалось в предыдущих разделах:

    $trigger = New-ScheduledTaskTrigger -Daily -At 14:00 $action = New-ScheduledTaskAction -Execute Calc.exe Set-ScheduledTask -TaskName 'Сбор логов' -Action $action -trigger $trigger

    Запуск задачи в определенное время с Powershell

    Бэкап, удаление и восстановление задач планировщика с Powershell

    Удобной возможностью использования Powershell является импорт и экспорт задач планировщика. По сути вы можете создать шаблон, который можно использовать на разных компьютерах без особой работы с кодом. По умолчанию, сам Powershell, не предоставляет прямой возможности бэкапа и восстановления, но это можно сделать через другие команды.

    Резервное копирование

    Для бэкапа мы можем использовать команду Export-CliXml. Для этого нам нужно будет получить задачу и использовать конвейер:

    Get-ScheduledTask -TaskName 'Сбор логов' | Export-Clixml 'C:\LogTaskBackup.xml'

    Резервное копирование задач планировщика с Powershell

    Для экспорта в Powershell так же есть ‘Export-ScheduledTask’, но нет аналогичной команды импорта. Что бы импортировать такие файлы-задачи мы можем использовать только GUI. Из-за этого она не приведена в примере выше.

    Удаление, отключение и включение

    При удалении задачи, по умолчанию, запрашивается подтверждение. Что бы этого не было добавляется ключ ‘Confirm’:

    Unregister-ScheduledTask -TaskName 'Сбор логов' -Confirm:$False

    Удаление задачи планировщика с Powershell

    Если требуется только отключить задачу используйте Disable:

    Disable-ScheduledTask -TaskName 'Сбор логов'
    Enable-ScheduledTask -TaskName 'Сбор логов'

    Восстановление

    Восстановление выполняется в несколько шагов. Первое — мы должны выполнить импорт XML документа в Powershell:

    $task = Import-Clixml -Path 'C:\LogTaskBackup.xml'

    На одном из сайтов я прочитал, что следующий параметр нужно изменять на «Interactive», так как без него не будет работать задача, но у меня этот параметр не изменялся при экспорте:

    $task.Principal

    Изменение параметра входа пользователей для планировщика с Powershell

    Этот параметр связан со входом пользователя через GUI. Аналогичное название в интерфейсе планировщика задач «Выполнять только для пользователей, вошедших в систему». Если этот параметр у вас отличается — вы сможете изменить его так:

    $task.Principal.LogonType = 'Interactive'

    Далее нам нужно зарегистрировать эту задачу определяя каждый из параметров отдельно:

    Register-ScheduledTask ` -TaskName $task.TaskName ` -Action $task.Actions ` -Trigger $task.Triggers ` -Settings $task.Settings ` -Principal $task.Principal ` -User 'administrator' ` -Password '123'

    Восстановление бэкапа планировщика задач Powershell

    Вам так же будет интересно:

    Как создавать команды и функции в Powershell вызывать их и передавать параметры

    Анализ выполнения и завершения, а так же сравнение

    Используя предыдущие команды мы можем выполнить некоторую автоматизацию. Например так мы можем увидеть результат выполненных задач:

    Get-ScheduledTask | Get-ScheduledTaskInfo | select *

    Получение результата выполненной задачи планировщика

    Часть этих кодов имеет следующую расшифровку (был использован автоматический переводчик):

    • 0 — операция успешно завершена.
    • 1 — Вызывается неправильная функция или неизвестная функция. 2 Файл не найден.
    • 10 — Неправильная среда.
    • 267008 — Задача готова к запуску в следующее запланированное время.
    • 267009 — В данный момент идет выполнение.
    • 267010 — Задача не будет запущена в запланированное время, потому что она отключена.
    • 267011 — Запуск еще не был выполнен.
    • 267012 — Для этой задачи больше нет запланированных запусков.
    • 267013 — Одно или несколько свойств, необходимых для запуска этой задачи по расписанию, не были установлены.
    • 267014 — Последний запуск задачи был прерван пользователем.
    • 267015 — Либо у задачи нет триггеров, либо существующие триггеры отключены или не установлены.
    • 2147750671 — Учетные данные повреждены.
    • 2147750687 — Экземпляр этой задачи уже запущен.
    • 2147943645 — Служба недоступна (установлен ли флажок «Запускать только при входе пользователя в систему»?).
    • 3221225786 — Приложение было закрыто в результате нажатия CTRL + C.
    • 3228369022 — Неизвестное программное исключение.

    Альтернативное — вы можете открыть интерфейс планировщика и посмотреть какая ошибка отображается там (она будет текстом).

    Получение результата выполненной задачи планировщика в GUI

    Далее вы можете создать скрипт для поиска сбойных задач. Например меня интересует только задачи со сбоями, а не успешно работающие. Так как я не знаю всех кодов, мне нужно будет исключить только коды успешного выполнения:

    # Коды, которые меня не интересуют (успешное выполнение) $success_sc_codes = @(0, 267008, 267009, 267010, 267011, 267012) # Получает объект, который содержит детальную информацию по всем процессам $all_sc_tasks = Get-ScheduledTask | Get-ScheduledTaskInfo foreach ($task in $all_sc_tasks) < # Если код не соответствует тому что есть в массиве - выводим на экран if (!($task.LastTaskResult -in $success_sc_codes))< $task >>

    Поиск ошибок в планировщике задач

    Такой же подход можно использовать при поиске странных сервисов-программ. Например у нас есть эталонный компьютер/сервер и на нем созданы все нужные задачи. Всех их мы помещаем в один объект, а затем сравниваем с другими экземплярами:

    # Создаем пустой массив $good_list = [System.Collections.ArrayList]@() # Получаем существующие задачи $all_sc_tasks = Get-ScheduledTask foreach ($task in $all_sc_tasks) < # Помещаем в созданный массив только имена $good_list.Add($task.TaskName) >Out-Null >

    Получение имен задач планировщика с Powershell

    Далее, через разные средства, мы можем сравнить этот список на других компьютерах:

    # Получаем список на другом компьютере $all_sc_tasks = Get-ScheduledTask foreach ($task in $all_sc_tasks) < # Ищем имена, которые не соответствуют тому что есть в массиве if (!($task.TaskName -in $good_list))< $task >>

    Запуск PowerShell скриптов по расписанию

    В задачи практически любого системного администратора входит написание различных скриптов и их запуск. Запланировать запуск скрипта по расписанию с помощью Task Sheduler — задача несложная, но при использовании PowerShell есть некоторые нюансы, о которых я расскажу в этой статье.

    Итак, предположим, у меня есть скрипт start.ps1, который мне необходимо запускать ежедневно в течении 10 дней. Есть два способа решить эту задачу.

    Способ 1

    Для запуска скрипта воспользуемся оснасткой Task Scheduler, он же планировщик заданий. Найти его можно в разделе Administrative Tools, либо нажав Win+R и введя команду taskschd.msc. Открываем планировщик и в разделе Actions выбираем пункт Create Task.

    создаем запланированное задание в Task Scheduler

    На вкладке General указываем имя и описание задания, а также (по необходимости) пользователя, от имени которого задание будет запускаться. Для того, чтобы задание выполнялось вне зависимости от того, залогинен ли пользователь в системе, выбираем опцию «Run whether user is logged on or not». Если для выполнения задания требуется повышение привилегий, то отмечаем опцию «Run with highest privileges».

    новое задание, вкладка General

    Далее идем на вкладку Triggers и создаем новый триггер, в котором будет храниться расписание запуска нашего задания. В поле Start указываем дату и время запуска, а в поле Expire — дату и время завершения задания. Указываем выполнять задание ежедневно (Daily) и задаем период повтора (Recur every) 1 день.

    Примечание. Если вы хотите запускать задание чаще, чем раз в день, то надо выбрать одноразовое выполнение (One time), а в разделе Advanced settings отметить пункт Repeat task every и указать время повторения, минимум 5 минут, максимум 1 час. Если этого недостаточно, то дополнительно в поле Delay task for up to можно указать временную задержку.

    задаем условие для запуска задания

    И основное. Переходим на вкладку Action и указываем действие для запланированного задания. Напомню, что в целях безопасности PowerShell скрипты могут выполняться только интерактивно, то есть сначала надо запустить оболочку PowerShell и уже в ней указать путь к скрипту. Поэтому в поле «Action» указываем запуск powershell.exe, а в поле «Add Arguments» параметр -File и путь к нашему скрипту, вот так:

    Также в поле аргументы можно указать:

    -Command — выполняет указанные команды и любые другие параметры. Этот параметр тоже можно использовать для запуска скрипта, например: -Command ″& ″ . Кроме того, с его помощью можно передавать в скрипт параметры: -Command ″& ″ ;
    -ExecutionPolicy — задает политику выполнения скриптов для текущего сеанса, может принимать значения Unrestricted, RemoteSigned, AllSigned и Restricted. Заданная политика будет действовать только в текущем сеансе и имеет приоритет над любыми ранее созданными политиками;
    -NonInteractive — отключить вывод интерактивных запросов к пользователю;
    -WindowStyle Hidden — запуск окна PowerShell в скрытом режиме, незаметно для пользователя;
    -NoProfile — предотвращает загрузку профиля, что может несколько ускорить выполнение скрипта;
    -NoExit — оставить оболочку открытой после отработки скрипта. Это может понадобиться при проверке и отладке скрипта.

    указываем действие для запланированного задания

    Заполнив необходимые поля жмем ОК и сохраняем задание. Теперь скрипт будет запускаться по расписанию ежедневно в заданное время в течении 10 дней.

    Способ 2

    В PowerShell 3.0 появился новый функционал Sheduled Job, дающий возможность создавать запланированные задания прямо из консоли, не пользуясь оснасткой планировщика. Воспользуемся им для планового запуска нашего скрипта.

    Сначала создаем расписание запуска (ежедневно в полпятого вечера, в течении 10 дней):

    $t = New-JobTrigger -Daily -At 4:30PM -DaysInterval 10

    Затем сохраняем в переменной учетные данные:

    $cred = Get-Credential contoso\administrator

    В качестве опции указываем запуск задания с повышенными привилегиями:

    $o = New-ScheduledJobOption -RunElevated

    И регистрируем задание с именем Start:

    Register-ScheduledJob -Name Start -FilePath C:\Scripts\start.ps1 -Trigger $t -Credential $cred -ScheduledJobOption $o

    создание запланированного задания в PowerShell

    Чтобы убедится в том, что задание создано, можно открыть планировщик и найти наше задание в разделе Microsoft\Windows\PowerShell\SheduledJobs.

    запланированное задание в Task Sheduler

    Примечание. Для каждого запланированного задания PowerShell в директории %systemdrive%\Users\%username%\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs создается одноименная папка. В этой папке находится само задание в XML-файле и папка Output, в которой, в подпапках по времени выполнения, хранится история выполнения задания — результат выполнения (файлs Result.xml) и статус задания (Status.xml). Эти файлы могут пригодиться для отладки и диагностики в том случае, если задание не отрабатывает должным образом.

    Execution Policy

    В заключение напомню об одном немаловажном моменте, а именно о политике выполнения скриптов Execution Policy. Посмотреть текущее значение политики можно командой Get-ExecutionPolicy . Политика выполнения может иметь значения:

    • Restricted — блокируется выполнение любых скриптов. Значение по умолчанию;
    • AllSigned — разрешено выполнение скриптов, имеющих цифровую подпись;
    • RemoteSigned — скрипты, подготовленные на локальном компьютере, можно запускать без ограничений, скрипты, загруженные из Интернета — только при наличии цифровой подписи;
    • Unrestricted — разрешено выполнение любых скриптов. При запуске неподписанного скрипта, который был загружен из Интернета, программа может потребовать подтверждение;
    • Bypass — ничего не блокируется, никакие предупреждения и запросы не появляются.

    Обычно для безпроблемного выполнения скриптов достаточно задать значение RemoteSigned. Изменить текущее значение можно командой Set-ExecutionPolicy , например:

    Set-ExecutionPolicy RemoteSigned -force

    Примечание. Если указанная в команде политика выполнения противоречит групповой политике, то параметр запишется в реестр, но действовать не будет.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *