Bobcares

Manage Scheduled Tasks with PowerShell – Let’s see the details

by | Apr 9, 2021

Wondering how to manage Scheduled Tasks with PowerShell? We can help you.

Most of us use the taskschd.msc graphical interface console to create and manage scheduled tasks on Windows.

However, in various scripts and automated flows, it is much more convenient to use the PowerShell features to create scheduled tasks.

As part of our Server Management Services, we assist our customers with several Windows queries.

Today, let us discuss Scheduled Tasks in detail.

 

Manage Scheduled Tasks on Windows via PowerShell

The ScheduledTasks PowerShell module is to manage scheduled tasks on Windows 10/Windows Server 2016.

To list the cmdlets in a module, we can run:

Get-Command -Module ScheduledTasks
* Disable-ScheduledTask
* Enable-ScheduledTask
* Export-ScheduledTask
* Get-ClusteredScheduledTask
* Get-ScheduledTask
* Get-ScheduledTaskInfo
* New-ScheduledTask
* New-ScheduledTaskAction
* New-ScheduledTaskPrincipal
* New-ScheduledTaskSettingsSet
* New-ScheduledTaskTrigger
* Register-ClusteredScheduledTask
* Register-ScheduledTask
* Set-ClusteredScheduledTask
* Set-ScheduledTask
* Start-ScheduledTask
* Stop-ScheduledTask
* Unregister-ClusteredScheduledTask
* Unregister-ScheduledTask

 

  • Create Scheduled Task with Windows PowerShell

In modern versions of PowerShell, to create them we can use the New-ScheduledTaskTrigger and Register-ScheduledTask cmdlets.

Suppose, we need to create a scheduled task to run at a specific time and execute some PowerShell script or command.

For instance, a scheduled task named StartupScript1 should run the PowerShell script file C:\PS\StartupScript.ps1 at 11:00 AM every day.

The task will execute with advanced privileges (checkbox “Run with highest privileges”) under the SYSTEM account.

$Trigger= New-ScheduledTaskTrigger -At 11:00am -Daily
$User= "NT AUTHORITY\SYSTEM"
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "C:\PS\StartupScript1.ps1"
Register-ScheduledTask -TaskName "StartupScript1" -Trigger $Trigger -User $User -Action $Action -RunLevel Highest –Force

A successful task creation will give us the status “Ready” appears. Now, it will run on the schedule.

If we enable PowerShell Execution Policy on our computer, we can run a PowerShell script from a scheduled task with the –Bypass parameter.

We need to use the below code while creating a new task:

$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument “-NoProfile -NoLogo -NonInteractive -ExecutionPolicy Bypass -File C:\PS\StartupScript.ps1"

For the task to run every time during the computer startup, the first command has to be:

$Trigger= New-ScheduledTaskTrigger -AtStartup

If we want to run a task when a user logs on:

$Trigger= New-ScheduledTaskTrigger -AtLogon

Make sure to open the taskschd.msc console to check a new scheduler task in the Task Scheduler Library.

In Powershell 2.0, to create a scheduled task from PowerShell, we can use the Schedule.Service COM interface.

Here, we create a scheduled task that will execute the specific file containing the PowerShell script during startup. The task performs with the NT AUTHORITY\SYSTEM privileges.

$TaskName = "NewPsTask"
$TaskDescription = "Running PowerShell script from Task Scheduler"
$TaskCommand = "c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe"
$TaskScript = "C:\PS\StartupScript.ps1"
$TaskArg = "-WindowStyle Hidden -NonInteractive -Executionpolicy unrestricted -file $TaskScript"
$TaskStartTime = [datetime]::Now.AddMinutes(1)
$service = new-object -ComObject("Schedule.Service")
$service.Connect()
$rootFolder = $service.GetFolder("\")
$TaskDefinition = $service.NewTask(0)
$TaskDefinition.RegistrationInfo.Description = "$TaskDescription"
$TaskDefinition.Settings.Enabled = $true
$TaskDefinition.Settings.AllowDemandStart = $true
$triggers = $TaskDefinition.Triggers
#http://msdn.microsoft.com/en-us/library/windows/desktop/aa383915(v=vs.85).aspx
$trigger = $triggers.Create(8)

 

  • How to View and Run Scheduled Tasks with PowerShell

We can list all active scheduled tasks on Windows with the command:

Get-ScheduledTask -TaskPath | ? state -ne Disabled

To get information about a specific task:

Get-ScheduledTask CheckServiceState| Get-ScheduledTaskInfo
LastRunTime : 4/7/2021 10:00:00 AM
LastTaskResult : 267011
NextRunTime : 4/8/2021 10:00:00 AM
NumberOfMissedRuns : 0
TaskName : CheckServiceState
TaskPath : \
PSComputerName :
Get-ScheduledTaskInfo powershell

We can disable this task via:

Get-ScheduledTask CheckServiceState | Disable-ScheduledTask

On the other hand, to enable a task:

Get-ScheduledTask CheckServiceState | Enable-ScheduledTask

To run the task immediately (without waiting for the schedule), we run:

Start-ScheduledTask CheckServiceState

Then to completely remove a task from the Task Scheduler library:

Unregister-ScheduledTask -TaskName CheckServiceState

If we need to change the username from which the task launch and for example, the compatibility mode, use the Set-ScheduledTask cmdlet:

$task_user = New-ScheduledTaskPrincipal -UserId woshub\j.abrams' -RunLevel Highest
$task_settings = New-ScheduledTaskSettingsSet -Compatibility 'Win8'
Set-ScheduledTask -TaskName CheckServiceState_PS -Principal $task_user -Settings $task_settings

However, f we receive the error:

Set-ScheduledTask: No mapping between account names and security IDs was done

Make sure the username is correct..

 

  • How to Export and Import Scheduled Tasks via XML Files

With PowerShell we can export the current settings of any scheduled task into a text XML file. Hence, we can export the parameters of any task and deploy it to other computers.

We can export it both from the Task Scheduler GUI and from the PowerShell console.

To export the task with the name StartupScript to the file StartupScript.xml, we run:

Export-ScheduledTask StartupScript | out-file c:\tmp\StartupScript.xml

SInce the Export-ScheduledTask cmdlet is not available in PowerShell 2.0, we use the built-in tool schtasks to export the task settings and redirect the result into a text file:

schtasks /query /tn "NewPsTask" /xml >> "c:\tmp\NewPsTask.xml"

Once the tasks export to the XML file, we can import it to any network computer using the GUI, SchTasks.exe or PowerShell.

Register-ScheduledTask cmdlet can help us to import task settings from an XML file and register it:

Register-ScheduledTask -Xml (Get-Content “\\mun-fs01\public\NewPsTask.xml” | out-string) -TaskName "NewPsTask"

In PowerShell 2.0, it is easier to import a task using the schtasks tool:

schtasks /create /tn "NewPsTask" /xml "\\Srv1\public\NewPsTask.xml" /ru corp\skrutapal /rp Pa$$w0rd
schtasks /Run /TN "NewPsTask"

Take note that this example uses the credentials of the account that is used to run the task. If it doesn’t specify the credentials, because they are not stored in the job, they will request when importing.

[Need hep with the process? We’d be happy to assist]

 

Conclusion

In short, it is much more convenient to use the PowerShell features to create scheduled tasks. Today, we saw how our Support Techs perform this.

PREVENT YOUR SERVER FROM CRASHING!

Never again lose customers to poor server speed! Let us help you.

Our server experts will monitor & maintain your server 24/7 so that it remains lightning fast and secure.

GET STARTED

var google_conversion_label = "owonCMyG5nEQ0aD71QM";

3 Comments

  1. Tor

    There wasn’t a good way to update the Description field, so I made a function for it. Hope it helps someone out one day…

    function Set-ScheduledTaskDescription {
    param(
    [Parameter (Mandatory = $true)] [String]$TaskName,
    [Parameter (Mandatory = $true)] [String]$TaskDescription,
    [Parameter (Mandatory = $false)] [String]$UserAccount,
    [Parameter (Mandatory = $false)] [String]$Password
    )

    $TASK_CREATE_OR_UPDATE = 6
    $TASK_LOGON_INTERACTIVE_TOKEN = 3
    $XmlTask = $null
    $TS = New-Object -ComObject Schedule.Service
    $TS.Connect()
    $TaskFolder = $TS.GetFolder(“\”)
    $Tasks = $TaskFolder.GetTasks(1)
    foreach($Task in $Tasks){
    if($Task.Name -eq $TaskName){
    [xml]$XmlTask = $Task.Xml
    $XmlTask.Task.RegistrationInfo.Description = $TaskDescription
    $MyTask = $TS.NewTask($null)
    $MyTask.XmlText = $XmlTask.OuterXml

    $TaskFolder.RegisterTaskDefinition($Task.Name, $MyTask, $TASK_CREATE_OR_UPDATE, $UserAccount, $Password, $TASK_LOGON_INTERACTIVE_TOKEN)
    }
    }
    }

    Set-ScheduledTaskDescription -TaskName ‘Already Existing Scheduled-Task-Job-Name’ -TaskDescription ‘My New Description’

    Reply
    • zesteph

      thanks a lot for function.
      Work when description is not empty.
      But if you have nothing in description schedule task, that not work 🙁

      Reply
      • Hiba Razak

        Hi,
        Please contact our support team via live chat(click on the icon at right-bottom).

        Reply

Submit a Comment

Your email address will not be published. Required fields are marked *

Never again lose customers to poor
server speed! Let us help you.