I haven’t written a blog in a while, been busy with the new job at Tanium, but I did write this script recently, and thought I would share, in case anyone else found it interesting. Share it forwards.
Been working on solutions to upgrade Windows 7 to Windows 10 using Tanium as the delivery platform (it’s pretty awesome if I do say so my self). But as with all solutions, I need to test the system with some end to end tests.
As with most of my OS Deployment work, the Code was easy, the testing is HARD!
So I needed to create some Windows 7 Images with the latest Updates. MDT to the rescue! I created A MDT Deployment Share (thanks Ashish ;^), then created a Media Share to contain each Task Sequence. With some fancy CustomSettings.ini work and some PowerShell glue logic, I can now re-create the latest Windows 7 SP1 patched VHD and/or WIM file at moment’s notice.
First of all, you need a MDT Deployment Share, with a standard Build and Capture Task Sequence. A Build and Capture Task Sequence is just the standard Client.xml task sequence but we’ll override it to capture the image at the end.
In my case, I decided NOT to use MDT to capture the image into a WIM file at the end of the Task Sequence. Instead, I just have MDT perform the Sysprep and shut down. Then I can use PowerShell on the Host to perform the conversion from VHDX to WIM.
And when I say Host, I mean that all of my reference Images are built using Hyper-V, that way I don’t have any excess OEM driver junk, and I can spin up the process at any time.
In order to fully automate the process, for each MDT “Media” entry. I add the following line into the BootStrap.ini file:
and the following lines into my CustomSettings.ini file:
SKIPWIZARD=YES ; Skip Starting Wizards SKIPFINALSUMMARY=YES ; Skip Closing Wizards ComputerName=* ; Auto-Generate a random Computer Name DoCapture=SYSPREP ; Run SysPrep, but don't capture the WIM. FINISHACTION=SHUTDOWN ; Just Shutdown AdminPassword=P@ssw0rd ; Any Password TASKSEQUENCEID=ICS001 ; The ID for your TaskSequence (Upper Case)
Now it’s just a matter of building the LitetouchMedia.iso image, mounting to a Hyper-V Virtual Machine, and capturing the results.
What I present here is the Powershell script used to orchestrate the creation of a VHDX file from a MDT Litetouch Media Build.
- The script will prompt for the location of your MDT Deployment Share. Or you can pass in as a command line argument.
- The script will open up the Deployment Share and enumerate through all Media Entries, Prompting you to select which one to use.
- For each Media Entry selected, the script will
- Force MDT to update the Media build (just to be sure)
- Create a New Virtual Machine (and blow away the old one)
- Create a New VHD file, and Mount into the Virtual Machine
- Mount the LitetouchMedia.iso file into the Virtual Machine
- Start the VM
- The script will wait for MDT to auto generate the build.
- Once Done, for each Media Entry Selected, the script will
- Dismount the VHDx
- Create a WIM file (Compression Type none)
- Auto Generate a cleaned VHDx file
The code shows how to use Powershell to:
- Connect to an existing MDT Deployment Share
- Extract out Media information, and rebuild Media
- How to create a Virtual Machine and assign resources
- How to monitor a Virtual Machine
- How to capture and apply WIM images to VHDx virtual Disks
I’ve been struggling with how to create a MDT VHDx file with the smallest possible size. I tried tools like Optimize-Drive and sDelete.exe to clear out as much space as possible, but I’ve been disappointed with the results. So here I’m using a technique to Capture the VHDx file as a Volume to a WIM file (uncompressed for speed), and the apply the Capture back to a new VHDx file. That should ensure that no deleted files are transferred. Overall results are good:
Before: 19.5 GB VHDx file --> 7.4 GB compressed zip After: 13.5 GB VHDx file --> 5.6 GB compressed zip