Packaging UWP drivers for deployment in MEMCM

Installing Driver Appx packages during MEMCM/OSD

4/30/2020

The implementation of the UWP driver model by Microsoft imposes restrictions on how a complete driver package can be deployed when a PC is (re)imaged. Drivers with a control UWP application are split between the hardware-enabling driver and an appx package, typically installed with DISM.

Every driver is delivered by HP as a Softpaq (packaging method developed by Compaq long ago), and, for each driver that requires it, contains both the driver and the UWP appx control application. When the Softpaq is executed in Windows, both the driver and the appx application are installed.

However, when utilizing enterprise deployment tools, like Microsoft MEMCM, systems are imaged by applying Windows and then injecting the drivers (usually from DriverPacks), where only the drivers are installed. This results from the default behavor that the installation of a UWP appx application should done by a user from the Windows app store; which means a user profile was created and a user was logged in. The issue is that in most cases, access to the Windows store is curtailed in corporate PCs, resulting in some functionality missing from the PC. A pen/stylus application comes to mind, for example.

More on drivers UWP application installations at: https://docs.microsoft.com/en-us/windows-hardware/drivers/devapps/auto-install-for-uwp-device-apps

In order to help with the installation of drivers’ appx applications, we will show how to package and inject these components into the default profile as the image is being built in an OS deployment task.

NOTE: The process outlined below can vary by driver, where the UWP control application can be packaged differently by vendor. Also, with our technique, if the Softpaq itself requires separate installation, its UWP appx package will be installed prior to the Softpaq – think HP Hotkeys software here. To alleviate the inconsistencies, HP software teams are developing a more standardized method for delivering drivers’ UWP components, so in the future, packaging these for installation will be made simpler.

The first step is to identify which drivers contain UWP applications and then to find and package those for installation. The best tool for identifying Softpaqs that contain UWP components is HP Image Assistant (HPIA). HPIA can list all available Softpaqs for any HP supported system and supported Windows versions. When analyzing for a product and OS, the resulting list will include an UWP icon next to the Readme and CVA icons, as needed. You can also select to have HPIA check ONLY Softpaqs with UWP packages

To deliver each driver UWP application, we first download and expand the Softpaq, then locate the DISM install command string.

Notes for unpacking:

  • An HP Softpaq can be unpacked using these options: “SP12345.exe /s /e”  # which unpacks to C:\SWSETUP\SP12345 by default

  • Sometimes the UWP appx is in its own install cmd batch file, while at other times (like in B&O software) it’s part of the full Setup.bat contained in the extracted Softpaq.
If the Softpaq has its own appx install command file we will modify the DISM string in that file to run DISM against an offline image, from: “DISM /Online” to ”DISM /Image:%1\”. We will provide the %1 path to the command when calling the script in the Task Sequence.
 

Each driver UWP application will require separate install steps ins a Task Sequence:

  1. In MEMCM, we will create a Package that will hold the appx application. The source for the package will be the share path where the edited CMD file is located.
  2. Next we add a TS step to your deployment Task Sequence that will call the DISM CMD batch (modified for offline injection). We will also provide a system variable when invoking the command file,  %OSDTargetSystemDrive%, that represents the WinPE drive where Windows is applied

NOTE: follow screenshots below for examples of deploying HP Hotkeys, Synaptics Pointing Device, and Intel Thunderbolt appx control apps, and the separate Softpaq package – needed for Hotkeys - prior to OOBE.

Finding the appx installation command

As already mentioned, we must locate the file for the actual UWP installation portion and modify the DISM string in that file. One way to locate the file is with PowerShell. For example – let's find every file that contains a DISM string (appx packages are installed with DISM):

PS E:\share\Applications> Get-ChildItem -Recurse ‘FilePath’ | Select-String ‘dism’ -List | Select -Unique Path

Unfortunately, there is no cheat sheet for finding the appx installation from an extracted Softpaq. It can be part of a setup.bat, or it may have its own appx install batch file). And, not all the appx install files are named the same. For example, the one for the Thunderbolt Control Center (currently) is called appxinst.cmd, where below you can see the Hotkeys has a different name. 

Finally, the method injects the appx package into the image during OSD prior to a user profile being created. This way the app should be present for any user profile signing in after the image is laid down


HP Hotkeys UWP Appx Installation

Step 1: Download and unpack the HP Hotkeys Softpaq to a MEMCM share

Example (sp99442.exe):

  • Use HP Image Assistant, which will download and Unpack to C:\HPIADownloads, or
  • Download Softpaq and run: “sp99442.exe /s /e” which will unpack to C:\SWSETUP\sp99442

NOTE: HP Image Assistant will create an installation batch file for the contents named install.cmd. This file is not part of the Softpaq, and will not exist if downloading and extracting with the /s /e runstring options
 

Step 2: Find the file containing the command in the copied folder where the appx gets installed with DISM – we try the command show above:

PS E:\share\Applications> Get-ChildItem -Recurse ‘FilePath’ | Select-String ‘dism’ -List | Select -Unique Path

We find the DISM install runstring in install_hpks_sysinfo_app.cmd:

                Next, edit the cmd file, and look for the DISM installation of the appx application

Modify the DISM installation string from /Online to /Image:%1\

Step 3: In MEMCM, create a Package to deliver the UWP portion of the applications


Step 4: Create  OSD Task step to deploy the UWP appx package

  • Add a Run Command Line step a) after the Image Apply step and b) prior to a System Restart
  • The command line should have %OSDTargetSystemDrive% as a runstring option
  • Point to the UWP package created (here it is PS100140)

Step 5: Develop a MEMCM Package for the Software application to be installed outside the standard DriverPack injection

  • Point the Package to the Download source folder where the install command is located
  • Select: Do not create a Program

Step 6: Create an OSD Run Command Line step after 1st reboot

  • Run the install command in this step

Finally, you will get to show something like this in your OSD Task Sequence

 


Synaptics Pointing Device UWP Appx Installation

Step 1: Download and unpack the Softpaq

Step 2: Find the command in the copied folder where the appx gets installed with DISM

Step 3: In MEMCM, create a Package to deliver the UWP portion of the applications

Step 4: Create  OSD Task step to deploy the UWP appx package

 

 


Intel Thunderbolt UWP Appx Installation

Step 1: Download and unpack the Softpaq

Step 2: Find the command in the copied folder where the appx gets installed with DISM

Step 3: In MEMCM, create a Package to deliver the UWP portion of the applications

Step 4: Create  OSD Task step to deploy the UWP appx package

 

 

by Dan Felman - (Original work by Cam Cnare – HP Technical Consultant)

 

DISM Documentation:

 

https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/dism-app-package--appx-or-appxbundle--servicing-command-line-options

 

Dism /Image:C:\test\offline /Add-ProvisionedAppxPackage /FolderPath:c:\Test\Apps\MyUnpackedApp /CustomDataPath:c:\Test\Apps\CustomData.xml

Dism /Online /Add-ProvisionedAppxPackage /PackagePath:C:\Test\Apps\MyPackedApp\MainPackage.appx /DependencyPackagePath:C:\Test\Apps\MyPackedApp\Framework-x86.appx /DependencyPackagePath:C:\Test\Apps\MyPackedApp\Framework-x64.appx /LicensePath:C:\Test\Apps\MyLicense.xml

Dism /Online /Add-ProvisionedAppxPackage /FolderPath:C:\Test\Apps\MyUnpackedApp /SkipLicense

dism.exe /Add-ProvisionedAppxPackage
      {
      /FolderPath:<App_folder_path>
      [/SkipLicense\]
      [/CustomDataPath:<custom_file_path>]
      /PackagePath:<main_package_path>
      [/DependencyPackagePath:<dependency_package_path>]
      {[/LicenseFile:<license_file_path>] [/SkipLicense\]}
      [/CustomDataPath:<custom_file_path>]
      }
      [/Region:<region>]

This may be able to be simplified with PowerShell, which is not explored in the review above. Some of the commands that can be used to install appx (or appxbundle) packages is listed below

 

PowerShell Appx provisioning cmdlet:

 

https://docs.microsoft.com/en-us/powershell/module/dism/add-appxprovisionedpackage?view=winserver2012-ps&redirectedfrom=MSDN

 

Add-AppxProvisionedPackage
   [-FolderPath <String>]
   [-PackagePath <String>]
   [-DependencyPackagePath <String[]>]
   [-LicensePath <String>]
   [-SkipLicense]
   [-CustomDataPath <String>]
   -Path <String> | -Online
   [-WindowsDirectory <String>]
   [-SystemDrive <String>]
   [-LogPath <String>]
   [-ScratchDirectory <String>]
   [-LogLevel <LogLevel>]
   [<CommonParameters>]

  

Author : dan.felman

Trying to install HP Programmable Key using your guide above but we want to trigger the appx installation via VB-script instead but I can't get the installation to work. Is it possible for you to create an how to för that software aswell?

As long as you install the Driver that is included with the DriverPack, then you can install the Metro/UWP appx in a couple of different ways: 1) download and unpack the Programmable Key Softpaq sp103609. Create a Package pointing to the unpacked 'bin' subfolder, and create a TS step to run 'install.cmd' from the folder. This will install the driver (if not already there), the Framework Fusion (if not already installed), and the appx driver via online DISM 2) download and unpack the UWP driverpack, softpaq sp103844, and you will see a folder named 'HP_Programmable_Key_(SA)_(P00XFX-B2M)\src' . You package that src folder and create a run command step to run 'InstallApp.cmd'

Great writeup Dan, and certainly explains the source of the issues I've been experiencing. I'm currently struggling to get the Thunderbolt driver/app installed in a MEMCM task sequence. I'm using SP107571. It seems there's an install.cmd that basically does 3 things: 1. inf install, 2. Intel certificate install, then 3. appx install. I've been trying to run this install later in our TS along with other software installs, but we're getting a failure on the appx install (the drivers/cert get installed fine). So using your method I see we'd need to bring this earlier in the TS, whilst still in PE. If so, how would we achieve the certificate install? It's not in the appxinst.cmd, and presumably if we use this method the drivers won't be installed via the install.cmd but rather by DISM injection. Thanks in advance for your advice.

@andrew morgan, it looks like the Thunderbolt softpaq (107571), when unpacked, in the bin folder, it shows an installer cmd file for the UWP appx application, install_TBT_appx.cmd. you should be able to captuer the bin folder in a SCCM package, and run the batch file to install just the appx