PowerShell – Sandbox Testing App Attach Apps – No WVD Required

email me

Use these steps to test your MSIX VHD, without having to use Windows Virtual Desktop. It’s a great way to make sure your MSIX package and MSIX VHD are working properly, and simulate the installation of an app attach application.


Microsoft Magic

The magic behind app attach is a mounted VHD (Mount-Diskimage), a file junction (mklink), and a simple app registration (Add-AppxPackage).


This does assume four things:

  • You’re using a current Insiders build
  • You have a MSIX VHD  (see Step 2 for sample)
  • You have the relative certificate to the MSIX package (see Step 3 for sample)
  • The Hyper-V role has been installed


Tested in Windows 10 Build 19041 (it’s best to use one of the latest Insiders’ builds).

Using a VM or a local Windows 10 installation…



Step 1

Create C:\VHD.

Step 2

Copy MozillaFirefox80.0.1x64en-US_80.0.1.0_x64__1z5jebwm3hact.vhd to C:\VHD.

Step 3

Copy MozillaFirefox80.0.1x64en-US_80.0.1.0_x64__1z5jebwm3hact.cer to C:\VHD.

Step 4

Update the Logon script to reflect your configuration (see code below).

Step 5

Paste Logon script code into PowerShell Console.

Step 6

Verify App was installed.


PowerShell Code: Logon script

# MrNetTek
# eddiejackson.net
# 11/7/2020
# free for public use
# free to claim as your own

#import certificate 
cmd.exe /c CERTUTIL.exe -addstore -enterprise -f -v root "C:\VHD\MozillaFirefox80.0.1x64en-US_80.0.1.0_x64__1z5jebwm3hact.cer"

#region variables
#side note: these variables could be added to a json file
$VHD = "C:\VHD\MozillaFirefox80.0.1x64en-US_80.0.1.0_x64__1z5jebwm3hact.vhd"
$Folder = "Firefox80.0.1"
$Package = "MozillaFirefox80.0.1x64en-US_80.0.1.0_x64__1z5jebwm3hact" 
$Folder = "\" + $Folder + "\"
$Volume = "0ab29bd3-b6f6-4f75-a0b5-872ed617dff5" #mountvol.exe
$Junction = "C:\AppAttachTmp\" 

#region mountvhd
    Mount-Diskimage -ImagePath $VHD -NoDriveLetter -Access ReadOnly
    Write-Host ("Mounting of " + $VHD + " was completed!") -BackgroundColor Green 
    Write-Host ("Mounting of " + $VHD + " has failed!") -BackgroundColor Red
#region junction
$Destination = "\\?\Volume{" + $Volume + "}\"
if (!(Test-Path $Junction)) 
    md $Junction
$Junction = $Junction + $Package
cmd.exe /c mklink /j $Junction $Destination
#region stage
[Windows.Management.Deployment.PackageManager,Windows.Management.Deployment,ContentType=WindowsRuntime] | Out-Null
Add-Type -AssemblyName System.Runtime.WindowsRuntime
$asTask = ([System.WindowsRuntimeSystemExtensions].GetMethods() | Where { $_.ToString() -eq 'System.Threading.Tasks.Task`1[TResult] AsTask[TResult,TProgress](Windows.Foundation.IAsyncOperationWithProgress`2[TResult,TProgress])'})[0]
$asTaskAsyncOperation = $asTask.MakeGenericMethod([Windows.Management.Deployment.DeploymentResult], [Windows.Management.Deployment.DeploymentProgress])
$PackageManager = [Windows.Management.Deployment.PackageManager]::new()  
$Path = $Junction + $Folder + $Package 
$Path = ([System.Uri]$Path).AbsoluteUri
  $asyncOperation = $packageManager.StagePackageAsync($Path, $null, "StageInPlace")                                                                                                                
$Task = $asTaskAsyncOperation.Invoke($null, @($asyncOperation))    
#region variables 
$Package = "MozillaFirefox80.0.1x64en-US_80.0.1.0_x64__1z5jebwm3hact" 
$Path = "C:\Program Files\WindowsApps\" + $Package + "\AppxManifest.xml"

#region register
Add-AppxPackage -Path $Path -DisableDevelopmentMode -Register

exit 0









PowerShell Code: Logoff script

#region variables
$Package = "MozillaFirefox80.0.1x64en-US_80.0.1.0_x64__1z5jebwm3hact"

#region deregister
Remove-AppxPackage -PreserveRoamableApplicationData $Package

#MSIX app attach de-staging
#region variables
$Package = "MozillaFirefox80.0.1x64en-US_80.0.1.0_x64__1z5jebwm3hact"
$Junction = "C:\AppAttachTmp\"

#region deregister
Remove-AppxPackage -AllUsers -Package $Package
cd $Junction
rmdir $Package -Force -Verbose