从足够高的命令提示符下,我可以禁用任何任务的运行,例如使用
C:\WINDOWS\system32>schtasks /Change /Disable /TN "\Microsoft\Windows\UpdateOrchestrator\Reboot"
SUCCESS: The parameters of scheduled task "\Microsoft\Windows\UpdateOrchestrator\Reboot" have been changed.
C:\WINDOWS\system32>whoami
nt authority\system
但是我怎样才能切换“唤醒计算机以运行此任务”位,因为它在 GUI 任务计划程序中被调用,但是从命令行?我查看了帮助页面,schtasks /change /?
但没有找到与“唤醒计算机”位切换相同的选项。那么有没有办法使用schtasks
或其他命令行实用程序(最好是内置的)来切换该选项?
显然可以将任务描述导出为 XML,删除它(这一步实际上是必要的——否则你会得到ERROR: Cannot create a file when that file already exists
),编辑 XML 描述以删除有问题的部分,然后重新创建/导入它。这两项操作(导出到 xml 和从 xml 导入)都可以用schtasks
... 完成。我可以确认这有效:
C:\WINDOWS\system32>schtasks /query /xml /TN "\Microsoft\Windows\UpdateOrchestrator\Reboot" > C:\tools\reboot-task.xml
C:\WINDOWS\system32>schtasks /delete /TN "\Microsoft\Windows\UpdateOrchestrator\Reboot"
WARNING: Are you sure you want to remove the task "\Microsoft\Windows\UpdateOrchestrator\Reboot" (Y/N)? Y
SUCCESS: The scheduled task "\Microsoft\Windows\UpdateOrchestrator\Reboot" was successfully deleted.
REM edit the file C:\tools\reboot-task.xml and change <WakeToRun>false</WakeToRun>
C:\WINDOWS\system32>schtasks /create /xml C:\tools\reboot-task.xml /TN "\Microsoft\Windows\UpdateOrchestrator\Reboot"
SUCCESS: The scheduled task "\Microsoft\Windows\UpdateOrchestrator\Reboot" has successfully been created.
请注意,为了能够创建以 SYSTEM 身份运行的任务,您需要具有 SYSTEM 身份,即从适当提升的提示符下运行(仅以管理员身份运行不起作用)。结果:
但是有没有更简单的方法,仍然通过命令行?
答案1
SCHTASKS 无法调用 Scheduler 2.0+ 功能,其中包括“唤醒机器来运行此任务”。
如果您想从命令行执行此操作,则需要使用 Powershell cmdlet 进行设置。您仍然可以通过使用 Powershell.exe 从命令提示符运行 Powershell cmdlet。或通过运行 powershell 脚本 (.ps1)
类似下面的代码就可以实现:
$task=Get-ScheduledTask -TaskPath "\Microsoft\Windows\UpdateOrchestrator\Reboot"
$task.Settings.WakeToRun =$True
$task | Set-ScheduledTask -user "Username" -Password "Password"
这些命令的其他参考资料在这里 -https://docs.microsoft.com/en-us/powershell/module/scheduledtasks/get-scheduledtask?view=win10-ps 和https://ss64.com/ps/scheduler.html 有关 schtasks 不兼容性的详细信息请参见此处 -https://ss64.com/nt/schtasks.html
答案2
这个想法很好,但是 elaverick 提供的语法稍微不正确;您需要一个带有前导斜杠和尾随斜杠的任务路径以及指定的任务名称,例如(在这里以相反方向切换):
PS> $tsk = Get-ScheduledTask -TaskPath "\Microsoft\Windows\UpdateOrchestrator\" -TaskName "Reboot"
PS> $tsk.Settings.WakeToRun
False
PS> $tsk.Settings.WakeToRun = $True
PS> $tsk | Set-ScheduledTask
任务描述(类/对象)包含用户(作为Principal
),因此您实际上不需要指定它,除非您想要一个与Get
对象时保存的内容不同的用户。
PS> $tsk.Principal
DisplayName :
GroupId :
Id : Author
LogonType : ServiceAccount
RunLevel : Limited
UserId : SYSTEM
ProcessTokenSidType : Default
RequiredPrivilege :
PSComputerName :
实际上,如果您不指定而只指定,则Get-ScheduledTask
实现某种(递归、深度)搜索。请注意名称TaskPath
TaskName
一定不包含触发此搜索的路径:
PS> Get-ScheduledTask -TaskName "Reboot"
TaskPath TaskName State
-------- -------- -----
\Microsoft\Windows\UpdateOrchestrator\ Reboot Disabled
我不确定如果在不同的路径中有多个同名的任务而你没有指定路径会发生什么;我猜你得到一个数组,因为这就是你在没有任务名称的情况下得到的结果,例如,它Get-ScheduledTask | where {$_.Settings.WakeToRun}
对于查找可能唤醒你的计算机的所有任务很有用。
另外:请注意Enable-ScheduledTask
(及其Disable
对立面)不要有这种深度搜索行为Get
,例如
Enable-ScheduledTask -TaskName "Reboot"
失败,但是
Get-ScheduledTask -TaskName "Reboot" | Enable-ScheduledTask
成功,同样如此
Enable-ScheduledTask -TaskPath "\Microsoft\Windows\UpdateOrchestrator\" -TaskName "Reboot"