Powershell: установите запланированную задачу для запуска, когда пользователь не вошел в систему

Я использовал командлеты запланированных задач Powershell для создания запланированных задач. на наших серверах.

Как выбрать вариант «Запускать» независимо от того, вошел ли пользователь в систему или нет, используя этот API?

Я создал объекты action, trigger, principal и settings и передал их Register-ScheduledTask, как показано ниже:

$action = New-ScheduledTaskAction -Execute foo.exe -Argument "bar baz"
$trigger = New-ScheduledTaskTrigger -Once -At $startTime -RepetitionInterval (New-TimeSpan -Minutes 1) -RepetitionDuration ([Timespan]::MaxValue)
$principal = New-ScheduledTaskPrincipal -UserId "$($env:USERDOMAIN)\$($env:USERNAME)" -LogonType ServiceAccount
$settings = New-ScheduledTaskSettingsSet -MultipleInstances Parallel

Register-ScheduledTask -TaskName $taskName -TaskPath "\my\path" -Action $action -Trigger $trigger -Settings $settings -Principal $principal

Когда я создаю такую ​​запланированную задачу, по умолчанию она имеет значение «Запускать, только когда пользователь вошел в систему».

Этот вопрос показывает, как это сделать с помощью COM-объектов, а этот с помощью schtasks.exe, но как это сделать с помощью командлетов *-ScheduledTask*?


person Peter    schedule 20.12.2012    source источник


Ответы (6)


Вам нужно удалить $ Principal и зарегистрировать задачу с пользователем и паролем:

Register-ScheduledTask -TaskName $taskname `
                       -TaskPath "\my\path" `
                       -Action $action `
                       -Trigger $trigger `
                       -User "$env:USERDOMAIN\$env:USERNAME" `
                       -Password 'P@ssw0rd' `
                       -Settings $settings
person Shay Levy    schedule 20.12.2012
comment
Это именно то, что мне нужно. Спасибо. - person Peter; 21.12.2012
comment
Честно говоря, это был достойный ответ в то время, когда был задан вопрос. Однако это не выдержало испытания временем. Намного лучший вариант - это ответ ниже, который не требует встроенных учетных данных. Сегодня, когда все больше и больше автоматизируется (Chef, terraform и т. Д.), Получение учетных данных становится ненужной работой. - person iisystems; 24.04.2020
comment
дополнение: вы можете запросить у пользователя пароль, если вы устанавливаете эти задачи при входе в систему $user = $env:userdomain\$env:USERNAME, затем $credentials = Get-Credential -Credential $username, затем $password = $credentials.GetNetworkCredential().Password. тогда вы можете безопасно (?) передать пароль остальной части скрипта, чтобы он нигде не отображался. - person beep_check; 24.06.2020

Мне не нравится и не одобряется ответ с наивысшей оценкой в ​​настоящее время, так как тогда вы должны знать свои учетные данные в скрипте, чтобы сделать это, и не можете сделать это из чего-то вроде Packer или какой-либо другой системы / конфигурации автоматизации. Есть лучший / правильный способ сделать это, о котором Эюн упомянул, но не вдавался в подробности о том, как правильно настроить принципала для работы в качестве пользователя системы.

$action = New-ScheduledTaskAction -Execute foo.exe -Argument "bar baz"
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 1) -RepetitionDuration ([Timespan]::MaxValue)
$principal = New-ScheduledTaskPrincipal -UserID "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest
$settings = New-ScheduledTaskSettingsSet -MultipleInstances Parallel

Register-ScheduledTask -TaskName "tasknamehere" -TaskPath "\my\path" -Action $action -Trigger $trigger -Settings $settings -Principal $principal
person Farley    schedule 05.10.2016
comment
Я только что это обнаружил. Ваш ответ определенно работает лучше всего здесь! - person Christopher Cass; 27.03.2018
comment
@MarjanKalanaki В сети много по-настоящему плохих ответов ... но тут и там есть драгоценные камни, рад, что смог стать одним из них для некоторых из вас! :) Я знаю, что мне был нужен этот ответ. - person Farley; 15.06.2018
comment
Полезно для многих, но не в том случае, если вы не полностью доверяете выполняемой задаче. Я просто хочу сказать это. Управляемые учетные записи служб могут быть лучшим способом в этом случае, но в настоящее время я пытаюсь заставить это работать. - person Macke; 26.02.2020
comment
@Macke Вы должны просто иметь возможность использовать приведенный выше пример, но измените UserID на следующий ... -UserId 'MyNTDomain \ MyServiceAcctName' должно быть всем, что для него нужно человек - person Farley; 27.02.2020

Параметр «Запускать независимо от того, вошел ли пользователь в систему или нет» в графическом интерфейсе планировщика заданий эквивалентен New-ScheduledTaskPrincipal -LogonType S4U.

person Daniel    schedule 28.03.2016
comment
когда это установлено, пользователь не может взаимодействовать с локальными пользовательскими файлами - person turmuka; 20.02.2020

После того, как вы настроили задачу в графическом интерфейсе, запустите это

$task = Get-ScheduledTask "test task for notepad"
$task.Principal.LogonType = "Password"
Set-ScheduledTask $task
person user2449570    schedule 06.03.2020

также контролируйте проверку уровня запуска:

Уровень выполнения

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

например: "Наивысший" или "Ограниченный"

person Tilo    schedule 15.02.2016

У меня была аналогичная проблема при попытке создать запланированную задачу в Powershell для копирования файлов на подключенный диск.

Вот как я решил это:

Во-первых, мне пришлось использовать UNC-путь, чтобы указать путь к подключенному диску:

Get-ChildItem -Path "C:\MyFiles\*" -Include *.jpg -Recurse | Copy-Item -Destination "\\192.168.54.20\CopiedFiles"

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

$TaskName = "FileSync"
$Description = "This task will run periodically to sync .fin files from a specified source directory to a specified destination directory"
$ScriptPath = "C:\Users\my_userDesktop\file_sync.ps1"
$UserAccount = "COMP1\my_user"
$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-ExecutionPolicy Bypass -File $ScriptPath"
$Principal = New-ScheduledTaskPrincipal -UserID $UserAccount -LogonType ServiceAccount
$Trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 1) -RepetitionDuration ([System.TimeSpan]::MaxValue)
Register-ScheduledTask -TaskName $TaskName -Action $Action -Description $Description -Trigger $Trigger -Principal $Principal

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

Это все.

Надеюсь, это поможет

person Promise Preston    schedule 14.03.2021