Launch Universal Windows Platform apps with PowerShell
  • 11 Oct 2024
  • 3 Minutes to read
  • Dark
    Light
  • PDF

Launch Universal Windows Platform apps with PowerShell

  • Dark
    Light
  • PDF

Article summary

Overview

We get many questions about how to launch provisioned Universal Windows Platform apps from within Liquit Workspace. In this article, we will use a common app: Snip & Sketch.

UWP apps are designed to work across platforms and can be installed on multiple ones including Windows client, Windows Phone, and Xbox. All UWP apps are also Windows apps, but not all Windows apps are UWP apps.

Appx is Microsoft's file format used to distribute and install these apps on the Universal Windows Platform. Appx is a .ZIP-based file containing the app's payload files plus info needed to validate, deploy, manage, and update the app.

Some Windows apps are already provisioned in Windows by default. Read Overview of apps on Windows client devices to find out how you can use Windows PowerShell to find out the name of all these provisioned apps.

Retrieve PackageFamilyName and App ID using PowerShell

Next, we will use PowerShell to find about Snip & Sketch all the details needed to create a Launch type package in the Liquit Workspace.

We use the Get-AppxPackage cmdlet to list information about the Appx package only:

Get-AppxPackage | Where {$_.Name -match 'ScreenSketch'}

We're going to have a look at three properties here, Name, InstallLocation and PackageFamilyName:

powershell_snipsketch_uwp_1

Name - is something we need to make certain, that we are looking at the details of the correct app; the ‘Snip & Sketch’ app.

InstallLocation - is where we can find the AppxManifest.xml file which contains the info the system needs to deploy, display, or update this Windows app. Within it, we can find the ID of the app which in this case is ‘App’. But we can also retrieve it by running:

(Get-AppxPackage | Where {$_.Name -match 'ScreenSketch'} | Get-AppxPackageManifest).package.applications.application.id

PackageFamilyName - is what we need to tell explorer.exe to launch the app. To launch Snip & Sketch using explorer.exe successfully, we need to add the "!App" string which is the ID value found in the AppxManifest.xml.

Script


 # Import the Liquit Workspace module from its default location
 $moduleName = "Liquit.Server.PowerShell"
 $moduleInstalled = Get-Module -ListAvailable | Where-Object { $_.Name -eq $moduleName }
 
 if ($moduleInstalled) {
     Write-Host "The '$moduleName' module is already installed." -NoNewLine -ForegroundColor green
     Import-Module -Name "Liquit.Server.PowerShell"
     Write-Host ""
 } else {
     Write-Host "The '$moduleName' module is not installed. Please install the Application Workspace PowerShell Module" -NoNewLine -ForegroundColor yellow
 }
 
 Add-Type -AssemblyName System.Windows.Forms
 Add-Type -AssemblyName System.Drawing
 
 # Define all Liquit-related variables
 $url = $(Write-Host "Type Liquit Zone Url: " -NoNewLine -ForegroundColor green; Read-Host)
 $usr = $(Write-Host "Please enter the Username (For example: local\admin): " -NoNewLine -ForegroundColor green; Read-Host)
 $password = $(Write-Host "Please enter the Password: " -NoNewLine -ForegroundColor green; Read-Host -AsSecureString)
 $Credentials = New-Object System.Management.Automation.PSCredential $usr,$password
 
 Connect-LiquitWorkspace -URI "$url" -Credential $credentials
 
 # Define the form parameters
 $form = New-Object System.Windows.Forms.Form
 $form.Text = 'Provisioned Windows Apps'
 $form.Size = New-Object System.Drawing.Size(300,675)
 $form.StartPosition = 'CenterScreen'
 $form.MinimumSize = New-Object System.Drawing.Size(300,675)
 
 $OKButton = New-Object System.Windows.Forms.Button
 $OKButton.Location = New-Object System.Drawing.Point(120,550)
 $OKButton.Size = New-Object System.Drawing.Size(75,25)
 $OKButton.Text = 'OK'
 $OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
 $OKButton.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor
                    [System.Windows.Forms.AnchorStyles]::Right
 $form.AcceptButton = $OKButton
 $form.Controls.Add($OKButton)
 
 $CancelButton = New-Object System.Windows.Forms.Button
 $CancelButton.Location = New-Object System.Drawing.Point(195,550)
 $CancelButton.Size = New-Object System.Drawing.Size(75,25)
 $CancelButton.Text = 'Cancel'
 $CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
 $CancelButton.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor
                        [System.Windows.Forms.AnchorStyles]::Right
 $form.CancelButton = $CancelButton
 $form.Controls.Add($CancelButton)
 
 $label = New-Object System.Windows.Forms.Label
 $label.Location = New-Object System.Drawing.Point(10,20)
 $label.Size = New-Object System.Drawing.Size(280,20)
 $label.Text = 'Select a Provisioned Windows app:'
 $form.Controls.Add($label)
 
 $listBox = New-Object System.Windows.Forms.ListBox
 $listBox.Location = New-Object System.Drawing.Point(10,40)
 $listBox.Size = New-Object System.Drawing.Size(260,940)
 $listBox.Height = 500
 $listBox.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor
                   [System.Windows.Forms.AnchorStyles]::Top -bor
                   [System.Windows.Forms.AnchorStyles]::Left -bor
                   [System.Windows.Forms.AnchorStyles]::Right
 
 [void] $listBox.Items.Add('HEIF Image Extensions')
 [void] $listBox.Items.Add('Clipchamp')
 [void] $listBox.Items.Add('Microsoft Paint')
 [void] $listBox.Items.Add('Snip & Sketch')
 
 $form.Controls.Add($listBox)
 $form.Topmost = $true
 
 # Show the form
 $result = $form.ShowDialog()
 
 if ($result -eq [System.Windows.Forms.DialogResult]::OK)
 {
     $packageName = $listBox.SelectedItem
 
     if ($packageName -eq "Microsoft Paint")
     {
         $selectedAppxPackagename = "Microsoft.Paint"
     }
 
     elseif ($packageName -eq "Snip & Sketch")
     {
         $selectedAppxPackagename = "Microsoft.ScreenSketch"
     }
 
     elseif ($packageName -eq "Clipchamp")
     {
         $selectedAppxPackagename = "Clipchamp.Clipchamp"
     }
 
     elseif ($packageName -eq "HEIF Image Extensions")
     {
         $selectedAppxPackagename = "Microsoft.HEIFImageExtension"
     }
 
     # Fetch all Appx packages
     $AppxPackages = Get-AppxPackage |  Where-Object {$_.Name -match $selectedAppxPackagename}
 
     foreach ($AppxPackage in $AppxPackages)
     {
         $packageArguments = "$($AppxPackage.PackageFamilyName + "!App")"
         $packageDisplayName = ""
         $packageDescription = ""
 
         $package = New-LiquitPackage -Name $packageName `
                                      -Type "Launch" `
                                      -DisplayName $packageDisplayName `
                                      -Description $packageDescription `
                                      -Priority 100 -Enabled $true `
                                      -Offline $True `
                                      -Web $false `
                                      -Icon $content
         $snapshot = New-LiquitPackageSnapshot -Package $package
         New-LiquitFilterSet -Snapshot $snapshot
 
 # Define the Launch action set
         $actionset = New-LiquitActionSet -snapshot $snapshot `
                                          -Type Launch `
                                          -name 'Launch' `
                                          -Enabled $true `
                                          -Frequency Always `
                                          -Process Sequential `
 
 # Define actions for the Launch action set
 New-LiquitAction -ActionSet $actionset `
                             -Name 'Start Windows app' `
                             -Type 'processstart' `
                             -Enabled $true `
                             -IgnoreErrors $false `
                             -Settings @{name = '${SystemRoot}explorer.exe'; parameters ='shell:Appsfolder' + $packageArguments;} `
                             -Context User
 
 
  # Move the snapshot into the production stage
         Publish-LiquitPackageSnapshot -Snapshot $snapshot -stage Production
     }
 } 
 

Was this article helpful?