In diesem Artikel zeige ich Ihnen, welche PowerShell-Befehle Sie benötigen, um moderne Anwendungen wie AppX und MSIX auf Windows 11 und Windows Server bereitzustellen. Wir sprechen in diesem Zusammenhang von Modern-Applications, die isoliert, also virtuell, mit eigenem Dateisystem und eigener Registrierung unter Windows arbeiten.
AppX- und MSIX-Anwendungen (sowie Package-Bundles wie .appxbundle und -msixbundle) können unter Windows 11 per Doppelklick bereitgestellt werden. Daraufhin erscheint ein Dialog zur Installation, wie man ihn von klassischen MSI-Paketen kennt. Im Hintergrund läuft zur Installation immer ein PowerShell-Befehl, der die Bereitstellung erledigt.
Auf Windows Servern sieht die Sache jedoch ganz anders aus. Je nach Version gibt es aktuell Serversysteme mit eingeschränkter Funktionalität. Aktuell bietet Server 2022 den größten Funktionsumfang für Modern-Applications. Anwendungen für den Server werden immer per PowerShell bereitgestellt.
Ich empfehle Ihnen, zur Erstellung von MISX-Paketen das Microsoft MSIX Packaging Tool im Store zu nutzen: https://apps.microsoft.com/detail/9n5lw3jbcxkf
Auf Windows Servern sieht die Sache anders aus. Je nach Version gibt es aktuell Serversysteme mit eingeschränkter Funktionalität. Der größte Funktionsumfang für die Modern-Applications ist aktuell zum Zeitpunkt der Erstellung dieses Artikels auf Server 2022 zu finden. Anwendungen für den Server werden immer per PowerShell bereitgestellt.
Weitere Infos dazu gibt es hier:
Ihr könnt Euch leicht eine Übersicht verschaffen, welche PowerShell Befehle für Modern Applications unter Windows existieren.
Get-command -module appx
Beachten Sie, dass es für „appx" jeweils ein PowerShell-Alias auf „App" gibt, um die Nutzung der CmdLets zu erleichtern. Die Befehle sind absolut gleichwertig.
PS > Get-command -module appx
CommandTypeName
AliasAdd-AppPackage
…
CmdletAdd-AppxPackage
Anmerkung: Die Bereitstellung moderner Anwendungen erfolgt weitgehend „Per User". Die digitale Signatur stellt dabei die Integrität der Anwendung sicher. Daher sind Benutzerrechte für die meisten Befehle ausreichend. Ggf. muss die PowerShell-Ausführungsrichtlinie angepasst werden:
Set-ExecutionPolicy -ExecutionPolicy Remotesigned
X Get-AppPackage zum Anzeigen von Anwendungspaketen
Mit Get-AppPackage sehen Sie auf einen Blick alle modernen Anwendungen, die Sie unter Windows installiert haben. Sie erhalten Informationen wie den Family Name und den Speicherort im AppCache (in der Regel unter c:\Program Files\WindowsApps). Sie können den Befehl auch mit einem Wildcard "*" für beliebige und beliebig viele Zeichen nutzen, zum Beispiel *paint*.
PS C:\> Get-AppPackage *microsoft.paint*
Name: Microsoft.Paint
Publisher: CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
Architecture: X64
ResourceId:
Version: 11.2311.30.0
PackageFullName: Microsoft.Paint_11.2311.30.0_x64__8wekyb3d8bbwe
InstallLocation: C:\Program Files\WindowsApps\Microsoft.Paint_11.2311.30.0_x64__8wekyb3d8bbwe
IsFramework: False
PackageFamilyName : Microsoft.Paint_8wekyb3d8bbwe
PublisherId: 8wekyb3d8bbwe
IsResourcePackage : False
IsBundle: False
IsDevelopmentMode : False
NonRemovable: False
Dependencies: {Microsoft.VCLibs.140.00_14.0.33519.0_x64__8wekyb3d8bbwe, Microsoft.VCLibs.140.00.UWPDesktop_14.0.33728.0_x64__8wekyb3d8bbwe,
Microsoft.UI.Xaml.2.8_8.2310.30001.0_x64__8wekyb3d8bbwe, Microsoft.Paint_11.2311.30.0_neutral_split.language-de_8wekyb3d8bbwe...}
IsPartiallyStaged : False
SignatureKind: Store
Status: Ok
Eine Übersicht aller Anwendungen können wir generieren, wenn wir das Ergebnis auf den Namen filtern:
Get-AppPackage * | Select-Object -Property Name
Um die Menge zu sortieren und auf wenige Einträge einzuschränken nutzen wir Sort-Object und „-last x":
PS C:\> Get-AppPackage * | Sort-Object | Select-Object -Property Name -last 5
Name
----
TheLEGOGroup.LEGOMINDSTORMSInventor
Windows.CBSPreview
windows.immersivecontrolpanel
Windows.PrintDialog
WinRAR.ShellExtension
Hinweis: Mit dem Schalter "-AllUsers" werden Anwendungen angezeigt, die nicht für den aktuellen Anwender bereitgestellt sind.
Reparieren von Modern-Applications mit Reset-AppxPackage
Sie können eine Modern-Application mit dem Befehl "Reset-AppxPackage" reparieren. Damit setzen Sie den Zustand der Anwendung im Benutzerverzeichnis zurück. Die Anwendungsdaten werden unter %localappdata%/Packages/PackageID/ im Benutzerverzeichnis gespeichert. Sie müssen den Befehl mit Benutzerrechten im context des Benutzers ausführen, beispielsweise wenn eine Anwendung nicht mehr sauber funktioniert.
Get-AppPackage *microsoft.paint* | Reset-AppPackage
Deinstallieren einer Modern-Application
Mit dem Befehl "Remove-AppPackage" können Sie eine moderne Anwendung deinstallieren. Dabei ist zu beachten, dass dieser Befehl mit Anwenderrechten ausgeführt werden kann und eine Anwendung in der Regel im Anwendungscache unter C:\Program Files\Windows Apps verbleibt. Das bedeutet, dass Sie als Anwender diese Anwendung nicht mehr sehen können.
Nehmen wir zum Beispiel die Deinstallation von Paint:
Get-AppPackage *microsoft.paint* | Remove-AppPackage
Eine Deinstallation kann auch einfach durch den Anwender aus dem Startmenü heraus erfolgen. Dazu genügt ein Rechtsklick auf viele der Modern-Applications, wie beispielsweise Paint. Dort muss lediglich "Deinstall" angeklickt werden. Sollte dies einmal versehentlich passieren, kann eine solche Anwendung mit den Benutzerrechten des Anwenders auch wieder repariert werden.
Das passiert wiederum mit Add-AppPackag, beispielsweise für Paint:
Add-AppPackage -Path "C:\Program Files\WindowsApps\Microsoft.Paint_11.2311.30.0_x64__8wekyb3d8bbwe\AppxManifest.xml" -Register -DisableDevelopmentMode
Wichtig ist es hierbei auf den Ordner im PackageCache zu verweisen und auf die Datei AppXManifest.xml
Der Ordner kann mit Get-AppPackage und Select-Object ermittelt werden:
PS C:\> Get-AppPackage *microsoft.paint* | Select-Object -Property InstallLocation
C:\Program Files\WindowsApps\Microsoft.Paint_11.2311.30.0_x64__8wekyb3d8bbwe
Verhindern, dass Anwendungen deinstalliert werden
Anwendungen kennen den Schalter "Non-Removable". Anwendungen, die nicht durch den Anwender deinstalliert werden dürfen, können im System gesucht werden. Setzen Sie diesen Switch gezielt, um eine Deinstallation zu verhindern. Das Setzen dieses Schalters muss mit administrativen Rechten erfolgen.
Beispiel: Suchen von Anwendungen, die nicht deinstalliert werden können:
PS C:\> Get-AppPackage * | Where-Object -Property NonRemovable -eq $True | Select-Object -Property Name -First 10
Name
----
Microsoft.UI.Xaml.CBS
NcsiUwpApp
Microsoft.Windows.AssignedAccessLockApp
Microsoft.Windows.CallingShellApp
Microsoft.Windows.Apprep.ChxApp
Microsoft.Windows.ParentalControls
Microsoft.XboxGameCallableUI
Microsoft.Windows.PinningConfirmationDialog
Microsoft.MicrosoftEdgeDevToolsClient
Microsoft.UI.Xaml.CBS
Nun, beispielsweise Microsoft Paint ist eine Anwendung, die ein Anwender für sich deinstallieren darf, wie der folgende Befehl zeigt.
S C:\> Get-AppPackage *microsoft.paint* | Select-Object -Property name, NonRemovable
NameNonRemovable
----------------
Microsoft.PaintFalse
Verhindern der Deinstallation von Modern-Applications
Ändern Sie das Deinstallationsverhalten einer Anwendung mit dem PowerShell-Befehl "Set-NonRemovableAppsPolicy". Dieser Befehl stammt aus dem DISM-Modul. Hier sind Befehle enthalten, die sich auf das Windows WIM-Image beziehen. Der Befehl kennt den Switch "-Online". Dieser bezieht sich auf ein Windows-Image, das bereits installiert ist. Eine Änderung gilt somit für alle Anwender auf einem Computer.
Mit folgendem Befehl, der "als Administrator" ausgeführt werden muss, kann beispielsweise verhindert werden, dass Microsoft.Paint durch einen Anwender deinstalliert werden kann:
PS C:\Users\Andreas> Get-AppPackage *microsoft.Paint* -AllUsers | Set-NonRemovableAppsPolicy -Online -NonRemovable $true
Online: True
RestartNeeded : False
Installieren einer Anwendung für alle Anwender
Auch der Befehl "Add-AppxProvisionedPackage" aus dem Modul DISM ist dafür zuständig, eine Anwender-Installation für alle Anwender auf einem Computer vorzunehmen. Das Paket wird im Cache des Computers verankert. Der Befehl muss für ein laufendes System zwingend mit dem Switch "-Online" ausgeführt werden. Eine Integration in ein WIM-Image ist ebenfalls möglich, wobei der Parameter "-Online" dann natürlich nicht verwendet werden darf.
Dabei ist jedoch zu beachten, dass die Integration zwar auf dem Computer erfolgt, der Anwender diese Anwendung aber nicht unbedingt sieht. Im zweiten Schritt ist beispielsweise für FSLogix oder Roaming Profiles eine Registrierung im Benutzerprofil notwendig.
Als Beispiel hier die Installation des MISX Packaging Tools:
Add-AppxProvisionedPackage -PackagePath C:\temp\PackagingTool2023.12.12.0.msixbundle -Online-SkipLicense
Ein Lizenzpfad ist für Store-Anwendungen zwingend notwendig, wenn diese offline installiert werden soll. Als Beispiel sei hier "-LicensePath C:\temp\PackagingTool2023.12.12.0_License.xml" genannt. Eine Onlineverbindung ist ansonsten erforderlich und statt -LicensePath der Switch „SkripLicende". Das gilt nicht für MSIX-Pakete, die selbst erstellt wurden. Diese benötigen keine Lizenzdatei. Hier kann immer der Switch "-SkipLicense" genutzt werden. Der Switch "-Online" ist wiederum zwingend erforderlich für ein installiertes Windows System (also kein WIM Image).
Ein neuer Anwender muss sich beispielsweise mit einem Roaming Profile anmelden. Anschließend muss die Anwendung im Benutzerkontext registriert werden. Das gilt beispielsweise für das Packaging Tool. Der Befehl muss in ein Logon-Skript des Anwenders eingebaut werden.
PS > Add-AppPackage -Path"C:\Program Files\WindowsApps\
Microsoft.MSIXPackagingTool_1.2024.508.0_x64__8wekyb3d8bbwe\AppxManifest.xml"
-DisableDevelopmentMode -Register
Starten einer Anwendung im MSIX Container
Mit dem Befehl "Invoke-CommandInDesktopPackage" starten Sie eine Anwendung in eine virtuelle MSIX/AppX-Anwendung. Beispielsweise, um zu sehen, ob ein Add-On und eine Anwendung miteinander kompatibel sind, oder um eine Fehlerbehebung durchzuführen.
Dafür werden der PackageFamilyName (Get-AppPackage) und die AppID benötigt. Letztere ist im Application Tag des AppxManifests einer Anwendung zu finden. Mit dem Switch "-Command" wird die zu startende Anwendung angegeben.
Die AppID lässt sich auf folgende Weise ermitteln:
# PackageFullName und PackageFamilyName über Get-AppPackage ermitteln!
$AppID = (Get-AppxPackageManifest $PackageFullName).Package.Applications.Application.id
Der Start einer PowerShell in einer virtuellen Blase kann
wie folgt durchgeführt werden:
Invoke-CommandInDesktopPackage -PackageFamilyName $PackageFamilyName -AppId $AppID -Command powershell.exe
Kommentare