Windows 10 with SCCM 2012 R2 (non SP1)

Need to deploy Windows 10 but don’t have the latest Service Pack installed with SCCM? No problem!

Before Windows 10 was released, we were one of many organizations testing Windows 10 within our production environment. With the preview of build 10049, the SCCM Client no longer worked! Looking at the ccmsetup logs an error was indicated when attempted to install the Windows Update Agent. I discovered a solution posted by Jorgen Nilsson (@ccmexec) who simply mentioned to skip this pre-requisite when launching ccmexec.

ccmexec.exe / /skipprereq:windowsupdateagent30-x64.exe

And Voila! now you can get a client installed. However, as the OSD guy at my company, I was wanting to use OSD to deploy the OS with the full client and not have to worry about failures or any other issues with the Client during the OSD Process. Depending on you deployment scenario (In-Place Upgrade, Bare Metal, Build and Capture) you’ll need to do something slightly different!

Now, if you’ve upgraded to SCCM 2012 R2 SP1 (or SCCM 2012 SP2) this logic is already built-in. Crack open the that’s with your SCCM Client Source Media. Inside is a xml file. Open it up.

SCCM 2012 R2 CU4:

<Item FileHash="D500A5B5945FAFC6A52FB54B7169B62C6C1137E1694184FF2EFF790AA1394ECE" FileName="x64/WindowsUpdateAgent30-x64.exe">
   <Applicability OS="ALL" Platform="X64">
   <Discovery Identifier="%windir%\system32\wuapi.dll" Type="File">
      <Property Operator=">=" Name="Version">7.4.7600.226</Property>
   <Installation OptionalParams="/quiet /norestart" InstallationType="EXE" Order="3"/>

Now if we take a look at SCCM 2012 R2 SP1:

<Item FileHash="D500A5B5945FAFC6A52FB54B7169B62C6C1137E1694184FF2EFF790AA1394ECE" FileName="x64/WindowsUpdateAgent30-x64.exe">
   <Applicability OS="<10" Platform="X64">
   <Discovery Identifier="%windir%\system32\wuapi.dll" Type="File">
      <Property Operator=">=" Name="Version">7.4.7600.226</Property>
   <Installation OptionalParams="/quiet /norestart" InstallationType="EXE" Order="3"/>

Difference being the Applicability tag which with the Service Pack installed (and Microsoft support for Windows 10) we see that the WUAgent is skipped all together, so, skipping it really doesn’t hurt you at all as far as the client goes.

Obviously though, you SHOULD be making plans to get this Service Pack installed, that way you can avoid these workarounds and have full support from Microsoft when deploying!

Build and Capture or Bare Metal

Armed with the information above, for a Task Sequence where you’re not running setup.exe (Build and Capture/Bare Metal/Hardlink) all you need is to add the “/skipprereq” line from above with your “Setup Windows and Config Manager”:

Installation properties: /skipprereq:windowsupdateagent30-x64.exe


In-Place Upgrade

This is a bit different since the In-Place Upgrade scenario doesn’t use the Setup Windows and Config Manager Step, however, the same fix applies.

Download the Upgrade Task Sequence found in this TechNet blog by Aaron Czechowski. When you import this into SCCM 2012, a few packages are created, on of which is called “Windows vNext Upgrade Scripts”. If you try to run the Upgrade Windows Task Sequence on a non-service pack SCCM install, you’ll see Windows Setup sit at 100% for a VERY long time, and then potentially rollback or fail out all together. If you look at the logs you’ll see errors pointing at the Windows Update Agent.

Make a copy of this directory and create yourself a revised “Windows vNext Upgrade Scripts”; this way when you do get the Service Pack installed (And you should soon!) you’re just flipping a package reference! The Upgrade Scripts are referenced by Windows Setup.exe. Look at the “Upgrade Windows” Step of this task sequence

Setup.exe /Auto:Upgrade /Quiet /NoReboot /DynamicUpdate Disable /PostOobe %SystemDrive%\_vNextUpgrade /PostRollback %SystemDrive%\_vNextUpgrade

What’s happening is when you specify the /PostOobe flag, its looking for a file “SetupComplete.cmd”; same logic applies for /PostRollback, which is looking for SetupRollback.cmd. (Feel free to have fun with that information!)

Now, cracking open SetupComplete.cmd, its essentially launching the powershell script SetupComplete.ps1. Edit SetupComplete.ps1 and look for this line:

$process = Start-Process $env:WinDir\ccmsetup\ccmsetup.exe -ArgumentList "/remediate:client" -Wait -NoNewWindow -PassThru

Modify it by injecting the skipprereq from above and you get this:

$process = Start-Process $env:WinDir\ccmsetup\ccmsetup.exe -ArgumentList "/remediate:client /skipprereq:windowsupdateagent30-x64.exe" -Wait -NoNewWindow -PassThru

Beautiful right? Well, almost. If you’ll be using this same package for 32-bit machines, you’ll need to exclude the x86 WUAgent, not the x64 one. Quick WMI call and you’re there:

if ((Get-WmiObject Win32_OperatingSystem).OsArchitecture -eq "64-bit")
   $process = Start-Process $env:WinDir\ccmsetup\ccmsetup.exe -ArgumentList "/remediate:client /skipprereq:windowsupdateagent30-x64.exe" -Wait -NoNewWindow -PassThru
   $process = Start-Process $env:WinDir\ccmsetup\ccmsetup.exe -ArgumentList "/remediate:client /skipprereq:windowsupdateagent30-x86.exe" -Wait -NoNewWindow -PassThru

Quick fix to help you get Windows 10 deployed while waiting for that Service-Pack to finally be installed!



Windows 10 Upgrade: Using USMT Hardlink

For those of us who have 32-bit Versions of Windows (whatever) floating around, you may have noticed that a lot of Hardware OEM’s are no longer providing 32-bit drivers for Windows 10. This creates an issue if/when you want to get those devices up to Windows 10. The In-Place Upgrade options built into the Windows 10 setup is amazing! However, it does not support 32-bit to 64-bit upgrade. Your best bet to getting this upgraded is to use whats called a USMT Hardlink and upgrade the OS.

What is USMT Hardlink?

USMT (User State Migration Tool) is a nice utility from Microsoft that is used to migrate a user profile from one operating system to the next. A USMT Hardlink deployment refers to a Windows OS Deployment (to the same hardware) where we’ll create a local offline copy of the user profile, apply the new OS (without cleaning the disk) and then injecting the user profile back to that machine. In the situation of say Windows XP to Windows 7, USMT Hardlink was our only option (As there was no In-Place Upgrade). The same goes for a 32-bit verions of Windows-whatever (7,8,8.1) to Windows 10 64-bit.

One thing to mention: Microsoft requires that for Windows 10 deployments, you have the appropriate Service Pack Installed. Now it is possible to do this without the Service Pack using a few small steps. I’ll include those steps with the process, look for “Without Service Pack“. If you do not have the Service Pack installed, you will need a system that has the Windows 10 ADK installed. We’ll need to pull some files and make some packages using that media.

Create the Task Sequence

  1. Once created, we’ll be deleting the whole thing, I’m running through this with you in case you need a Boot Image, MDT Package, USMT Package, or custom package created as this wizard will help you create those. If you already have these packages, feel free to create a custom Task Sequence and skip ahead.
  2. Make sure you have MDT 2013 installed with the ConfigMgr Integration setup, as well as the Windows ADK!
    Open the SCCM Console, Navigate to the Software Library Node, Expand Operating Systems.
  3. Right click “Task Sequence” and select “Create MDT Task Sequence”
  4. Select “Client Replace Task Sequence” and click Next.
  5. Name your task sequence appropriately, “Windows 10 64-bit (Hardlink)” works for me!
  6. Boot Image: Specify an existing or create a new.

    1. Without Service Pack: You’ll need a WinPE Image from the Windows 10 ADK which cannot be done 100% without the Service Pack. Specify whatever boot image you have for now. We’ll fix this later!
  7. MDT Package: Specify an existing package or create a new.
  8. USMT Package: Specify an existing package or create a new one.
    Without Service Pack: On the machine with the Windows 10 ADK Installed, copy the following folder to the network and use this source to create your USMT Package: “C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\User State Migration Tool
  9. Settings Package: Specify and existing or create a new. I use the vanilla Custom Settings Package for this; I’ll assume you are too.
  10. Review the Summary, and complete the wizard.


Boot Image:

If you’re running 2012 R2 SP1 (or 2012 SP2), then you should have the Windows 10 ADK installed on your server so new Boot Media should be a breeze. If, however, you do NOT have the Service Pack installed, a Win10 WinPE Boot media image CAN be imported and used, you just can’t modify it:

Boot Media with SCCM Service Pack:


Boot Media without SCCM Service Pack. Notice we’re missing some key tabs:


The solution here, is to create the Boot Media, then import the customized WIM file. Rather than provide instructions, I’ll direct you over to the best of the best: Johan Arwidmark. Follow his tutorial to create your custom WinPE.wim, then import directly into SCCM.

MDT Package:

Right now there isn’t a MDT version released with Windows 10 Support, However, I’ve been successful using the Toolkit Package from MDT 2013 as well as the Preview MDT that has been released.

USMT Package:

For your USMT Package, you’ll need to use what comes with the Windows 10 ADK. Install the Windows 10 ADK on any system then copy the following folder to the network and use this as the package source to create your USMT Package: “C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\User State Migration Tool“. Your package source must match the folders structure! You package source will have 3 folders: amd64, arm64, x86. If you have custom xml files to use with USMT, place them in the appropriate folder for the architecture of the OS.

Operating System Image

If you don’t already have SCCM 2012 R2 SP1 (2012 SP2) to create a proper Build and Capture, you can simply import the install.wim into SCCM under “Operating System Images”. Point directly to the install.wim inside the sources folder.

Reference the Boot Media

If a boot media is not referenced, a Restart Computer step cannot select the assigned Boot Media. It’s good to have this setup ahead of time, so all steps can be properly configured.

  1. Right-Click your Task Sequence and select Properties.
  2. Verify “Use a boot image” is checked.
  3. Click Browse and select the Windows 10 WinPE Image you have.
    1. If you want, you can add options to set only on specific Operating Systems. This will help prevent the wrong Client Operating System from running the deployment.
  4. Click OK.

Customize the Task Sequence

  1. Edit the Task Sequence.
  2. Now, If you ran through the wizard creating the Task Sequence, Remove all steps! Yes, All of them!
  3. Create a Folder called “Initialization”
    1. Within this group we’ll create 3 built in steps
      1. MDT> Use Toolkit Package
        1. Specify the packages you created for the Toolkit Package
      2. MDT> Gather
        1. Specify the packages your Custom Settings Package for Gather if you desire. I use “Gather only local data…”.
      3. General> Check Readiness
        1. Set “Ensure minimum memory (MB)” 2048 (you may adjust higher if you see fit)
        2. “Ensure minimum processor speed (MHz)” I left at the default (800)
        3. Verify “Ensure minimum free disk space (MB)” is at least 6000 (6GB).
        4. Verify “Ensure current OS to be refreshed is” is set to “Client”.
  4. Below those steps, add a folder called “Capture User State and Settings”. Within here we’ll have 6 steps in this order:
    1. General> Run Command Line
      1. Name: Capture Groups
      2. Command line: cscript.exe “%deployroot%\Scripts\ZTIGroups.wsf” /capture
    2. Settings> Capture Network Settings
      1. Check both options “Migrate domain…” and “Migrate network…”
    3. Settings> Capture Windows Settings
      1. Check all options “Migrate computer name”, “Migrate Registered user and organization names” and “Migrate time zone”
    4. General> Set Task Sequence Variable
      1. Name: “Set User State Store Path”
      2. Task Sequence Variable: OSDStateStorePath
      3. Value: %SystemDrive%\UserState
    5. General> Set Task Sequence Variable
      1. Name: Set USMT Additional Capture Options
      2. Task Sequence Variable: OSDMigrateAdditionalCaptureOptions
      3. The Value can be any mix of USMT capture arguments. Please note with the Windows 10 USMT Package, you do not need to specify the /hardlink parameter. I use the following:
        1. Value: /uel:90 /ui:DOMAIN\*
        2. This migrates all domain profiles that have been used in the last 90 days.
        3. Make sure to replace “DOMAIN” with your domain!
    6. User State> Capture User State
      1. Specify your Windows 10 USMT Package
      2. If you have custom capture files, be sure to specify those using the “Customize how user profiles are captured”
      3. In my example, I left “Enable verbose logging” and “Skip…EFS” unchecked
      4. Select “Copy by using file system access”
        1. “Continue if some files cannot be captures” is Checked
        2. “Capture locally by using links instead of by copying files” is Checked
  5. Create a new group called “Install Operating System”. We’ll have 8 steps in this order:
    1. General> Restart Computer
      1. Name: “Restart in Windows PE”
      2. Select “The boot image assigned to this task sequence”
      3. User notification is recommended in this case, so feel free to specify a friendly message for the user.
    2. MDT> Use Toolkit Package:
      1. Specify your MDT Package
    3. MDT> Gather
      1. Specify your Custom Settings package if you desire. I use “Gather only local data…”.
    4. Images> Apply Operating System
      1. Specify your Windows 10 Image
      2. If you have an answer file, specify that. I don’t use one here.
      3. Verify the Destination is set to “Next available formatted partition”
    5. Settings> Apply Windows Settings
      1. Specify your org information, local admin, and time zone settings as a good fallback if the captured settings cannot be used.
    6. Settings> Apply Network Settings
      1. If you’ll be upgrading a domain computer, make sure to specify the Domain and Account. Since we’ll be using the captured settings, we don’t need to specify a Domain OU.
    7. MDT> Gather
      1. Specify your Custom Settings package if you desire. I use “Gather only local data…”.
    8. General> Run Command Line
      1. Name: Configure
      2. Command line: cscript.exe “%deployroot%\Scripts\ZTIConfigure.wsf”
  6. Create a folder called “Apply Drivers”
    1. You can either use the Auto Apply or specify a Driver package. If you’re using driver packages make sure to filter any hardware specific information on each step.
  7. Create a folder called “Setup Operating System”. We’ll have 4 steps in this order:
    1. Images> Setup Windows and Configuration Manager.
      1. Specify your Package for the Configuration Manager Client
      2. Without Service Pack: add the following in the “Installation Properties”: /skipprereq:windowsupdateagent30-x64.exe
    2. General> Restart Computer
      1. “The currently installed default operating system”
      2. At this point its not necessary to provide notification.
    3. MDT> Use Toolkit Package
      1. Specify your MDT Package
    4. MDT> Gather
      1. Specify your Custom Settings package if you desire. I use “Gather only local data…”.
  8. Create a folder called “Software Installation”
    1. Here is where you’d put a list of software to install within your image. For us, this is where we place our standard Corporate Applications.
  9. Create a folder called “Install Software Updates”
    1. Typically we’ll have 3 repeated steps of “Install Software Updates”. If you are only deploying the OS, one should be enough, however, if you’re deploying software like “Office”, it may be wise to have 2 or 3 just to make sure all gets applied. At this time I only have one cycle:
      1. General> Install Software Updates
        1. All Software Updates
      2. General> Restart Computer
        1. “The Current Default Operating System”
        2. Notification is not necessary.
  10. Create a folder called “Restore User Files and Settings”. We’ll have the following 5 steps:
    1. MDT> User Toolkit Package
      1. Specify your MDT Package
    2. General> Run Command Line
      1. Name: Restore Groups
      2. Command line: cscript.exe “%deployroot%\Scripts\ZTIGroups.wsf” /restore
    3. General> Set Task Sequence Variable
      1. Name: Set USMT Additional Restore Options
      2. Task Sequence Variable: OSDMigrateAdditionalRestoreOptions
      3. Value: /uel:90 /ui:DOMAIN\*
    4. User State> Restore User Files and Settings
      1. Specify your USMT Package
      2. If you used custom xml files to capture user profiles, you’ll need to specify them again here for the restore.
      3. If you desire to restore local profiles, check the box
      4. Check “Continue if some files cannot be restored”.
    5. General> Restart Computer
      1. “The currently installed default operating system”
  11. And that’s it!


  1. Distribute your package references:
    1. Right Click the Task Sequence and select “Distribute Content”.
    2. Run through the wizard selecting any Distribution Points or Distribution Point Groups.
  2. If you don’t already, make sure you have a Collection setup to deploy to!
  3. Right Click the Task Sequence and select “Deploy”,
    1. Select your Collection and complete the Wizard.
  4. Update Machine Policy on the client.
  5. Watch Software Center
  6. Click Install and wait.
  7. Once all is done, We’re at Windows 10 64-bit!