我一直在使用Powershell Scheduled Task Cmdlets在我们的服务器上创建计划任务。
如何使用此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
当我创建这样的计划任务时,默认为“仅在用户登录时运行”。
This question显示如何使用COM对象,this one使用schtasks.exe,但如何使用*-ScheduledTask*
cmdlet执行此操作?
答案 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
对于同步到映射驱动器的计划作业非常重要。 >
仅此而已。
我希望这会有所帮助