Automatically resuming Windows PowerShell Workflow jobs at logon

Automatically resuming Windows PowerShell Workflow jobs at logon

Rate This
  • Comments 3

PowerShell Workflow helps IT Pros automate the long running tasks, or workflows, that can affect multiple managed computers or devices at the same time. Windows PowerShell Workflow is designed to be robust and recoverable. The features that are built into Windows PowerShell allow you to restart the target computers and, if the workflow is not yet complete, to reconnect to the target computers automatically and continue with the workflow commands. You can even restart the computer that is running a workflow, which allows you to run the workflow on the local computer, or include the local computer in the list of target computers. As you might know, a PowerShell workflow job is suspended when the local machine restarts as part of the workflow job execution, among other reasons, like user-initiated reboot. In this case, IT Pros need to resume the suspended jobs manually after machine restart.

This blog post shows how one can automatically resume the suspended workflow jobs at user logon using PowerShell Scheduled Tasks cmdlets.

For reference: In PowerShell Workflow, every user gets a unique workflow job store path based on

  • Endpoint or console
  • User context
  • Authentication mechanism
  • Elevated or non-elevated
  • Interactive or non-interactive

Resuming workflow jobs works only when the store path is same in both the start and resume operations.

For example: You must connect to the workflow session to resume the workflow jobs created and suspended in a workflow session.

Workflow jobs started in an interactive PowerShell console are not visible in non-interactive PowerShell consoles. Because of this, scheduling a task to run at machine startup cannot find suspended jobs from a non-interactive console. Scheduled tasks cannot find the WF jobs to resume, unless you are logged on to an interactive session.

 

Use the following example to resume the suspended workflow jobs automatically at user logon.

1.       Define the workflow and create a startup script.

 

PS C:\windows\system32> Get-Content c:\AutoResumeWFJob\Start-WFJob.ps1

 

    Remove-Item C:\AutoResumeWFJob\beforeSuspend.txt -ErrorAction SilentlyContinue

    Remove-Item C:\AutoResumeWFJob\afterResume.txt -ErrorAction SilentlyContinue

 

    workflow test-restart

    {

     InlineScript {Get-Date | Out-File -FilePath C:\AutoResumeWFJob\beforeSuspend.txt}

 

     # Suspend using Restart-Computer activity or Suspend activity

     Restart-Computer -Wait

 

     InlineScript {Get-Date | Out-File -FilePath C:\AutoResumeWFJob\afterResume.txt}

    }

 

    $job = test-restart -asjob

 

    Wait-job $job

 

PS C:\windows\system32> 

 

2.       Create the resume job script.

 

PS C:\windows\system32> Get-Content c:\AutoResumeWFJob\Resume-WFJob.ps1

 

    Import-Module –Name PSWorkflow

    $jobs = Get-Job -state Suspended

    $resumedJobs = $jobs | resume-job -wait

    $resumedJobs | wait-job

 

PS C:\windows\system32> 

 

3.       Register a scheduled task to resume the workflow job at user logon.

 

$resumeActionscript = '-WindowStyle Normal -NoLogo -NoProfile -File "c:\AutoResumeWFJob\Resume-WFJob.ps1"'

Get-ScheduledTask -TaskName ResumeWFJobTask –EA SilentlyContinue | Unregister-ScheduledTask -Confirm:$false

$act = New-ScheduledTaskAction -Execute "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Argument $resumeActionscript

$trig = New-ScheduledTaskTrigger -AtLogOn -RandomDelay 00:00:55

Register-ScheduledTask -TaskName ResumeWFJobTask -Action $act -Trigger $trig -RunLevel Highest

 

4.       Start the workflow, which restarts the local machine. 

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle Normal -NoLogo -NoProfile -NoExit -File "c:\AutoResumeWFJob\Start-WFJob.ps1"

 

5.       Verify the suspended workflow was resumed after logon, by looking for afterResume.txt.

 # Wait for the registered scheduled task to be finished after logon

# I waited for 60 sec

Sleep 60

dir c:\autoresumewfjob\afterResume.txt 

Get-Content c:\autoresumewfjob\afterResume.txt 

# Check the workflow job in completed state

Import-Module PSWorkflow

Get-Job

 

As you see in this example, automatically resuming suspended workflow jobs works by scheduling a task to run at user logon.

 

Manikyam Bavandla [MSFT]

Windows PowerShell Development

 

Leave a Comment
  • Please add 1 and 4 and type the answer here:
  • Post
  • Great Tip!!!

  • In the Start-WFJob.ps1, do last 2 rows:

    ~~~

       $job = test-restart -asjob

       Wait-job $job

    ~~~

    make any sense? Does it make any sense in this example to wait for the job which is not going to happen, because Restart-Computer will restart the computer and after that only workflow will survive and will be resumed and the script will be just out the question and this 2 rows after restart will not exist and work...

    The only row we need after the workflow definition is:

    ~~~

    test-restart -asjob

    ~~~

    and then we should just let the script to finish. Please correct me if I'm wrong.

  • @aakondrashov - "Wait-Job $job" is required, otherwise the PowerShell process, in step 4, will be exited just after creating the workflow job. Wait needed to ensure that Restart-Computer activity gets executed.

Page 1 of 1 (3 items)