Hello Community,

Here comes my second article in my mini series for all of you who are also facing a Windows 10 inplace upgrade strategy. This series will contain 3 blog post which will contain

1.) a precheck to detect upgrade issues or blocker in advance


2.) the preseeding of the binaries so that clients outside your network will smoothly download the gigabytes

3.) the upgrade itself


Again I will thank chrpetri for the development and testing of this scripts.

This script is intended to help distribute the Windows 10 ISO file to clients that are not available on the internal network.

Here you can download the exported script as well as the custom inventory rule (CIR).



This script uses the Microsoft BITS client in the background. This client is also used for Outlook synchronization. For detailed information about the client, please visit the following page:


BITS is very robust and allows multiple network changes without the cancellation of the download task. Since we wanted to keep the script simple, we have created a “BITSget.exe” in which an intelligence is built in and allows us to use parameters within our script. BITS is always executed in a mode that uses the lowest bandwidth. This is intended to prevent the complete ISO file from being downloaded during a mobile data connection and the data volume from being used up.

There is also a self-developed “CheckFileHash.exe”. We need this file to check whether the file has been downloaded completely so that it can be unpacked afterwards.

There are three tasks in the script itself. The first task only looks to see if the $KACE.Cache folder exists and, if not, creates it. This folder is hidden so that users do not use the installation data elsewhere.

Task two executes the “BITSget.exe”.

In this you must enter the URL to your webserver as well as the hash value of the file.

I unpacked the Windows 10 1903 ISO file and repacked it as a ZIP file. This allows us to unpack the files after checking the hash value after the download. You can determine the hash value with the help of the "checkfilehash.exe", which can be found in the dependencies of this script. Below is an example of the command:

CheckFileHash.exe SHA1 C:\temp\WinX1903.zip

If you have read the hash value of the ZIP file, you can change it in the script.

In the third task we check with the help of the "checkfilehash.exe" whether the file was downloaded completely. If not, a file will be created that the download is not yet complete. This file will be interpreted by SMA with the attached CIR. With that CIR we will have the latest information in our report. There is also another CIR that reads the current task of BITS so we can monitor the status and progress of the download.

You have to modify the hash value in this line the same way you did before.

Once the file has been successfully downloaded and unpacked, the status is logged and read with the CIR.

Note: The ID of the CIR is stored in the report, which is probably different for you.

The report must be adjusted. Navigate to "Reporting" and search for "Windows 10 PreSeeding status". After a click on the report, you can click on "Fields to Display". Here you must choose the CIRs.

Now you can click on "Sort and Breaks" and choose the CIR "Inventory: Windows 10 PreSeeding status" and set it as Break Header.

After that, you can click on "Filters". You have to edit the filter and choose the "Inventory: Windows 10 PreSeeding status" and set the operator to "is NOT NULL".

Now you can save the filter and the report.

The following is an example of what the report could look like.


This script could be also used for other, large packages and is not only intended for the download of a Windows 10 ISO (zip) file.

I hope this article helps you with your Windows 10 migration strategy. If there are any questions or problems, do not hesitate to use the comment function and let me know.