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

10 Comments

  1. Roger said:

    Thank you very much, exactly what I was looking for 🙂

    January 18, 2018
    Reply
  2. Carlos said:

    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?

    January 30, 2018
    Reply
    • nickekallen said:

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

      January 30, 2018
      Reply
  3. Roger said:

    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

    February 5, 2018
    Reply
    • nickekallen said:

      Hello,

      As stated within the blog-post the above is only tested within WinPE (I suppose it has no user logged on?). I am not used to the restart occuring immediately if no user is logged on within a Windows installation – the timeout should still occur?

      February 5, 2018
      Reply
  4. John Caviani said:

    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)

    April 4, 2018
    Reply
    • Oliver said:

      John, it sounds like you are doing exactly what I am trying to do. Did these scripts above work for you with no modification? I copied and pasted and set up the TS the same and am getting a CScript Error: Execution of the Windows Script Host failed. (Not enough memory resources are available to complete this operation.)
      then
      Failed to run the action
      Incorrect function. (Error: 00000001;Source: Windows)

      August 2, 2018
      Reply
      • Oliver said:

        Okay, so I eventually figured it out. Very unhelpful error messages. I used F8 to get to the command prompt and ran the script just fine with the same command line in the smsts.log file so the script was fine.
        It ended up being that I put both scripts in a subfolder of an existing small package. It appeared to be found and using cscript subfolderrun.vbs appeared to work but it wasn’t. Once I got rid of the subfolder it worked. Strange but I’ll take it.
        Thanks for sharing this nickekallen! I would not have figured this out on my own to get these Lenovo BIOS updates using flash.cmd to work.

        August 3, 2018
        Reply

Leave a Reply

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