Skip to main content

This example creates a Windows Scheduled Task for operations that require a local administrative token.

function Create-BoxstarterTask{
<#
.SYNOPSIS
Creates a Scheduled Task for Boxstarter operations that require a local
administrative token

.DESCRIPTION
Create-BoxstarterTask creates a scheduled task.  This task is present
throughout a boxstarter installation process and is used when Boxstarter
needs to complete a task that cannot use a remote token. This function
does not run the task. It simply creates it.

.Parameter Credential
The credentials under which the task will run.

.LINK
https://boxstarter.org
Invoke-FromTask
Remove-BoxstarterTask

#>
    param([Management.Automation.PsCredential]$Credential)
    Remove-BoxstarterError {
        if($Credential.GetNetworkCredential().Password.length -gt 0){
            schtasks /CREATE /TN 'Temp Boxstarter Task' /SC WEEKLY /RL HIGHEST `
                /RU "$($Credential.UserName)" /IT /RP $Credential.GetNetworkCredential().Password `
            /TR "powershell -noprofile -ExecutionPolicy Bypass -File $env:temp\BoxstarterTask.ps1" /F | Out-Null

            #Give task a normal priority
            $taskFile = Join-Path $env:TEMP RemotingTask.txt
            Remove-Item $taskFile -Force -ErrorAction SilentlyContinue
            [xml]$xml = schtasks /QUERY /TN 'Temp Boxstarter Task' /XML
            if($xml.Task.Settings.Priority -eq $null) {
                $priority = $xml.CreateElement("Priority", "http://schemas.microsoft.com/windows/2004/02/mit/task")
                $xml.Task.Settings.AppendChild($priority)
            }
            $xml.Task.Settings.Priority="4"
            $xml.Save($taskFile)
            schtasks /CREATE /TN 'Boxstarter Task' /RU "$($Credential.UserName)" /IT /RP $Credential.GetNetworkCredential().Password /XML "$taskFile" /F | Out-Null
            schtasks /DELETE /TN 'Temp Boxstarter Task' /F | Out-Null
        }
        elseif(!((schtasks /QUERY /TN 'Boxstarter Task' /FO LIST 2>&1) -contains 'Logon Mode:    Interactive/Background')) { #For testing
            schtasks /CREATE /TN 'Boxstarter Task' /SC WEEKLY /RL HIGHEST `
                    /RU "$($Credential.UserName)" /IT `
            /TR "powershell -noprofile -ExecutionPolicy Bypass -File $env:temp\BoxstarterTask.ps1" /F |
                    Out-Null
        }
    }
    if($LastExitCode -gt 0){
        throw "Unable to create scheduled task as $($Credential.UserName)"
    }
}