# Check if running in PowerShell 7 $isPwsh7 = $PSVersionTable.PSVersion.Major -ge 7 # Load the Windows Runtime assemblies if we're in PowerShell 7 if ($isPwsh7) { # Add the Windows Runtime assemblies $null = [Windows.Management.Deployment.PackageManager, Windows.Management.Deployment, ContentType=WindowsRuntime] Add-Type -AssemblyName "System.Runtime.WindowsRuntime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" # Load required Windows Runtime assemblies $asTaskGeneric = ([System.WindowsRuntimeSystemExtensions]).GetMethods() | Where-Object { $_.Name -eq 'AsTask' -and $_.GetParameters().Count -eq 1 -and $_.GetParameters()[0].ParameterType.Name -eq 'IAsyncOperation`1' } } $packageSearch = "71F23AFD.Xelion" ## GET FAMILY NAME OF INSTALLED PACKAGE $packageFamilyName = Get-AppxPackage "*$packageSearch*" | Select-Object -ExpandProperty "PackageFamilyName" if (-not $packageFamilyName) { Write-Error "Package with name containing '$packageSearch' not found." exit 1 } ## PROVISION try { $pm = New-Object Windows.Management.Deployment.PackageManager # Different handling for PowerShell 7 vs Windows PowerShell if ($isPwsh7) { # In PowerShell 7, we need to convert the IAsyncOperation to a Task $asyncOperation = $pm.ProvisionPackageForAllUsersAsync($packageFamilyName) $task = $asTaskGeneric.MakeGenericMethod([Windows.Management.Deployment.DeploymentResult]).Invoke($null, @($asyncOperation)) $task.GetAwaiter().GetResult() Write-Host "Package $packageFamilyName provisioned for all users successfully." -ForegroundColor Green } else { # In Windows PowerShell, the original code works $nulltask = $pm.ProvisionPackageForAllUsersAsync($packageFamilyName) Write-Host "Package $packageFamilyName provisioned for all users successfully." -ForegroundColor Green } } catch { Write-Error "Failed to provision package: $_" exit 1 }