WaaS 1809 TS Collection (1909 tested)

Update 2019.12.02 – Minor updates to the TS and Scripts.  Variables changed for 1909 and confirmed fine. – Check out more info HERE

OK, because I don’t have time to explain everything right now, but I know some people are eager to play with what they saw at MMS… here is the download.

For Documentation & Requirements, please continue to monitor the “WaaS” Page which I will continue to update with links as I blog each module.

19 Task Sequences, Several packages and a baseline.. it’s here…

WaaS TS Collection 2021.09.08 (37705 downloads )

I’ll be slowly posting information about this, which a deeper dive about the task sequences and how they work.

What’s included:  These TSs & Required Content (Minus the Upgrade Media)

  1. Pre-Cache Compat Scan TS:  This is the TS that you’d run first to get the content downloaded, and pull back information about the Compatibility Scan.
  2. In Place Upgrade TS: This TS runs the actual Upgrade.  It also adds several nested TSs to do various tasks, including setup Rollback & OS Uninstall protections.
  3. OS Uninstall TS: This TS allows you to go back to previous version of Windows 10.  It requires that you have done pre-work in the down level OS to make this work, which is already built into the OS Upgrade TS I’m supplying.. Blog: WaaS IPU – OSUninstall Module
  4. DeBug Mode TS:  This is used for troubleshooting your Task Sequences… Blog: Building a Better Debug Task Sequence
  5. Pre-Assessment & PreFlight Baseline & CIs… Blog: WaaS PreAssessment & PreFlight using Config Items

Major Changes from the last WaaS Task sequences I’ve posted

  • No longer using “SetOSDInfo” Script, now just writing information to the registry along the way, which then gets grabbed by hardware inventory.  I’ll try to blog this as well eventually.
  • Heavy use of Sub Task Sequences
  • Rollback Recovery / OS Uninstall
  • Splash Screen and other End User Experience enhancements.
  • Baseline Cab to import (Required for the PreFlight)
  • PRE-REQS: CM 1902 Client on Machine running IPU

Update 2019.05.30 – Changes to the Download due to Export Automation Process.

When you download the ZIP File, you’ll extract it and you’ll see the contents like so:

Then you’ll drill down to get each TS you want to import:

Same for Packages.  The Packages are now separate and contain the content needed.  Task Sequences are exported with no Content. (because who wants to download the 4GB Upgrade package, right?)

Ok, I’m sure you’ll have a lot of questions.. however I’ll try to answer them when I get time.  I’ll be slowly working on detailed information to blog about the process and task sequences, just might be awhile.

For more info, look at the ReadMe.txt inside of the Zip File.

YouTube Demo Videos:



So, now that all makes sense. Here is a list of the Nested Task Sequences called during the upgrade process.

  1. Splash Screen – Blogged: Windows Splash Screen for the Task Sequence Progress
    1. Kicks off that nifty Task Sequence Splash Screen
  2. PreFlights. – Blogged: WaaS PreAssessment & PreFlight using Config Items
    1. Execution and Internal Hard Blocker check
  3. CleanUp – Blogged: Clean Up Storage Pre Upgrade
    1. Triggered if less than 20GB free then runs random tasks to free up space
  4. Lock Screen Pre: Windows 10 Lock Screen
    1. Sets the Lock Screen image to “Upgrading” also sets Legal Text
    2. Creates a scheduled task to clean up the lock screen and legal text
  5. Recovery Rollback Pre: WaaS IPU – Rollback Recovery Module
    1. Copies scripts local for remediation
    2. Creates scheduled tasks that trigger to remediate Rollback
  6. OS Uninstall Pre: WaaS IPU – OSUninstall Module
    1. Creates scheduled tasks that trigger during OS Uninstall
    2. Creates other registry values required for the process
  7. Driver Variables: WaaS IPU – Rollback Recovery Module
    1. Maps Model of machine to Package of Drivers
  8. Download Driver Package
    1. Downloads the package of drivers evaluated from the last TS
  9. Pre Upgrade
    1. Runs Steps needed before the upgrade (disable 3rd Security, etc)
  10. Post Upgrade
    1. Runs Steps for remediating / restoring “stuff” after upgrade
  11. Post Upgrade Build #
    1. Similar to last, but these “fixes” are build specific
  12. Win 10 Customizations
    1. Lots of tweaks and mods to brand your machine
  13. Lock Screen Post
    1. Cleans up the Lock Screen image set before IPU
  14. OS Uninstall Post
    1. Removes the Scheduled Tasks needed for OS Uninstall
    2. Sets the OS Uninstall Window to 15 days (Default is 10)
  15. Recovery Rollback Post
    1. Removes the scripts & tasks needed for recovery
  16. Legal Text
    1. creates scheduled tasks to set the legal text to “Upgrade Successful” and back to the default.

So that’s a VERY HIGH Level of the WaaS IPU Task Sequence and all the Nested Task Sequences called during the process.

How hard to get setup and running:


50 thoughts on “WaaS 1809 TS Collection (1909 tested)”

  1. This is an *INCREDIBLE* set of powerful TS/imaging templates. Thank you for sharing these. They have been immensely helpful!

  2. Wheeeeee!!! I’ve been looking forward to this Gary. I don’t get to go to MMS but I try to follow along as much as possible. 🙂

  3. Good Stuff, I love it….
    For the PostUpgrade 1809, do you have specific fixes for 1803? Just curious since that’s what we are going to right now.

    • Sorry, I haven’t done any testing at all with 1803. Pretty sure the ones I’ve got for 1809 will be need for 1803 as well, if you’re coming from 1709.

  4. Is anyone else having issues importing this task sequence? I keep getting a ‘Failed to validate property PackageID.’ I think it has to do with the ‘OSD Module Windows 10 Driver Variables’ but I am not sure. Everything prior to the TS package imports successfully. Currently on CM1806.

  5. Thanks Gary this is great!

    One thing I seem to have stumbled upon is since you have the “Free Disk Space Check” step in the PreFlights Module your “Storage Cleanup” Module will never actually run…since the users are asked to cleanup the drive before the TS has a chance to clean anything up.

    I moved the “OSD Module for W10 IUP – CleanUp” to be right before the “OSD Module for W10 IPU – PreFlights” step.

    Please let me know if there is any reason I *shouldn’t* do that…or if im missing something!

    Thanks again, and great job!

    • I’ll look closer at this again soon. I know I had some logic associated with it, but I need to take another look an evaluate if it was purposeful, an oversight, or was planning on revisiting when I had time.

    • I’ve updated the TS today (Available for Download Now) to resolve that oversight, and include minor “repairs” if the TS had previous failures. Thanks for reminding me to loop back around to this.

      • Thanks! Trying to avoid having to re-download…i’ve already “personalized” a good chunk of this…do you keep a detailed changelog anywhere?

        • The Change Log is in the download itself. There is also a summary on the WaaS page.
          Go ahead and download and look through the logs / readme files in the zip file.

    • Try Now, I was testing out a different WordPress Download Manager today, looks like it conflicted with the original one.

  6. Hey Gary,

    Thanks so much for all this content, incredibly informative and inspiring to do better things! I’ve downloaded to have a play and one thing i noticed was when running the pre-cache compat scan TS, if there’s less than 20 GB free the TS just bombed out and i had to look through the SMSTS.log. The “Failure – Capture Failed Step Variables” set’s FailedStepName to %_SMSTSLastActionName% so i had expected “Check Readiness” to appear as the registry value, but it literally just stated %_SMSTSLastActionName% so i ended up just looking through the SMSTS.log. Is that meant to be the case?


    • Matt, as we discussed via Email, it was not having the 1902 Client on the Machine. Just Leaving the Comment in case someone else sees similar behavior, reminder to check client version.

      • Is it primarily the ‘Run PowerShell Script’ tasks that have a script entered directly on the task that require 1902 or are there other tasks/scripts that require 1902 as well? I have a client that is very interested in using this solution but they’re still on 1810 (recent upgrade in a CAS environment) at the moment. I thought about attempting to get it working with 1810, but I wasn’t sure if it was worth my time. Thanks for the awesome work!

        • No, the steps that rely on 1902, besides run powershell, is the steps for creating the error notification. 1902 clients require different input from 1810. It’s a simple change. Check out Adam Gross website, building a better task sequence, he explains the changes there.

        • Hi, Did you ever get it working? I’m in the same boat and I don’t know if we will be upgrading to 1902 anytime soon.

      • I’ll also add that I realize the Configuration Baseline is looking for the 1902 client. So I didn’t know if I could just remove that CI from the baseline and modify the PowerShell tasks for now.

  7. I was getting a invalid package error while trying to deploy the 1809 upgrade task sequence. I had all the child TSs deployed as well as all the content. It turned out that even though the child TSs were deployed and the Id’s were correct to my site ,I still needed to reset them all by manually selecting them in the task editor. Once I did that it deployed with no issue.

  8. Hey Gary,

    Great fun working through the wealth of stuff you have in here. I’ve started to have a look at your Pre-Flight checks, as one of things I like is the “soft blocker” to prompt Laptop users to plug into AC power and restart the TS. This works fine, but it doesn’t restart the awesome Splash Screen and instead takes you back to the “traditional” TS dialogue which i’d like to avoid. Is that a known issue??

    Also, the Splash screen would only show “Hi Team Member” for me so if anyone wants to use the logged on users name then you can replace the following (found in the “Create-FullScreenBackground-Variable.ps1” and “Create-FullScreenBackground.ps1″ scripts;

    $PrincipalContext = [System.DirectoryServices.AccountManagement.PrincipalContext]::new([System.DirectoryServices.AccountManagement.ContextType]::Domain, [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain())
    $GivenName = ([System.DirectoryServices.AccountManagement.Principal]::FindByIdentity($PrincipalContext,[System.DirectoryServices.AccountManagement.IdentityType]::SamAccountName,[Environment]::UserName)).GivenName

    #### with this;

    #Get logged on User
    $Loggedon = Get-WmiObject -ComputerName $env:COMPUTERNAME -Class Win32_Computersystem | Select-Object UserName
    #Split User and Domain
    $Domain,$User = $Loggedon.Username.split(‘\’,2)
    #Write-Host $Domain
    #Write-Host $User

    #Look up SamAccountName using LDAP query
    $search = [adsisearcher]”(&(ObjectCategory=Person)(ObjectClass=User)(samaccountname=$user))”
    $users = $search.FindAll()
    foreach($user in $users) {
    $GivenName = $user.Properties[‘DisplayName’]



    • Hey Matt, I also noticed that and made a change in my prod, but haven’t updated my lab with that change yet. Thanks for the note. Thanks for posting the code too. I kept ours more “generic”. People can get upset about seeing their name flash full size on the screen like that. I’ve heard it all… so we keep it generic.

    • I just the 2 Splash Screen steps (Set Deployment Screen and OSD Module – Splash Screen) right after the PreFlights TS step. I named it “Splash Screen After Retry” and set a task sequence variable “PreFlightRetry equals “True” This forces the splash screen OSD Module to run again, but only if there was a preflightretry.

      The reason it only shows “Hi Team Member” is because the script was looking at AD for the name of the account and since in the TS its running as system it defaults to the local value set in the script instead of whatever AD gives it.

      After thinking about it and showing it to one of my PMs, we felt more comfortable with a “generic” hello…there seems to still be some worry about AI knowing all too much about you or something…lol

    • Yes, you’d have to swap out the Variables that say 1809, and then do your testing. It should work fine though. I have done no testing with 1903, but will probably a lot with 1909 once that is released this fall.

  9. Suggestion for the “Delete OneDrive Link in Start menu” step in the Win10 Customizations TS:

    In your powershell command, it was only deleting the icon of the last profile in the users folder. We have a lot of machines with several user profiles, So I changed that step to run the following script so it deletes the onedrive link for all user profiles:

    $paths = Get-ChildItem -Directory -Force c:\users | Select-Object $_.Name

    ForEach ($path in $paths) {
    $File = “C:\users\$path\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk”
    If (Test-Path $file )
    Remove-Item -Path $file -Force -Verbose -ErrorAction SilentlyContinue

  10. Can we use this for Production as is and remove what we do not need

    is there anything proprietary that you or your organization use in these which we should be aware of before importing or using it in production environment

    • You can, highly recommend you run a lot of tests first. You probably don’t need everything, and you’ll have to replace quite a bit of references to “GARYTOWN”. I don’t have a completely list, I just say” Make sure you read through the scripts and don’t trust what you download on the internet”.

  11. Gary,

    This is an incredible resource you’ve put together. Even for those of us who don’t want to implement it specifically, it provides snippets & guidance to tackling WaaS in OSD.

    Bless you for providing this for free. You’re awesome.

  12. This might be a silly question but it should hopefully be easy to answer.

    Is this OK to run when coming from Windows 7 to get to Windows 10 1809?

    • Yes, but you’ll need to make some modifications to the Pre-Assessment Rules which block anything from upgrading that isn’t already on Windows 10. But yes, this should work fine, just do a bunch of testing.

  13. Great workGary! I am in the process of testing with Windows 10 (works great) and now Windows 7 (will let you know). Has anyone created any reports that pick-up the registry keys?

  14. Hi Gary, my Windows 7 testing had some issues that were a show stopper for me. Some of the Pre-flight powershell scripts are using ps5, so they will not work on a Windows 7 client. I am not sure that the logic being used can be modified for .net 4.5. I am looking for a different solution for our Windows 7 upgrades, most of these systems are being replaced anyway so it is not a problem for us. Still hoping that someone has reports for the registry keys that are being created. Thanks for sharing this great method, I am sure we will be using it for some time to come.

    • I’m having an issue when the preflight script runs:
      Exception calling “ParseExact” with “3” argument(s): “String was not recognized as a valid DateTime.” &
      At xxx\PreFlight-WaaSBaseline.ps1:76 char:1

      i’m suspecting because the output of the line 71 is empty, is there a workaround?

  15. Hey Gary, thanks for the amazing work. Is the OSD Library package missing? I had to disable that group in the win10 customization Child TS. Looks like this is for some Kiosk or something. not sure.

    Thanks Again,


    • Yes, it’s missing, but I should have removed it before exporting, just didn’t notice. Its for something completely different that I was playing around with for Recast Software. Just delete those steps.

      Many of the steps in the customization module are for OSD only and won’t make sense in the context of IPU.

  16. Hello, Gary,
    Things went smooth with Pre-Cache, but I got hit with this error on the Upgrade.

    Upon digging:

    .. cmcache\1w’
    Command line for extension .exe is “%1” %*
    Set command line: Run command line
    Working dir ‘C:\WINDOWS\ccmcache\1w’
    Executing command line: Run command line with options (0, 4)
    Process completed with exit code 4294967295

    Matched Processes
    Process Not Found: [TSProgressUI.exe]

    Exiting with [-1]
    Command line is being logged (‘OSDDoNotLogCommand’ is not set to ‘True’)
    Command line “C:\WINDOWS\ccmcache\1w\ServiceUI.exe” -process:TSProgressUI.exe C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File Show-OSUpgradeBackground-Variable.ps1 returned 4294967295
    ReleaseSource() for C:\WINDOWS\ccmcache\1w.
    reference count 1 for the source C:\WINDOWS\ccmcache\1w before releasing
    Released the resolved source C:\WINDOWS\ccmcache\1w

    The query of WMI: select __relpath from win32_process where caption = ‘explorer.exe’
    give me correct result.

    What am I missing? The package is distributed correctly. Cache file confirmed on the client. TS Notification is not Suppressed.

  17. Using parts of your TS and its really awesome!

    What are your thoughts about pending reboots prior to the task sequence running? By pending reboots, I mean component based servicing, pending windows updates, or pending file name operations.

    As of right now, I’m preventing the task sequence from running until all conditions are met – using Onevinn’s TSLaunch. We’re not prompting users to schedule the upgrade unless they don’t have pending reboots but that’s turning out to be a poor choice.

    • Pending Reboot… We currently only record that there is a pending reboot, we have not prevented upgrades if it was pending reboot. We discussed having the TS check for Pending Reboot (which is already does) but then reboot the machine instead of just record the pending reboot. We landed on just ignoring pending reboot, as we haven’t confirmed it actually being an issue.

      • Good to know it hasn’t been an issue for your deployments.

        I ended up settling on rebooting prior to the upgrade if pending reboots are detected. I don’t have evidence that this is actually necessary, but I figured it couldn’t hurt.

  18. Would you expect either the “OSUpgrade” or the “PreCache” options to work for a machine that’s talking to our CMG?

    Our clients are able to receive policies from our MP to talk to the CMG either when outside the network or on VPN. The Web Service is installed on our MP, and all driver packages have been distributed to the CMG. I’ve tried re-distributing one of the drivers I’m testing from home, but keep coming across this error in the ApplyDriverPackage.log:
    – Driver package content download process returned an unhandled exit code: -2147221246

    Though I’m able to make a connection to the webservice, and it successfully queries all models before coming across the right idenentity. It then attempts to download it, and we’re greeted with this:

    – Attempting to download content files for matched driver package: Drivers – Dell Latitude 5401 – Windows 10 x64
    – Setting task sequence variable OSDDownloadDownloadPackages to: 00268
    – Setting task sequence variable OSDDownloadDestinationLocationType to: Custom ApplyDriverPackage
    – Setting task sequence variable OSDDownloadDestinationVariable to: OSDDriverPackage
    – Setting task sequence variable OSDDownloadDestinationPath to: %_SMSTSMDataPath%\DriverPackage
    – Starting package content download process (FullOS), this might take some time
    – Driver package content download process returned an unhandled exit code: -2147221246
    – [ApplyDriverPackage]: Apply Driver Package process failed, please refer to previous error or warning messages

  19. We’re experiencing similar things and I’ve seen a few posts that PreCache does not seem to work through the CMG the way we’re doing it.

    • I haven’t done any testing over CMG, maybe in the future I’ll get around to it. Once I do, I’ll update the post with additional info for CMG.


Leave a Reply to gwblok Cancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.