Task Sequence and shutdown (not reboot) a computer and continue

For some reason there is a requirement to do a computer shutdown (not restart) while running a task sequence, and once the computer starts again there is a need to continue running the task sequence where we left it.

How do you go about that? Let’st start…

image

We need two scripts, a task sequence with the ability to run one script and then to start a task sequence controlled restart.

For testing purposes a networkshare was used instead of leveraging a package, but in real-life and in production – all of the files can be placed in a package and executed from there.
This concept is tested within WinPE (using Winpeutil etc…), but you can most likely adapt it to a Windows installation.

Run Monitor

The ‘Run Monitor’ step will kick off a VB-Script that will start a powershell script – and then exit. Simple enough to start a script, and then allow the task sequence to continue with the next steps

image

VBScript
Runapp "powershell.exe","-noprofile -executionpolicy bypass -file " & GetScriptPatH() & "shutdown.ps1"

Private Function RunApp(AppPath,Switches)
Dim WShell
Dim RunString
Dim RetVal
Dim Success

On Error Resume Next

Set WShell=CreateObject("WScript.Shell")

RunString=Chr(34) &AppPath & Chr(34) & " " & Switches
Retval=WShell.Run(RunString,0,False)

RunApp=Retval

Set WShell=Nothing
End Function

Private Function GetScriptPath
GetScriptPath=Replace(WScript.ScriptFullName,WScript.ScriptName,"")
End Function

The powershell-script (shutdown.ps1) looks as follows;

  1. Create a TS Environment (so we can read variables)
  2. Verify if the variable _SMSTSBootStagePath is set
  3. If the drive-part is longer than a single-letter – we know that the boot-image is prepared and that the reboot countdown has started.
Powershell
$end =$true
write-output "start"

DO
{
start-sleep 2
Get-date
#Remove-Variable -name tsenv -Force -ErrorAction SilentlyContinue
if (!$tsenv) {
try  {
$tsenv = New-Object -COMObject Microsoft.SMS.TSEnvironment
}
catch {
write-output "No TS started yet"
}
}
try  {
$bootpath = $tsenv.Value("_SMSTSBootStagePath") -split ":"
$tsenv.Value("_SMSTSBootStagePath")
if ($bootpath[0].length -gt 1) {
write-output "SMSTSBootStagePath prepped for reboot"
$end = $false
}
}
catch {
write-output "variable not set"
}

} While ($end -eq $true)

start-sleep 5

wpeutil shutdown

Restart

The restart step is fairly generic and you can configure it as you need. A thing to note is that the time-out needs to be higher than the start-sleep within the Powershell-script. As the purpose is to continue within WinPE – the step is configured to start to the boot-image.

image

8 thoughts on “Task Sequence and shutdown (not reboot) a computer and continue

  1. Carlos Reply

    Hello,

    Can’t find the variable “_SMSTSBootStagePath” o SCCM. The powershell fails to execute, as it stays on a loop.
    What I’m I missing?

    • nickekallen Post authorReply

      Once a reboot action within a TS is started – what variables do exist?

  2. Roger Reply

    Hey nickekallen
    I am using a Task Sequence for Software update Installation on a Server which already is set up.
    Your approach is working if a user is logged in, but when no user is logged in, there is no Notify Timeout and the “Restart Computer” Task fires immediately.

    Do you have any idea how I could also wait with no user logged in?

    thx

  3. John Caviani Reply

    Fantastic, I finally got my Lenvo BIOS updates working in WinPE due to these scripts. I have combined the downloads made by the Driver Automation Tool, a Powershell script I wrote to install them in their downloaded form and your scripts to update Lenovo BIOS in the WinPE stage of an SCCM task sequence. I have modified my Poweshell script to also do HP and Dell using the downloads from the Driver Automation Tool. (I didn’t want to use the SCCM web service in their tool so I created an alternate method using strictly the downloads produced from their script)

Leave a Reply

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