如何使用 Powershell 禁用计划任务?

如何使用 Powershell 禁用计划任务?

我有一个在 Windows Server 2008 R2 上运行的 Web 应用程序,它有大量的计划任务,负责处理所有后端事务。当我进行涉及数据库的软件部署时,我需要禁用所有计划任务。目前,我有一个很长的清单,需要手动逐步执行,并在执行过程中禁用每个计划任务 - 这项工作肯定适合使用 Powershell 进行自动化。

不幸的是,Powershell 文档似乎对如何禁用现有的计划任务(当然,在发布成功完成后重新启用它)含糊其辞。我可以获得就绪、正在运行或已禁用任务的列表,但接下来该怎么做呢?

答案1

您可以使用基于 COM任务计划程序脚本对象

($TaskScheduler = New-Object -ComObject Schedule.Service).Connect("localhost")
$MyTask = $TaskScheduler.GetFolder('\').GetTask("My Task")
$MyTask.Enabled = $false

要再次启用该任务:

$MyTask.Enabled = $true

仅当 shell 权限提升且您是服务器上的本地管理员时,上述操作才有效。您可以使用上述操作创建自己的 cmdlet:

function Disable-ScheduledTask
{
    param([string]$TaskName,
          [string]$ComputerName = "localhost"
         )

    $TaskScheduler = New-Object -ComObject Schedule.Service
    $TaskScheduler.Connect($ComputerName)
    $TaskRootFolder = $TaskScheduler.GetFolder('\')
    $Task = $TaskRootFolder.GetTask($TaskName)
    if(-not $?)
    {
        Write-Error "Task $TaskName not found on $ComputerName"
        return
    }
    $Task.Enabled = $False
}

答案2

如果您只是想停止所有任务,那么停止任务计划程序服务可能更容易。ScheduledTasks 模块直到 Windows Server 2012 才可用,因此管理任务并不像停止和启动服务那么简单:

Stop-Service Schedule
Start-Service Schedule

如果这对你不起作用,你仍然可以从 PowerShell 中使用 schtasks.exe 来管理单个任务:

schtasks.exe /CHANGE /TN "My Task" /DISABLE
schtasks.exe /CHANGE /TN "My Task" /ENABLE

答案3

答案4

这太完美了!它比 Get-ScheduledTask 更好用,因为我处于 2008/2012 混合环境中。我添加了几行代码来查询 AD 并针对一组计算机调用此命令。我的目标是禁用每次用户登录时打开“服务器管理器”的任务。瞧!全部完成了!

$C=Get-ADComputer -SearchBase 'OU=Computers,dc=domain,dc=com' -Filter * | foreach {$_.name}

Invoke-Command $C {
($TaskScheduler = New-Object -ComObject Schedule.Service).Connect("$C")
$TaskScheduler.GetFolder('\Microsoft\Windows\Folder').GetTasks(0) | % {$_.Enabled = $false}
}

相关内容