Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/75: Рейтинг темы: голосов - 75, средняя оценка - 4.53
2 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 185

Работа с Планировщиком Powershell

24.01.2018, 19:04. Показов 15004. Ответов 27

Студворк — интернет-сервис помощи студентам
Доброго времени суток
Вопрос следущего характера

Освоил уже готовый скриптик, по созданию заданий на win10
Кликните здесь для просмотра всего текста
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Function New-ScheduledTaskFolder
    {
     Param ($taskpath)
     $ErrorActionPreference = "stop"
     $scheduleObject = New-Object -ComObject schedule.service
     $scheduleObject.connect()
     $rootFolder = $scheduleObject.GetFolder("")
        Try {$null = $scheduleObject.GetFolder($taskpath)}
        Catch { $null = $rootFolder.CreateFolder($taskpath) }
        Finally { $ErrorActionPreference = "continue" } }
  
Function Create-AndRegisterApplogTask
{
 Param ($taskname, $taskpath)
 $action = New-ScheduledTaskAction -Execute 'Powershell.exe' `
  -Argument '-NoProfile -WindowStyle Hidden -command "& {get-eventlog -logname Application -After ((get-date).AddDays(-1)) | Export-Csv -Path c:\fso\applog.csv -Force -NoTypeInformation}"'
 $trigger =  New-ScheduledTaskTrigger -Daily -At 4am
 Register-ScheduledTask -Action $action -Trigger $trigger -TaskName `
  $taskname -Description "Daily dump of Applog" -TaskPath $taskpath
}
 
Function Create-NewApplotTaskSettings
{
 Param ($taskname, $taskpath)
 $settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries `
    -Hidden -ExecutionTimeLimit (New-TimeSpan -Minutes 5) -RestartCount 3
 Set-ScheduledTask -TaskName $taskname -Settings $settings -TaskPath $taskpath
}
 
### ENTRY POINT ###
 
$taskname = "applog"
$taskpath = "UTOtasks"
 
If(Get-ScheduledTask -TaskName $taskname -EA 0)
  {Unregister-ScheduledTask -TaskName $taskname -Confirm:$false}
New-ScheduledTaskFolder -taskname $taskname -taskpath $taskpath
Create-AndRegisterApplogTask -taskname $taskname -taskpath $taskpath | Out-Null
Create-NewApplotTaskSettings -taskname $taskname -taskpath $taskpath | Out-Null


Который создает задание, с проверкой, существует ли такое-же с именем

Вопрос, как в одном задании запихнуть еще одно задание
Например первое выполняется в 4утра как в скрипте
а второе запускает файл в 8утра "C:\Program Files\cwRsync\cwrsync.cmd" который записывает логи в туже папку, но перезаписывает их 1 раз в неделю - это не обязательный параметр

При попытке протестировать скрипт выше, учтите что он для англ версии винды ))
с ув.
Спасибо за помощь...
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.01.2018, 19:04
Ответы с готовыми решениями:

Скрипт Powershell и запуск его планировщиком
Всем привет! У меня есть такая задача: очищать папку C:\FTP и копировать в нее абсолютно все содержимое сетевого диска Z (папки,...

работа с PowerShell
Добрый вечер, уважаемые Форумчане. есть задача, нужно написать скрипт PowerShell который бы допустим создавал внутри себя объект...

Работа с папками в powershell
Возникла проблема, необходимо создавать папку по имени пользователя ($env:USERNAME) если она не существует. Вот такой код почему то не...

27
2 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 185
12.02.2018, 20:28  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от KDE777 Посмотреть сообщение
можно применить новую настройку, но как именно
И снова приветствую. Методом проб и ошибок разобрался как скормить ему этот параметр. начну с
1) нашел способ как создать Папку
Кликните здесь для просмотра всего текста
PowerShell
1
2
3
4
5
$scheduleObject = New-Object -ComObject schedule.service
$Hostname = $Env:computername
$ScheduleObject.connect($Hostname)
$rootFolder = $scheduleObject.GetFolder("")
$RootFolder.CreateFolder("Папка для джобов")

2) Прочитав уйму разных способов, и раз 20 +- 30 переделывая сам скрипт получилось поставить эту галочку
Кликните здесь для просмотра всего текста
PowerShell
1
2
3
4
5
6
7
$TaskName = "OtutilsChek"
$Scheduler = new-object -com("Schedule.Service")
$Scheduler.connect('localhost')
$TasksFolder = $Scheduler.Getfolder("\Microsoft\Windows\PowerShell\ScheduledJobs")
$task = $TasksFolder.GetTask($TaskName)
$taskDefinition = $task.Definition
$TasksFolder.RegisterTaskDefinition("\Microsoft\Windows\PowerShell\ScheduledJobs\$TaskName", $taskDefinition, $null, $null, $null, 3)

И тут такая дилемма, короче смотрю значение не обновилось. вместо этого в папке создало еще группу под папок
Рисунок ниже, что-б понятнее Вложил
Получается он с таким же именем джоб зафигарил с полной веткой в другой каталог

Начал искать дальше, нарыл инфу про параметр обновления , типа если поставить
так
PowerShell
1
$TasksFolder.RegisterTaskDefinition("\Microsoft\Windows\PowerShell\ScheduledJobs\$TaskName", $taskDefinition, 0x4, $null, $null, 3)
то по идее новый не должен создаваться, а лишь обновиться существующий
при таком значении , уходит в ошибку
Кликните здесь для просмотра всего текста
PowerShell
1
2
3
4
5
6
Не удается найти указанный файл. (Исключение из HRESULT: 0x80070002)
At line:8 char:1
+ $TasksFolder.RegisterTaskDefinition("\Microsoft\Windows\PowerShell\Sc ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], FileNotFoundException
    + FullyQualifiedErrorId : System.IO.FileNotFoundException

если значение выставить
PowerShell
1
$TasksFolder.RegisterTaskDefinition("\Microsoft\Windows\PowerShell\ScheduledJobs\$TaskName", $taskDefinition,$TaskCreation.TaskUpdate, $null, $null, 3)
нет и ошибок и в принципе результата тоже

Все от куда брал инфу ниже ...
Кликните здесь для просмотра всего текста
ТЫК1 .... ТЫК2 .... ТЫК3 ...


Знаю, что возможно надоел елозить одну и ту же проблему. но все же ... Огромная благодарность всем , кто пытается помочь!!
Изображения
 
1
 Аватар для KDE777
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
12.02.2018, 22:35
Лучший ответ Сообщение было отмечено magarjoba как решение

Решение

Цитата Сообщение от magarjoba Посмотреть сообщение
то по идее новый не должен создаваться, а лишь обновиться существующий
Вот и отлично! Вы остановились в одном шаге от нужного вам решения:

PowerShell
1
$TasksFolder.RegisterTaskDefinition($TaskName, $taskDefinition, 4, $null, $null, 3)
Итого:
Кликните здесь для просмотра всего текста

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$ScriptBlock =
{
 
Start-Transcript -Path C:\Temp\log.txt -Append
 
$target = "\\$($env:COMPUTERNAME -replace '.$','A')\Share\notepad.exe"
$file = "$env:USERPROFILE\Desktop\Блокнот.lnk"
 
$target
$file
Get-Item $target -Verbose
 
 
Stop-Transcript
 
}
 
 
$TaskName = "CheckScheduledJob"
$Trigger = New-JobTrigger -AtLogOn
 
if (Get-ScheduledJob | ? Name -eq $TaskName){"Задача - $TaskName - уже существует!"; break}
Register-ScheduledJob -ScriptBlock $ScriptBlock -Name $TaskName -Trigger $Trigger
 
$Scheduler = new-object -com("Schedule.Service")
$Scheduler.connect('localhost')
$TasksFolder = $Scheduler.Getfolder("\Microsoft\Windows\PowerShell\ScheduledJobs")
$task = $TasksFolder.GetTask($TaskName)
$taskDefinition = $task.Definition
$TasksFolder.RegisterTaskDefinition($TaskName, $taskDefinition, 4, $null, $null, 3)


Добавлено через 1 час 44 минуты
Следующая проблема:

Созданный ScheduledJob от имени администратора не видят остальные пользователи - решаем это вопрос заменой УЗ создавшего, на встроенную группу "Пользователи":

PowerShell
1
$TasksFolder.RegisterTaskDefinition($TaskName, $taskDefinition, 4,'S-1-5-32-545', $null, 4)
+ на всякий случай вместо ключа -ScriptBlock (у Register-ScheduledJob) используем -FilePath и указываем путь к ps1-файлу доступному всем пользователям (далее окажется, что дело не в этом).

Казалось бы теперь всё. Но не тут то было Теперь пользователи видят этот job, но при попытке его запустить получают - "У данной учётной записи пользователя нет разрешения на запуск этой задачи."

Ага, значит ещё нужны права на "c:\Windows\System32\Tasks\Microsoft\Win dows\PowerShell\ScheduledJobs\$TaskName"

Решаем и эту задачу:

PowerShell
1
2
3
4
5
6
$TaskFile = "$env:SystemRoot\System32\Tasks\Microsoft\Windows\PowerShell\ScheduledJobs\$TaskName"
$ACL = Get-Acl $TaskFile
 
$AccessRule = new-object System.Security.AccessControl.FileSystemAccessRule("BUILTIN\Пользователи","ReadAndExecute", "Allow")
$ACL.AddAccessRule($AccessRule)
$ACL | Set-Acl $TaskFile
Но и теперь задание не даёт результата, хотя и выполняется. Теперь причина в том, что нужны права на чтение, выданные пользователям на папку ScheduledJobs в профиле УЗ создавшей задания (там и хранится ScheduledJobDefinition).

"C:\Users\admin\AppData\Local\Microsoft\ Windows\PowerShell\ScheduledJobs\CheckSc heduledJob\ScheduledJobDefinition.xml"

Добавить эти права можете сами, по аналогии с примером выше. Или я доделаю, но уже завтра Хотя и не уверен насколько правильно так делать....

На данный момент получается вот так:

Кликните здесь для просмотра всего текста
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$TaskName = "CheckScheduledJob"
$Trigger = New-JobTrigger -AtLogOn
 
if (Get-ScheduledJob | ? Name -eq $TaskName){"Задача - $TaskName - уже существует!"; break}
Register-ScheduledJob -FilePath C:\Scripts\s1.ps1 -Name $TaskName -Trigger $Trigger
 
$Scheduler = new-object -com("Schedule.Service")
$Scheduler.connect('localhost')
$TasksFolder = $Scheduler.Getfolder("\Microsoft\Windows\PowerShell\ScheduledJobs")
$task = $TasksFolder.GetTask($TaskName)
$taskDefinition = $task.Definition
$TasksFolder.RegisterTaskDefinition($TaskName, $taskDefinition, 4,'S-1-5-32-545', $null, 4)
 
$TaskFile = "$env:SystemRoot\System32\Tasks\Microsoft\Windows\PowerShell\ScheduledJobs\$TaskName"
$ACL = Get-Acl $TaskFile
$AccessRule = new-object System.Security.AccessControl.FileSystemAccessRule("BUILTIN\Пользователи","ReadAndExecute", "Allow")
$ACL.AddAccessRule($AccessRule)
$ACL | Set-Acl $TaskFile
1
2 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 185
13.02.2018, 11:12  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
На данный момент получается вот так:
я по поводу прав еще не тестил, ща сервак оффлайн, через полчаса потестить получится с первым вариантом,
и вторым,
но а если короче сделать так чтоб задача запускалась от системной учетки, поидее тогда не важно какой пользователь
залогинится , права то будут на папку...

соответственно Допустим, логинится пользователь с правами только чтение - идет старт задачи от имени системной учетки - успешно или S-1-1-0 . т.к в выполняемом скрипте
PowerShell
1
$env:USERPROFILE
то должно проканать
хотя.... , короче ща перепроверю все варианты и отпишусь, на руках 7ка просто есть...
0
2 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 185
13.02.2018, 12:07  [ТС]
Цитата Сообщение от magarjoba Посмотреть сообщение
то должно проканать
ну вот и приплыли!!! )))

Получается так , заходишь с под нового пользователя. а задач то нет,.
все потому что они были созданы под админом и находятся в админской учетке и присущи только для нее !)
Капец , что самое главное и предыдущий джоб который я делал его там тоже нет... скриншот вложу, но тут по логике и так понятно

Ща буду думать вариант переписать весь скрипт на -com с указанием в корневой папке джобов,
или есть возможность чтоб он создавался не в c:\Users\administrator\AppData\Local\Mic rosoft\Windows\PowerShell\ScheduledJobs\ этой папке

а хз в какой, чтоб задание было доступно для любого пользователя
Миниатюры
Работа с Планировщиком Powershell  
0
 Аватар для KDE777
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
13.02.2018, 12:26
Цитата Сообщение от magarjoba Посмотреть сообщение
Получается так , заходишь с под нового пользователя. а задач то нет,.
все потому что они были созданы под админом и находятся в админской учетке и присущи только для нее !)
Именно для решение этой проблемы я ранее и написал:

Цитата Сообщение от KDE777 Посмотреть сообщение
Созданный ScheduledJob от имени администратора не видят остальные пользователи - решаем это вопрос заменой УЗ создавшего, на встроенную группу "Пользователи":

PowerShell
1
$TasksFolder.RegisterTaskDefinition($TaskName, $taskDefinition, 4,'S-1-5-32-545', $null, 4)
0
2 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 185
13.02.2018, 16:02  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
менно для решение этой проблемы я ранее и написал:
Сорри не внимательно прочитал. с горяча полез все тестить
Да ты прав !

Но!, Значит если даже дать доступ к той папке что ты писал, все равно болт, но джоб уже виден,
Начал копать дальше , включил парсинг, не мог понять почему не запускается от нового пользователя само задание
что самое главное в логах писало что все ок джоб отработан но результат был 0х1
Проверял права на серваке, короче кучу всего я перепроверил. пока логически не попробовал
Code
1
c:\Users\administrator\AppData\Local\Microsoft\Windows\PowerShell\ScheduledJobs\
Вот этой папке дать права
Получается в Винде дали мы права на задание, но так как в задании идет обращение к папке, соответственно для
другого рядового пользователя уже нет прав на чтение

Остается добавить в скрипт что-б и на эту папку применялись разрешения , Вуаля все работает...
0
 Аватар для KDE777
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
13.02.2018, 16:48
Цитата Сообщение от magarjoba Посмотреть сообщение
Проверял права на серваке, короче кучу всего я перепроверил. пока логически не попробовал

c:\Users\administrator\AppData\Local\Mic rosoft\Windows\PowerShell\ScheduledJobs\
И об этом я написал в своём ответе #22

Цитата Сообщение от KDE777 Посмотреть сообщение
Но и теперь задание не даёт результата, хотя и выполняется. Теперь причина в том, что нужны права на чтение, выданные пользователям на папку ScheduledJobs в профиле УЗ создавшей задания (там и хранится ScheduledJobDefinition).

"C:\Users\admin\AppData\Local\Microsoft\ Windows\PowerShell\ScheduledJobs\CheckSc heduledJob\ScheduledJobDefinition.xml"
Добавлено через 9 минут
Этот путь сразу видно, вот так:

PowerShell
1
Get-ScheduledJob $TaskName | fl Name,PSExecutionArgs
Просто я не очень уверен, что давать права всем пользователям на "ScheduledJobDefinition.xml" в профиле другой УЗ удачная идея... А если профиль будет удалён? Т.е. хотелось, чтобы ОС хранила этот JobDefinition где нибудь в ProgramData...

Добавлено через 33 минуты
Если вариант с установкой доп. прав на "ScheduledJobDefinition.xml" не смущает, тогда всё вместе получается так (протестировал на Win7 - ScheduledJob создаётся и срабатывает при логине любого пользователя):

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$TaskName = "CheckScheduledJob"
$Trigger = New-JobTrigger -AtLogOn
 
$ScriptBlock =
{
$target = "\\$($env:COMPUTERNAME -replace '.$','A')\Share\notepad.exe"
$file = "$env:USERPROFILE\Desktop\Блокнот.lnk"
Get-Item $target -Verbose > C:\Temp\log.txt
}
 
if (Get-ScheduledJob | ? Name -eq $TaskName){"Задача - $TaskName - уже существует!"; break}
Register-ScheduledJob -ScriptBlock $ScriptBlock -Name $TaskName -Trigger $Trigger
 
$Scheduler = new-object -com("Schedule.Service")
$Scheduler.connect('localhost')
$TasksFolder = $Scheduler.Getfolder("\Microsoft\Windows\PowerShell\ScheduledJobs")
$task = $TasksFolder.GetTask($TaskName)
$taskDefinition = $task.Definition
$TasksFolder.RegisterTaskDefinition($TaskName, $taskDefinition, 4,'S-1-5-32-545', $null, 4)
 
$LocalUsers = Get-LocalGroup | ? SID -eq 'S-1-5-32-545'
Foreach ($TaskFile in "$env:SystemRoot\System32\Tasks\Microsoft\Windows\PowerShell\ScheduledJobs\$TaskName","$env:LOCALAPPDATA\Microsoft\Windows\PowerShell\ScheduledJobs\$TaskName\ScheduledJobDefinition.xml")
{
    $ACL = Get-Acl $TaskFile
    $AccessRule = new-object System.Security.AccessControl.FileSystemAccessRule($LocalUsers.SID,"ReadAndExecute","Allow")
    $ACL.AddAccessRule($AccessRule)
    $ACL | Set-Acl $TaskFile
}
1
2 / 2 / 0
Регистрация: 10.11.2015
Сообщений: 185
13.02.2018, 18:25  [ТС]
Цитата Сообщение от KDE777 Посмотреть сообщение
Если вариант с установкой доп. прав
Спасибо, я только начал сам оберту делать, как вы уже написали

Ну в данном случае не смущает, а так по правильному вообще да . конечно нужно делать отдельно. что-б не было
зависимостей...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.02.2018, 18:25

Автоматизированная работа с плейлистами Iptv в powershell
Всем доброго времени суток. Есть плейлист большой с группами group-title. Пример : #EXTINF:-1 group-title="ВИДЕОКАМЕРЫ"...

Работа с таблицами Word средствами PowerShell
Доброго времени суток! Подскажите, где найти справочник по работе с таблицами средствами powershell? Например, как добавить к...

Работа в PowerShell (скопировать файл из одного места в другое)
Здравствуйте! Начали работать в PowerShell, преподаватель задал выполнить следующее: В зависимости от запроса в интерактивном режиме...

Импорт данных из Excell (csv) и работа с ними в PowerShell
Здравствуйте! Являюсь совсем новичком в PowerShell, пролазив все форумы не нашла как сделать следующее: У меня есть Excel (или...

Работа с планировщиком заданий
Хочу добавить задачу в планировщик заданий задачу с дофига аргументами - тригеры, действия, рабочая папка и все такое


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru