设置计划任务以在用户未登录时运行

时间:2012-12-20 05:41:54

标签: powershell scheduled-tasks powershell-v3.0 windows-server-2012

我一直在使用Powershell Scheduled Task Cmdlets在我们的服务器上创建计划任务。

如何使用此API选择“运行用户是否已登录?”

我已创建actiontriggerprincipalsettings个对象,并将其传递给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

当我创建这样的计划任务时,默认为“仅在用户登录时运行”。

This question显示如何使用COM对象,this one使用schtasks.exe,但如何使用*-ScheduledTask* cmdlet执行此操作?

6 个答案:

答案 0 :(得分:30)

我不喜欢或赞成目前评分最高的答案,因为您必须知道您在脚本中的凭据才能执行此操作,并且无法通过Packer或其他系统/配置自动化执行此操作。有一个更好/正确的方法来做这个,Aeyoun提到但没有详细说明哪个是正确设置主体作为系统用户运行。

$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

答案 1 :(得分:19)

您需要删除$ principal并使用用户和密码注册任务:

Register-ScheduledTask -TaskName $taskname `
                       -TaskPath "\my\path" `
                       -Action $action `
                       -Trigger $trigger `
                       -User "$env:USERDOMAIN\$env:USERNAME" `
                       -Password 'P@ssw0rd' `
                       -Settings $settings

答案 2 :(得分:13)

任务计划程序GUI中的“运行用户是否登录”选项等同于New-ScheduledTaskPrincipal -LogonType S4U

答案 3 :(得分:1)

在gui中设置好任务后,运行此

$task = Get-ScheduledTask "test task for notepad"
$task.Principal.LogonType = "Password"
Set-ScheduledTask $task

答案 4 :(得分:0)

还控制运行级别检查:

运行级别

  

指定运行任务所需的权限级别   与校长联系。

例如:“最高”或“有限”

答案 5 :(得分:0)

我在尝试在 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 对于同步到映射驱动器的计划作业非常重要。 >

仅此而已。

我希望这会有所帮助

相关问题