15. Jun 2020
Lesedauer 23 Min.
Quo vadis, MSIX?
Neuerungen bei MSIX
Das Paketformat für Windows-Apps MSIX ist seit mehr als einem Jahr auf dem Markt – Zeit für ein Resümee: Wie hat sich MSIX weiterentwickelt, und wo geht die Reise hin?

MSIX ist mit dem Ziel angetreten, die von Microsoft bereitgestellten Installationstechnologien zu vereinen und somit der würdige Nachfolger von MSI, App-V und AppX zu werden. Auch wenn viele Parameter schon jetzt für MSIX sprechen, scheint dieses Unterfangen noch nicht in aller Gänze gelungen zu sein. Während die Transition von AppX zu MSIX quasi automatisch erfolgt und dabei auch noch zusätzliche Funktionen bietet, sieht das bei MSI und App-V nicht ganz so rosig aus. Fehlende Funktionalitäten innerhalb der MSIX-Technologie verhindern bisher den großen Durchbruch. Der erforderliche Aha-Effekt bleibt aus, und die Kosten-Nutzen-Rechnung zeigt in die falsche Richtung. Dass sich ein Umstieg aber durchaus lohnt, belegen einige Daten, die Microsoft kürzlich präsentiert hat.
- Zuverlässigkeit: Die Erfolgsrate bei MSIX-Installationen liegt bei 99,96 Prozent, während der Windows Installer lediglich eine Erfolgsrate von 80 bis 85 Prozent zu verzeichnen hat. Es gibt deutliche Geschwindigkeitsverbesserungen, gerade in Aktualisierungsszenarien, da hier ein echtes Patchen erfolgt. Die Erfolgsrate bei Deinstallationen liegt bei 100 Prozent.
- Netzwerkbandbreite: MSIX wurde für moderne Systeme und die Cloud entwickelt. Somit wird nur das heruntergeladen, was auch benötigt wird.
- Festplattenspeicher: Windows verwaltet die gemeinsamen Dateien über App-Grenzen hinweg, sodass keine doppelten Dateien in den Anwendungen vorhanden sind.
Tools, Tools, Tools
Der Erfolg einer Technologie ist auch von der Verfügbarkeit der darauf basierenden Tools, Anwendungen und Dokumentationen abhängig. Dies lässt sich sehr gut anhand der noch äußerst präsenten Windows-Installer-Technologie erkennen. In den Anfängen gab es nur einen rudimentären Editor zur Erzeugung von MSI-Paketen mit der Bezeichnung msidb.exe. Der Begriff Editor ist hierbei aber eigentlich zu hoch gegriffen, denn die Inhalte der zu erzeugenden Windows-Installer-Datenbank wurden in Standard-Textdateien beschrieben. Mithilfe von msidb.exe konnten diese Informationen in eine leere Windows-Installer-Datenbank importiert werden, und fertig war das MSI-Paket. Es ist nur zu verständlich, dass nur wenige Entwickler hierdurch angespornt wurden, zu der damals neuen Windows-Installer-Technologie zu wechseln.Mit Orca (One Really Cool App) erhielt das Windows Installer SDK dann einen wirklichen Editor für solche Pakete. Wer jedoch einmal ein komplettes Installationspaket mit Orca erstellt hat, kann verstehen, dass dieses Tool dennoch nicht zu der nötigen Technologie-Akzeptanz geführt hat. Erst mit der Bereitstellung von Third-Party-Tools wie InstallShield, Wise for Windows Installer und schließlich Windows Installer XML begann die Erfolgsstory des Windows Installer, da nun die entsprechende Tool-Unterstützung für IT-Pros und Entwickler gleichermaßen vorhanden war.Ein Windows-Installer-Paket ist aber an Komplexität und Vielfältigkeit nicht zu übertreffen und bietet umfangreiche Installationsoptionen an. Allerdings muss an dieser Stelle kritisch hinterfragt werden, ob diese Funktionalitäten für die Installation tatsächlich benötigt werden oder ob sie vielfach nur „nice to have“ sind. Die Erfahrungen belegen deutlich, dass viele MSI-Installationsfehler nicht auf die zwingend erforderlichen Installationsaufgaben zurückgehen, sondern eher im Usability- und Komfort-Segment zu finden sind. Weniger scheint somit mehr zu sein, und an dieser Stelle kommt MSIX ins Spiel, das sich auf das Wesentliche, den stabilen und effizienten Installationsprozess ohne viel Chichi, konzentriert. Von der Funktionalität her ist MSIX somit gar nicht mit MSI zu vergleichen, und dies sollte auch nicht getan werden. MSIX ist eine völlig neue Technologie, die andere Ansätze verfolgt und somit auch weniger komplizierte Tools benötigt, um letztlich die benötigte Akzeptanz zu erlangen.Weiterentwicklung des MSIX-Verpackungstools
Das MSIX-Verpackungstool oder auch MSIX Packaging Tool [1] ist ein kostenloses Microsoft-Tool, das über den Microsoft Store bezogen werden kann. Seit der ersten Version ermöglicht es die Erstellung von MSIX-Paketen aus unterschiedlichen Quellformaten. Darüber hinaus können Modifikationspakete erstellt und durch den integrierten Paket-Editor nachträgliche Änderungen vorgenommen werden [2]. Das Tool wurde permanent weiterentwickelt und verfügt mittlerweile über viele neue Funktionen, mit denen neue Lösungsansätze und Anforderungen realisiert werden können. Neben den Insider-Builds erscheinen alle drei Monate öffentliche Versionen des Tools, sodass die neuen Funktionen auch schnellstmöglich verwendet werden können. Über einfache Funktionserweiterungen und Optimierungen an der Benutzeroberfläche hinaus wurde das Tool auch um echte Schwergewichte erweitert. Tabelle 1 stellt die wesentlichen Merkmale und Weiterentwicklungen des Tools vor und gibt einen guten Überblick über das derzeitige Leistungsspektrum.Tabelle 1: Wesentliche Merkmale in den öffentlichen Versionen des MSIX-Verpackungstools
|
Festlegen der Konvertierungsumgebung
Eine „echte“ Konvertierung findet nur bei Quellen im App-V-5.x-Format statt. Hierbei wird keine „Pseudoinstallation“ gestartet, sondern die Elemente des App-V-Pakets werden direkt in das neue Format übertragen. Bei den Quellformaten MSI, EXE und mittlerweile auch bei PowerShell-Skripten ist das nicht der Fall. Hier erfolgt eine echte physische Installation der bisherigen Anwendung. Das MSIX-Verpackungstool nutzt einen eigenen Treiber, den es mit dem folgenden Befehl installiert, um Änderungen am System zu protokollieren:dism<span class="hljs-selector-class">.exe</span> /online /add-capability
/capabilityname:Msix<span class="hljs-selector-class">.PackagingTool</span><span class="hljs-selector-class">.Driver</span>
Diese Änderungen werden anschließend ausgewertet, mit den konfigurierten Ausschlusslisten abgeglichen und dann in das zu erstellende MSIX-Paket übertragen. Die Ermittlung der Änderungen ist vielfach nicht trivial, da die Ursache der Systemveränderung nicht immer auf den Installationsprozess bezogen werden kann. Im Windows-Installer-Umfeld besteht die Möglichkeit, den Installationsumfang durch benutzerdefinierte Aktionen zu erweitern [3]. Diese können hierzu in unterschiedlichen Formaten wie einer EXE-Datei vorliegen.Da eine solche Applikation außerhalb des Windows-Installer-Prozesses ausgeführt wird, ist der Zusammenhang zur eigentlichen Installation von außen nicht mehr erkennbar. Da aber ein Zusammenhang zwischen der benutzerdefinierten Aktion und der Funktionsfähigkeit der Anwendung auch nicht auszuschließen ist, können solche Änderungen nicht per se ignoriert werden. Ein Mitschnitt aller Änderungen am System ist somit erforderlich.Zur Verbesserung der Qualität dieses Mitschnitts sind Störfaktoren wie Windows-Updates oder die Windows-Suche zu deaktivieren. Vielfach ist das aber nicht ausreichend, denn auf einem klassischen Entwicklungssystem geschieht noch viel mehr im Hintergrund, was wiederum Auswirkungen auf den Inhalt und die Qualität des Mitschnitts haben kann. Die Nutzung eines Computers, der ausschließlich für den Zweck der Paketerstellung verwendet wird, ist somit anzustreben.Das MSIX-Verpackungstool kann den Mitschnitt sowohl auf dem lokalen System als auch auf einem separaten Paketierungssystem durchführen. Seit jeher besteht die Möglichkeit, hierfür eine virtuelle Hyper-V-Umgebung zu nutzen, deren Erstellung und Konfiguration mittlerweile sehr einfach realisierbar ist. Microsoft stellt für diese Zwecke ein vorgefertigtes MSIX-Paketierungssystem auf Basis von Windows 10 Version 1909 zur Verfügung, das über die Hyper-V-Schnellerfassung problemlos angelegt werden kann, wie Bild 1 zeigt.

Erstellen eines Paketierungssystemsmit der Hyper-V-Schnellerfassung(Bild 1)
Autor
Selbstverständlich können auch bereits bestehende Hyper-V-Systeme verwendet werden, sofern die folgenden Voraussetzungen vorliegen:
- In der virtuellen Maschine muss Windows 10 Version 1809 oder höher ausgeführt werden.
- Der Fernzugriff über die PowerShell muss in der virtuellen Maschine aktiviert werden. Hierzu ist der PowerShell-Befehl Enable-PSRemoting in der VM auszuführen.

Mitschnittauf einem Remote-Computer(Bild 2)
Autor
Signieren des Anwendungspakets
Ein Anwendungspaket muss zur Verwendung mit einem gültigen Codesignaturzertifikat signiert sein, das auf dem Zielsystem als vertrauenswürdig eingestuft wurde. Dies wird ermöglicht, indem das Zertifikat in einen der vertrauenswürdigen Speicherbereiche des Geräts installiert wird. Die Signierung des Pakets ist auf folgende Arten möglich und kann direkt vom MSIX-Verpackungstool durchgeführt werden, wie Bild 3 zeigt:
Signieren eines Anwendungspaketsmit dem MSIX-Verpackungstool(Bild 3)
Autor
- Mit Device Guard anmelden: Hierbei wird das Paket mit einer Device-Guard-Signatur versehen. Die Signierung mit Device Guard ist eine Funktion, die im Microsoft Store für Unternehmen und Bildungseinrichtungen verfügbar ist. Mit ihr können Unternehmen garantieren, dass jede Anwendung von einer vertrauenswürdigen Quelle stammt [5]. Durch die Ankündigung Microsofts, die zuvor genannten Stores zum 30.6.2020 einzustellen, müssen die Auswirkungen auf Device-Guard-Signierung neu bewertet werden, sobald entsprechende Informationen vorliegen.
- Mit einem Zertifikat (.pfx) signieren: Hierbei wird das Paket mit einem Codesignaturzertifikat digital signiert. Das Zertifikat kann hierzu über eine eigene Enterprise Certificate Authority, eine 3rd Party Certificate Authority wie [6], den Microsoft Store beziehungsweise den Microsoft Store für Unternehmen angefordert werden. Darüber hinaus kann ein selbstsigniertes Zertifikat verwendet werden.
- Datei vom Typ .cer angeben (keine Signatur): In einem Anwendungspaket müssen das Attribut Publisher des Elements <Identity/> der Datei AppxManifest.xml und das Subject-Element des Codesignaturzertifikats übereinstimmen [7]. Die verwendete Zertifikatsdatei hat bei dieser Option nur die Aufgabe, dies sicherzustellen. Eine Signierung des Anwendungspakets findet hierbei nicht statt.
- Paket nicht signieren: Das Anwendungspaket wird nicht signiert. Für die spätere Verwendung ist eine nachgelagerte Signierung erforderlich. Es sollte an dieser Stelle darauf geachtet werden, dass analog zur vorherigen Option das Attribut Publisher richtig belegt wird.
Neustart des Computers
Einer Studie zufolge sind Anwendungs- und Betriebssysteminstallationen die häufigsten Verursacher für einen Computerneustart, wobei ein Großteil dieser Neustarts vermeidbar wäre. Die Hauptursache für die Durchführung eines Computerneustarts liegt darin begründet, dass die zum Installationszeitpunkt zu ersetzenden Dateien bereits in Verwendung sind, wie das auch Bild 4 zeigt. Das hieraus abzuleitende Ziel ist, diese Dateien frühzeitig freizugeben, sodass sie problemlos ersetzt werden können. Bei der Erstellung von Anwendungspaketen mit dem MSIX-Verpackungstool sollte die Notwendigkeit eines Computerneustarts gegenüber der produktiven Anwendungsinstallation aus den folgenden Gründen zurückstehen:
Hauptursachenfür einen Computerneustart und Lösungen zur Reduzierung(Bild 4)
Autor
- Der Fokus liegt auf der Erstellung eines Mitschnitts unter Laborbedingungen und nicht auf der Installation unter undefinierten Betriebsbedingungen. Problematische und beeinflussende Faktoren können somit vorab beseitigt werden.
- Der Mitschnitt der Installation sollte auf einem eigens dafür vorgesehenen System durchgeführt werden, auf dem ausschließlich die Voraussetzungen installiert sind. Hierdurch sind Seiteneffekte mit anderen Anwendungen deutlich reduzierter anzutreffen.
- Das System befindet sich in einem neu gestarteten Zustand, sodass die Wahrscheinlichkeit von bereits verwendeten Dateien deutlich reduziert ist.
- Systemdienste wie Windows-Update oder die Windows-Suche sind inaktiv oder werden automatisch deaktiviert.
- 1641(Hard Reboot): Das System wird neu gestartet, damit die Änderungen wirksam werden können.
- 3010 (Soft Reboot): Änderungen werden erst nach einem Neustart des Systems wirksam.
- 3011: Änderungen werden erst nach einem Neustart des Dienstes wirksam.

Aufforderungzu einem Computerneustart(Bild 5)
Autor
Leider erscheint an dieser Stelle kein Hinweis über den tatsächlichen Beendigungscode des Installationsprogramms, sodass die formale Notwendigkeit nicht immer klar ist. Bezogen auf den Windows Installer als Quelle hilft auch das spezifische MSI-Installationsprotokoll nicht weiter, da es durch das MSIX-Verpackungstool lediglich mit dem Argument /le erstellt wird und somit nur Fehlermeldungen enthält. Ein Hinweis auf den Exitcode des MainEngineThread des Windows-Installer-Service oder die Windows-Installer-Eigenschaft MsiSystemRebootPending sind als Hilfestellung nicht vorhanden und können somit nicht herangezogen werden. Das Installationsergebnis in Bezug auf eine Neustartanforderung erfährt an dieser Stelle eine weitere Unschärfe, da sie durch die REBOOT-Eigenschaften des MSI-Pakets individuell beeinflusst werden kann. Es können somit unterschiedliche Situationen auftreten:
- Der Computer wird durch den Windows Installer unmittelbar nach Abschluss der Installation neu gestartet.
- Es wird ein Windows-Installer-Dialog angezeigt, der zum Computerneustart auffordert.
- Es erfolgt keinerlei Rückmeldung über einen erforderlichen Computerneustart.
Verwendung im Befehlszeilenmodus
Neben der interaktiven Ausführung lässt sich das MSIX-Verpackungstool auch in einen Befehlszeilenmodus versetzen. Bezogen auf die Behandlung von Computerneustarts agiert das Tool in diesem Modus wesentlich komfortabler. Die Beendigungscodes werden hierbei direkt ausgewertet, der Computerneustart wird automatisch durchgeführt und der Mitschnitt danach ohne Benutzereingriff fortgesetzt. Bei einem Mitschnitt auf einem virtuellen oder Remote-Computer kann dafür ein Auto-Logon-Feature verwendet werden, das aber noch Optimierungspotenzial bietet.Wie unter [10] beschrieben, kann ein MSIX-Paket mit dem folgenden Befehl in einer Administrator-Eingabeaufforderung erstellt werden:<span class="hljs-string">MsixPackagingTool.</span><span class="hljs-string">exe </span><span class="hljs-built_in">create-package</span> –<span class="hljs-string">template </span><<span class="hljs-string">Pfad </span><span class="hljs-string">zur </span>
<span class="hljs-string">Konfigurationsdatei></span>
Es ist zunächst sicherzustellen, dass das MSIX-Verpackungstool über die Befehlszeile erreichbar ist. Was bei klassischen Desktop-Anwendungen die PATH-Variable ist, ist bei modernen Apps der Alias. In den Windows-Einstellungen muss unter Aliase für die App-Ausführung verwalten die Ausführung für das MSIX Packaging Tool per Befehlszeile aktiviert sein. Im Weiteren muss die Konfigurationsdatei zum Erstellen des Pakets existieren und dem Befehlsaufruf angefügt werden. Hierbei handelt es sich um eine XML-Datei, in der alle Einstellungen zur Erstellung und Konfiguration des Pakets festgelegt wurden. Sie kann manuell erstellt, aber auch automatisch bei der interaktiven Verwendung des MSIX-Verpackungstools erzeugt werden. Wichtig für die Neustartoption ist an dieser Stelle zunächst das Element <Installer/>. Durch das Attribut Path wird der Pfad zur Installationsdatei – also beim Windows Installer der Pfad zur MSI-Datei – festgelegt. Das MSIX-Verpackungstool führt die MSI-Installationen im Hintergrund aus und nutzt standardmäßig dafür die folgenden Konfigurationsargumente:
/qn /norestart INSTALLSTARTMENUSHORTCUTS=<span class="hljs-number">1</span>
DISABLEADVTSHORTCUTS=<span class="hljs-number">1</span>
Innerhalb des Elements <Installer/> können durch das Attribut Arguments ebenfalls Konfigurationsargumente definiert werden, die schließlich an den Installer-Aufruf weitergeleitet werden. In einem solchen Fall werden die gerade dargestellten Standardargumente vollständig überschrieben, sodass das Installationsergebnis abweichen kann. In Bezug auf das Neustartverhalten ist sicherzustellen, dass das Argument /norestart oder das Äquivalent REBOOT=ReallySuppress angegeben wurden. Hierdurch wird gewährleistet, dass das Betriebssystem nicht durch den Windows Installer neu gestartet wird, sondern der Neustart sauber durch das MSIX-Verpackungstool gesteuert und überwacht werden kann. Wird nun die Installation mit den Beendigungscodes 3010 oder 1641 abgeschlossen und wurden diese Codes auch in den Tooleinstellungen definiert, so veranlasst das Tool den Neustart des Systems durch den folgenden Aufruf [11]:
shutdown<span class="hljs-selector-class">.exe</span> -f -r -t <span class="hljs-number">0</span>
Um von den lokalen Tooleinstellungen möglichst unabhängig zu sein, können die Beendigungscodes auch innerhalb des Elements <Settings/> der Konfigurationsdatei definiert werden. Hierbei kann für jeden Beendigungscode individuell bestimmt werden, ob dieser lediglich eine erfolgreiche Installation kennzeichnet oder auch für eine Neustartanforderung steht. Zur Nutzung dieser Funktionalitäten müssen mehrere Namensräume eingebunden werden, bevor dann die Konfiguration durch das Element <ValidInstallerExitCodes/> vorgenommen werden kann, wie das auch in Listing 1 zu erkennen ist.
Listing 1: Erstellen eines Anwendungspakets auf einem Remote-Computer
<span class="php"><span class="hljs-meta">&lt;?</span>xml version=<span class="hljs-string">"1.0"</span><span class="hljs-meta">?&gt;</span></span> <br/><span class="hljs-tag">&lt;<span class="hljs-name">MsixPackagingToolTemplate</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://schemas.microsoft.com/appx/</span></span><br/><span class="hljs-tag"><span class="hljs-string"> msixpackagingtool/template/2018"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">xmlns:p3</span>=<span class="hljs-string">"http://schemas.microsoft.com/msix/</span></span><br/><span class="hljs-tag"><span class="hljs-string"> msixpackagingtool/template/1907"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">xmlns:p4</span>=<span class="hljs-string">"http://schemas.microsoft.com/msix/</span></span><br/><span class="hljs-tag"><span class="hljs-string"> msixpackagingtool/template/1904"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">xmlns:p5</span>=<span class="hljs-string">"http://schemas.microsoft.com/msix/</span></span><br/><span class="hljs-tag"><span class="hljs-string"> msixpackagingtool/template/2001"</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">Settings</span> <span class="hljs-attr">AllowTelemetry</span>=<span class="hljs-string">"false"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">ApplyAllPrepareComputerFixes</span>=<span class="hljs-string">"false"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">GenerateCommandLineFile</span>=<span class="hljs-string">"true"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">AllowPromptForPassword</span>=<span class="hljs-string">"false"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">EnforceMicrosoftStoreVersioningRequirements</span>=<span class="hljs-string">"true"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">p4:ServerPortNumber</span>=<span class="hljs-string">"1599"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">p5:AddPackageIntegrity</span>=<span class="hljs-string">"false"</span> &gt;</span> <br/> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">ExclusionItems</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">FileExclusion</span> <span class="hljs-attr">ExcludePath</span>=<span class="hljs-string">"[...]"</span> /&gt;</span> <br/> (...) <br/> <span class="hljs-tag">&lt;<span class="hljs-name">RegistryExclusion</span> <span class="hljs-attr">ExcludePath</span>=<span class="hljs-string">"..."</span> /&gt;</span> <br/> (...) <br/> <span class="hljs-tag">&lt;/<span class="hljs-name">ExclusionItems</span>&gt;</span> <br/> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">p4:ValidInstallerExitCodes</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">p4:ValidInstallerExitCode</span> <span class="hljs-attr">ExitCode</span>=<span class="hljs-string">"3010"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">p3:Reboot</span>=<span class="hljs-string">"true"</span>/&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">p4:ValidInstallerExitCode</span> <span class="hljs-attr">ExitCode</span>=<span class="hljs-string">"1641"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">p3:Reboot</span>=<span class="hljs-string">"true"</span>/&gt;</span> <br/> <span class="hljs-tag">&lt;/<span class="hljs-name">p4:ValidInstallerExitCodes</span>&gt;</span> <br/> <br/> <span class="hljs-tag">&lt;/<span class="hljs-name">Settings</span>&gt;</span> <br/> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">PrepareComputer</span> <span class="hljs-attr">DisableWindowsSearchService</span>=<span class="hljs-string">"true"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">DisableWindowsUpdateService</span>=<span class="hljs-string">"true"</span> /&gt;</span> <br/> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">SaveLocation</span> <span class="hljs-attr">PackagePath</span>=<span class="hljs-string">"D:\MSIX\NativeNotepad_</span></span><br/><span class="hljs-tag"><span class="hljs-string"> 2.0.8.0_x64.msix"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">TemplatePath</span>=<span class="hljs-string">"D:\MSIX\NativeNotepad_2.0.8.0_x64</span></span><br/><span class="hljs-tag"><span class="hljs-string"> .xml"</span> /&gt;</span> <br/> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">Installer</span> <span class="hljs-attr">Path</span>=<span class="hljs-string">"D:\MSIX\Setup.msi"</span> /&gt;</span> <br/> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">p4:RemoteMachine</span> <span class="hljs-attr">ComputerName</span>=<span class="hljs-string">"W10-19035X64"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">Username</span>=<span class="hljs-string">"TestUser"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">p3:EnableAutoLogon</span>=<span class="hljs-string">"true"</span> /&gt;</span> <br/> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">PackageInformation</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">PackageName</span>=<span class="hljs-string">"NativeNotepadApp"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">PackageDisplayName</span>=<span class="hljs-string">"Native Notepad 2.0 (App)"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">PublisherName</span>=<span class="hljs-string">"CN=AK"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">PublisherDisplayName</span>=<span class="hljs-string">"Andreas Kerl"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">Version</span>=<span class="hljs-string">"2.0.8.0"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">p4:PackageDescription</span>=<span class="hljs-string">"Native Notepad 2.0"</span> /&gt;</span> <br/><span class="hljs-tag">&lt;/<span class="hljs-name">MsixPackagingToolTemplate</span>&gt;</span>
Erfolgt der Mitschnitt nicht auf dem lokalen System, sind zusätzliche Konfigurationen für das jeweilige Paketierungssystem erforderlich. Wird hierfür ein virtuelles System verwendet, sind die diesbezüglichen Konfigurationen im Element <VirtualMachine/> vorzunehmen. Das Anmeldekennwort ist dem Befehlszeilenaufruf über das Argument --virtualMachinePassword zu übergeben. Bei einem Remote-Computer erfolgt die Konfiguration innerhalb des Elements <RemoteMachine/>, und das Kennwort wird über das Argument --machinePassword übergeben. Beide Elemente können zudem das Attribut EnableAutoLogon aufnehmen und somit festlegen, dass nach dem Neustart ein automatischer Login erfolgen soll. Hierzu wird dem Zielsystem der Benutzer MSIXPackagingToolTmp angefügt und der lokalen Administratorengruppe zugeordnet. Nach dem Neustart erfolgen die Anmeldung und die Fertigstellung des Mitschnitts unter diesem Benutzerkonto, das anschließend wieder entfernt wird. Diese Funktionalität ist aktuell nicht oder nur bedingt verwendbar, da sie einige Schwachstellen enthält:
- Bei der ersten Anmeldung durch den neuen Nutzer werden die gesamten Windows-Einrichtungsschritte durchlaufen. Dies ist auf Dauer sehr zeitintensiv, da der Benutzer ja bei jedem Mitschnitt neu erstellt wird.
- Der Mitschnitt unter Verwendung der automatischen Anmeldung funktioniert nur auf einem englischen System, da die zuzuordnende Benutzergruppe „Administrators“ hartcodiert ist und zwangsläufig auf anderssprachigen Systemen zu Fehlern führt.
Installation von Betriebssystemdiensten
Viele Desktop-Anwendungen installieren zusätzlich zur Hauptanwendung einen oder mehrere Betriebssystemdienste. Die Notwendigkeit, solche Dienste auch über ein Anwendungspaket bereitzustellen, ist somit gegeben, um MSIX als Standard-Installationstechnologie zu etablieren und einen Migrationspfad zu beschreiben. Für diese Funktionalität ist es entgegen den bisher vorgestellten Neuerungen nicht nur mit einem Update des MSIX-Verpackungstools getan, sondern sie verlangt auch nach Änderungen am Betriebssystem. Das mag auch damit zu tun haben, dass die Betriebssystemdienste in Abweichung zu „normalen“ Apps nicht im Container ausgeführt werden, wenn sie als Anwendungspaket bereitgestellt werden. Dienste, die in einem MSIX-Paket enthalten sind, werden nativ im System verankert.Listing 2 zeigt den relevanten Ausschnitt eines WXS-Dokuments zur Erstellung eines MSI-Pakets mit Windows Installer XML. Es werden die Dateien SC_ViewerApp.exe, SC_Master.exe und SC_Child.exe ins Anwendungsverzeichnis installiert. Für SC_ViewerApp.exe wird eine Dateiverknüpfung angelegt, sodass die Anwendung hierüber gestartet werden kann. Bei SC_Master.exe und SC_Child.exe handelt es sich um Betriebssystemdienste mit einer Konfiguration für den Start und für die Fehlerbehandlung. Der Dienst SC_Child enthält darüber hinaus eine Abhängigkeit zu SC_Master.Listing 2: WXS-Dokument zur Erstellung eines MSI-Pakets zur Betriebssystemdienst-Installation (Ausschnitt)
<span class="xml"><span class="hljs-comment">&lt;!-- Ordner, Komponenten und Ressourcen --&gt;</span> </span><br/><span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Directory</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"TARGETDIR"</span> <span class="hljs-attr">Name</span>=<span class="hljs-string">"SourceDir"</span>&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;<span class="hljs-name">Directory</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"ProgramFiles64Folder"</span>&gt;</span> </span><br/><br/><span class="xml"> <span class="hljs-comment">&lt;!--Ordnername wird durch Binder-Variablen </span></span><br/><span class="xml"><span class="hljs-comment"> modelliert--&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;<span class="hljs-name">Directory</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"INSTALLLOCATION"</span> <span class="hljs-attr">Name</span>=<span class="hljs-string">"!(</span></span></span><br/><span class="xml"><span class="hljs-tag"><span class="hljs-string"> bind.property.ProductName)"</span>&gt;</span> </span><br/><br/><span class="xml"> <span class="hljs-comment">&lt;!--App--&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;<span class="hljs-name">Component</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"C__SC_ViewerApp"</span> <span class="hljs-attr">Guid</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{</span><br/><span class="hljs-template-variable"> C9B33A42-B05E-43A5-B9AE-6892F779C251}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;<span class="hljs-name">File</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"F__SC_ViewerApp"</span> <span class="hljs-attr">Source</span>=<span class="hljs-string">"$(</span></span></span><br/><span class="xml"><span class="hljs-tag"><span class="hljs-string"> var.SourceFolder)"</span> <span class="hljs-attr">Name</span>=<span class="hljs-string">"SC_ViewerApp.exe"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">KeyPath</span>=<span class="hljs-string">"yes"</span> /&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;<span class="hljs-name">Shortcut</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"S__SC_ViewerApp"</span> <span class="hljs-attr">Directory</span>=</span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-string">"ProgramMenuFolder"</span> <span class="hljs-attr">Name</span>=<span class="hljs-string">"Services Viewer </span></span></span><br/><span class="xml"><span class="hljs-tag"><span class="hljs-string"> 2.0"</span> <span class="hljs-attr">Hotkey</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">Icon</span>=<span class="hljs-string">"I__Icon.exe"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">IconIndex</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">Show</span>=<span class="hljs-string">"normal"</span> <span class="hljs-attr">Advertise</span>=<span class="hljs-string">"yes"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">WorkingDirectory</span> =<span class="hljs-string">"INSTALLLOCATION"</span> /&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;/<span class="hljs-name">Component</span>&gt;</span> </span><br/><br/><span class="xml"> <span class="hljs-comment">&lt;!--Master Service--&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;<span class="hljs-name">Component</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"C__SC_Master"</span> <span class="hljs-attr">Guid</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{</span><br/><span class="hljs-template-variable"> 5EF55263-6F15-4F8A-9ED0-670578B15886}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;<span class="hljs-name">File</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"F__SC_Master"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">Source</span>=<span class="hljs-string">"$(var.SourceFolder)"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">Name</span>=<span class="hljs-string">"SC_Master.exe"</span> <span class="hljs-attr">KeyPath</span>=<span class="hljs-string">"yes"</span> /&gt;</span> </span><br/><br/><span class="xml"> <span class="hljs-tag">&lt;<span class="hljs-name">ServiceInstall</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"C__SC_Master_Install"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">DisplayName</span>=<span class="hljs-string">"SC (Master)"</span> <span class="hljs-attr">ErrorControl</span>=</span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-string">"normal"</span> <span class="hljs-attr">Name</span>=<span class="hljs-string">"SC_Master"</span> <span class="hljs-attr">Start</span>=<span class="hljs-string">"auto"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">Type</span>=<span class="hljs-string">"ownProcess"</span> <span class="hljs-attr">Vital</span>=<span class="hljs-string">"yes"</span> <span class="hljs-attr">Description</span>= </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-string">"Hauptservice der Service-Demo-App"</span> &gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;<span class="hljs-name">util:ServiceConfig</span> <span class="hljs-attr">FirstFailureActionType</span>=</span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-string">"restart"</span> <span class="hljs-attr">SecondFailureActionType</span>=</span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-string">"restart"</span> <span class="hljs-attr">ThirdFailureActionType</span>=<span class="hljs-string">"restart"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">ResetPeriodInDays</span>=<span class="hljs-string">"1"</span> <span class="hljs-attr">RestartServiceDelay</span></span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">InSeconds</span>=<span class="hljs-string">"300"</span> /&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;/<span class="hljs-name">ServiceInstall</span>&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;<span class="hljs-name">ServiceControl</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"C__SC_Master_Control"</span> <span class="hljs-attr">Name</span>=</span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-string">"SC_Master"</span> <span class="hljs-attr">Wait</span>=<span class="hljs-string">"yes"</span> <span class="hljs-attr">Remove</span>=<span class="hljs-string">"uninstall"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">Stop</span>=<span class="hljs-string">"both"</span> <span class="hljs-attr">Start</span>=<span class="hljs-string">"install"</span> /&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;/<span class="hljs-name">Component</span>&gt;</span> </span><br/><br/><span class="xml"> <span class="hljs-comment">&lt;!--Child Service--&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;<span class="hljs-name">Component</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"C__SC_Child"</span> <span class="hljs-attr">Guid</span>=<span class="hljs-string">"</span></span></span><span class="hljs-template-variable">{784A3D65-</span><br/><span class="hljs-template-variable"> F8A1-415D-BCB2-E57F9D8E2AC9}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;<span class="hljs-name">File</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"F__SC_Child"</span> <span class="hljs-attr">Source</span>=<span class="hljs-string">"$(var.Source</span></span></span><br/><span class="xml"><span class="hljs-tag"><span class="hljs-string"> Folder)"</span> <span class="hljs-attr">Name</span>=<span class="hljs-string">"SC_Child.exe"</span> <span class="hljs-attr">KeyPath</span>=<span class="hljs-string">"yes"</span> /&gt;</span></span><br/><br/><span class="xml"> <span class="hljs-tag">&lt;<span class="hljs-name">ServiceInstall</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"C__SC_Child_Install"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">DisplayName</span>=<span class="hljs-string">"SC (Child)"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">ErrorControl</span>=<span class="hljs-string">"normal"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">Name</span>=<span class="hljs-string">"SC_Child"</span> <span class="hljs-attr">Start</span>=<span class="hljs-string">"auto"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">Type</span>=<span class="hljs-string">"ownProcess"</span> <span class="hljs-attr">Vital</span>=<span class="hljs-string">"yes"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">Description</span>=<span class="hljs-string">"Untergeordneter Dienst der </span></span></span><br/><span class="xml"><span class="hljs-tag"><span class="hljs-string"> Service-Demo-App"</span>&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;<span class="hljs-name">util:ServiceConfig</span> <span class="hljs-attr">FirstFailureActionType</span>=</span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-string">"restart"</span> <span class="hljs-attr">SecondFailureActionType</span>=<span class="hljs-string">"restart"</span></span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">ThirdFailureActionType</span>=<span class="hljs-string">"restart"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">ResetPeriodInDays</span>=<span class="hljs-string">"1"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">RestartServiceDelayInSeconds</span>=<span class="hljs-string">"300"</span> /&gt;</span> </span><br/><span class="xml"> <span class="hljs-comment">&lt;!--Abhängig vom Master-Service--&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;<span class="hljs-name">ServiceDependency</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"SC_Master"</span> /&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;/<span class="hljs-name">ServiceInstall</span>&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;<span class="hljs-name">ServiceControl</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"C__SC_Child_Control"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">Name</span>=<span class="hljs-string">"SC_Child"</span> <span class="hljs-attr">Wait</span>=<span class="hljs-string">"yes"</span> <span class="hljs-attr">Remove</span>=<span class="hljs-string">"uninstall"</span> </span></span><br/><span class="xml"><span class="hljs-tag"> <span class="hljs-attr">Stop</span>=<span class="hljs-string">"both"</span> <span class="hljs-attr">Start</span>=<span class="hljs-string">"install"</span> /&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;/<span class="hljs-name">Component</span>&gt;</span> </span><br/><br/><span class="xml"> <span class="hljs-tag">&lt;/<span class="hljs-name">Directory</span>&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;/<span class="hljs-name">Directory</span>&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;<span class="hljs-name">Directory</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"ProgramMenuFolder"</span> /&gt;</span> </span><br/><span class="xml"> <span class="hljs-tag">&lt;<span class="hljs-name">Directory</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"DesktopFolder"</span> /&gt;</span> </span><br/><span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">Directory</span>&gt;</span> </span>
Die Erstellung eines MSIX-Pakets zur Installation von Betriebssystemdiensten ist mit der Version 1.2019.1220 des MSIX-Verpackungstools möglich. Das MSIX-Verpackungstool erkennt die installierten Betriebssystemdienste und zeigt sie im Dienstbericht an. Neben dem Namen und der Beschreibung werden auch die Abhängigkeiten aufgezeigt. Ein Doppelklick auf den jeweiligen Dienst ermöglicht die Anzeige und Änderung einiger Eigenschaften, wie in Bild 6 gezeigt. Abhängigkeiten zu Diensten, die nicht Bestandteil des Pakets sind, werden derzeit nicht unterstützt und somit ausgeschlossen. Selbstverständlich können erkannte Dienste auch manuell ausgeschlossen und auch wieder inkludiert werden. Der Dienstbericht steht nur bei der Paketerstellung zur Verfügung und kann nicht über den Paket-Editor verwendet werden. Sind nachträgliche Änderungen an den Diensten erforderlich, muss das Manifest manuell editiert werden [12].

Das MSIX-Verpackungstoolhat Betriebssystemdienste erkannt(Bild 6)
Autor
Ein Blick in das Manifest [7] des Pakets gibt Aufschluss über die tatsächliche Deklaration, wie das auch in Listing 3 zu erkennen ist. Die Manifest-Datei kann direkt im Paket-Editor des MSIX-Verpackungstools betrachtet oder über die Entpacken-Funktion auch extrahiert werden.
Listing 3: Manifest-Datei eines MSIX-Pakets zur Installation von Betriebssystemdiensten
<span class="hljs-tag">&lt;<span class="hljs-name">Package</span> <span class="hljs-attr">...</span> &gt;</span> <br/> <span class="hljs-comment">&lt;!--Package created by MSIX Packaging Tool version: </span><br/><span class="hljs-comment"> 1.2019.1220.0--&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">Identity</span> <span class="hljs-attr">Name</span>=<span class="hljs-string">"SC-ServiceApp"</span> <span class="hljs-attr">Publisher</span>=<span class="hljs-string">"CN=AK"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">Version</span>=<span class="hljs-string">"2.0.0.0"</span> <span class="hljs-attr">ProcessorArchitecture</span>=<span class="hljs-string">"x64"</span> /&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">Properties</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">DisplayName</span>&gt;</span>SC-ServiceApp (App)<span class="hljs-tag">&lt;/<span class="hljs-name">DisplayName</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">PublisherDisplayName</span>&gt;</span>Andreas Kerl<br/> <span class="hljs-tag">&lt;/<span class="hljs-name">PublisherDisplayName</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">Description</span>&gt;</span>SC-ServiceApp as MSIX Package<br/> <span class="hljs-tag">&lt;/<span class="hljs-name">Description</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">Logo</span>&gt;</span>Assets\StoreLogo.png<span class="hljs-tag">&lt;/<span class="hljs-name">Logo</span>&gt;</span> <br/> <span class="hljs-tag">&lt;/<span class="hljs-name">Properties</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">Resources</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">Resource</span> <span class="hljs-attr">Language</span>=<span class="hljs-string">"en-us"</span> /&gt;</span> <br/> <span class="hljs-tag">&lt;/<span class="hljs-name">Resources</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">Dependencies</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">TargetDeviceFamily</span> <span class="hljs-attr">Name</span>=<span class="hljs-string">"Windows.Desktop"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">MinVersion</span>=<span class="hljs-string">"10.0.19025.0"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">MaxVersionTested</span>=<span class="hljs-string">"10.0.19025.0"</span> /&gt;</span> <br/> <span class="hljs-tag">&lt;/<span class="hljs-name">Dependencies</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">Capabilities</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">rescap:Capability</span> <span class="hljs-attr">Name</span>=<span class="hljs-string">"localSystemServices"</span> /&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">rescap:Capability</span> <span class="hljs-attr">Name</span>=<span class="hljs-string">"packagedServices"</span> /&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">rescap:Capability</span> <span class="hljs-attr">Name</span>=<span class="hljs-string">"runFullTrust"</span> /&gt;</span> <br/> <span class="hljs-tag">&lt;/<span class="hljs-name">Capabilities</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">Applications</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">Application</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"SCVIEWERAPP"</span> <span class="hljs-attr">Executable</span>=<span class="hljs-string">"VFS\</span></span><br/><span class="hljs-tag"><span class="hljs-string"> ProgramFilesX64\SC-ServiceApp\SC_ViewerApp.exe"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">EntryPoint</span>=<span class="hljs-string">"Windows.FullTrustApplication"</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">uap:VisualElements</span> <span class="hljs-attr">BackgroundColor</span>=<span class="hljs-string">"transparent"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">DisplayName</span>=<span class="hljs-string">"Services Viewer 2.0"</span> <span class="hljs-attr">Square150x</span></span><br/><span class="hljs-tag"> <span class="hljs-attr">150Logo</span>=<span class="hljs-string">"Assets\Square150x150Logo.png"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">Square44x44Logo</span>=<span class="hljs-string">"Assets\Square44x44Logo.png"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">Description</span>=<span class="hljs-string">"Services Viewer 2.0"</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">uap:DefaultTile</span> <span class="hljs-attr">Wide310x150Logo</span>=<span class="hljs-string">"Assets\Wide</span></span><br/><span class="hljs-tag"><span class="hljs-string"> 310x150Logo.png"</span> <span class="hljs-attr">Square310x310Logo</span>=<span class="hljs-string">"Assets\</span></span><br/><span class="hljs-tag"><span class="hljs-string"> Square310x310Logo.png"</span> <span class="hljs-attr">Square71x71Logo</span>=</span><br/><span class="hljs-tag"> <span class="hljs-string">"Assets\Square71x71Logo.png"</span> /&gt;</span> <br/> <span class="hljs-tag">&lt;/<span class="hljs-name">uap:VisualElements</span>&gt;</span> <br/> <span class="hljs-tag">&lt;/<span class="hljs-name">Application</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">Application</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"SCCHILD"</span> <span class="hljs-attr">Executable</span>=<span class="hljs-string">"VFS\</span></span><br/><span class="hljs-tag"><span class="hljs-string"> ProgramFilesX64\SC-ServiceApp\SC_Child.exe"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">EntryPoint</span>=<span class="hljs-string">"Windows.FullTrustApplication"</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">uap:VisualElements</span> <span class="hljs-attr">BackgroundColor</span>=<span class="hljs-string">"transparent"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">DisplayName</span>=<span class="hljs-string">"SC (Child)"</span> <span class="hljs-attr">Square150x150Logo</span>=</span><br/><span class="hljs-tag"> <span class="hljs-string">"Assets\Square150x150Logo.png"</span> <span class="hljs-attr">Square44x44</span></span><br/><span class="hljs-tag"> <span class="hljs-attr">Logo</span>=<span class="hljs-string">"Assets\Square44x44Logo.png"</span> <span class="hljs-attr">Description</span>=</span><br/><span class="hljs-tag"> <span class="hljs-string">"Untergeordneter Dienst der Service-Demo-App"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">AppListEntry</span>=<span class="hljs-string">"none"</span> /&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">Extensions</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">desktop6:Extension</span> <span class="hljs-attr">Category</span>=<span class="hljs-string">"windows.service"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">Executable</span>=<span class="hljs-string">"VFS\ProgramFilesX64\</span></span><br/><span class="hljs-tag"><span class="hljs-string"> SC-ServiceApp\SC_Child.exe"</span> <span class="hljs-attr">EntryPoint</span>=</span><br/><span class="hljs-tag"> <span class="hljs-string">"Windows.FullTrustApplication"</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">desktop6:Service</span> <span class="hljs-attr">Name</span>=<span class="hljs-string">"SC_Child"</span> <span class="hljs-attr">Startup</span></span><br/><span class="hljs-tag"> <span class="hljs-attr">Type</span>=<span class="hljs-string">"auto"</span> <span class="hljs-attr">StartAccount</span>=<span class="hljs-string">"localSystem"</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">desktop6:Dependencies</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">desktop6:DependentService</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">Name</span>=<span class="hljs-string">"SC_Master"</span> /&gt;</span> <br/> <span class="hljs-tag">&lt;/<span class="hljs-name">desktop6:Dependencies</span>&gt;</span> <br/> <span class="hljs-tag">&lt;/<span class="hljs-name">desktop6:Service</span>&gt;</span> <br/> <span class="hljs-tag">&lt;/<span class="hljs-name">desktop6:Extension</span>&gt;</span> <br/> <span class="hljs-tag">&lt;/<span class="hljs-name">Extensions</span>&gt;</span> <br/> <span class="hljs-tag">&lt;/<span class="hljs-name">Application</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">Application</span> <span class="hljs-attr">Id</span>=<span class="hljs-string">"SCMASTER"</span> <span class="hljs-attr">Executable</span>=<span class="hljs-string">"VFS\</span></span><br/><span class="hljs-tag"><span class="hljs-string"> ProgramFilesX64\SC-ServiceApp\SC_Master.exe"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">EntryPoint</span>=<span class="hljs-string">"Windows.FullTrustApplication"</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">uap:VisualElements</span> <span class="hljs-attr">BackgroundColor</span>=<span class="hljs-string">"transparent"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">DisplayName</span>=<span class="hljs-string">"SC (Master)"</span> <span class="hljs-attr">Square150x150Logo</span>=</span><br/><span class="hljs-tag"> <span class="hljs-string">"Assets\Square150x150Logo.png"</span> <span class="hljs-attr">Square44x</span></span><br/><span class="hljs-tag"> <span class="hljs-attr">44Logo</span>=<span class="hljs-string">"Assets\Square44x44Logo.png"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">Description</span>=<span class="hljs-string">"Hauptservice der Service-</span></span><br/><span class="hljs-tag"><span class="hljs-string"> Demo-App"</span> <span class="hljs-attr">AppListEntry</span>=<span class="hljs-string">"none"</span> /&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">Extensions</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">desktop6:Extension</span> <span class="hljs-attr">Category</span>=<span class="hljs-string">"windows.service"</span> </span><br/><span class="hljs-tag"> <span class="hljs-attr">Executable</span>=<span class="hljs-string">"VFS\ProgramFilesX64\</span></span><br/><span class="hljs-tag"><span class="hljs-string"> SC-ServiceApp\SC_Master.exe"</span> <span class="hljs-attr">EntryPoint</span>=</span><br/><span class="hljs-tag"> <span class="hljs-string">"Windows.FullTrustApplication"</span>&gt;</span> <br/> <span class="hljs-tag">&lt;<span class="hljs-name">desktop6:Service</span> <span class="hljs-attr">Name</span>=<span class="hljs-string">"SC_Master"</span> <span class="hljs-attr">Startup</span></span><br/><span class="hljs-tag"> <span class="hljs-attr">Type</span>=<span class="hljs-string">"auto"</span> <span class="hljs-attr">StartAccount</span>=<span class="hljs-string">"localSystem"</span> /&gt;</span> <br/> <span class="hljs-tag">&lt;/<span class="hljs-name">desktop6:Extension</span>&gt;</span> <br/> <span class="hljs-tag">&lt;/<span class="hljs-name">Extensions</span>&gt;</span> <br/> <span class="hljs-tag">&lt;/<span class="hljs-name">Application</span>&gt;</span> <br/> <span class="hljs-tag">&lt;/<span class="hljs-name">Applications</span>&gt;</span> <br/><span class="hljs-tag">&lt;/<span class="hljs-name">Package</span>&gt;</span>
Während der Mitschnitt einer Dienst-Installation auch auf einer älteren Betriebssystemversion erfolgen kann, ist das für die Installation von Diensten mit einem MSIX-Paket nicht mehr möglich. Hierfür ist eine neuere Betriebssystemversion erforderlich. Dies ist im Element <TargetDeviceFamily/> für die Gerätefamilie Windows.Desktop festgelegt. Als Mindestversion muss Version 10.0.19025.0 definiert werden. Hierbei handelt es sich um den ersten Windows-Insider-Build, der die Implementierung zur Installation von Betriebssystemdiensten enthielt. Im produktiven Umfeld sind Insider-Builds eher selten anzutreffen, sodass dort Windows 10 Version 2004 oder höher erforderlich ist.Während normale MSIX-Pakete mit den Privilegien des Standardbenutzers installiert werden, benötigt die Installation von Betriebssystemdiensten administrative Privilegien:
<span class="hljs-keyword">Add</span>-AppPackage : Fehler bei Bereitstellung. HRESULT:
<span class="hljs-number">0x80073CF6</span>, <span class="hljs-keyword">Das</span> Paket konnte nicht registriert werden.
AppxManifest.xml(<span class="hljs-number">43</span>,<span class="hljs-number">12</span>): Fehler <span class="hljs-number">0x80073D28</span>: <span class="hljs-keyword">Das</span>
SC-ServiceApp_2<span class="hljs-meta">.0</span><span class="hljs-meta">.0</span>.0_x64__yf5adtgdrdj2a-Paket konnte
nicht registriert werden. Zum Installieren des
Paketdienstes sind Administratorrechte erforderlich.
Angefordert werden die erhöhten Privilegien durch die neuen App-Funktionen localSystemServices und packagedServices [13], die im Element <Capability/> des Namensraums rescap definiert wurden. Die Spezifizierung der Betriebssystemdienste und deren Eigenschaften erfolgt durch die Elemente der Schemaerweiterung desktop6:Extension [14].Sofern die gerade erläuterten Voraussetzungen erfüllt sind, lässt sich das Anwendungspaket aus einer administrativen PowerShell-Konsole heraus installieren oder durch die Provisioning-Funktionen [15] systemweit bereitstellen. Verglichen mit „normalen“ MSIX-Paketen verhält sich ein Paket mit Betriebssystemdiensten etwas anders, da der Windows-Dienst an einer zentralen Stelle des Betriebssystems nativ registriert wird. Bei der Installation des Pakets in einer Multi-User-Umgebung werden zunächst der App-Teil und der Service-Teil für den entsprechenden Benutzer registriert. Der Service-Teil wird zudem systemweit verankert, sodass er bereits allen anderen Benutzern zur Verfügung steht, ohne dass diese das Paket installiert haben. Bei der Deinstallation ist es genau umgekehrt: Der Dienst bleibt so lange auf dem System, bis der letzte Benutzer das Paket deinstalliert hat. Wesentlich problematischer verhält es sich, falls der Betriebssystemdienst auch mit dem MSIX-Paket einer anderen Anwendung installiert werden soll. Dieses Szenario ist derzeitig nicht möglich, und die Installation wird wie folgt beendet:
Fehler <span class="hljs-keyword">bei </span>der App-<span class="hljs-keyword">Installation. </span>Fehlermeldung: Fehler
<span class="hljs-number">0x80073D26</span>: <span class="hljs-keyword">Beim </span>Verarbeiten der Anforderung konnte
<span class="hljs-keyword">die </span>Erweiterung <span class="hljs-string">"windows.service"</span> aufgrund des
folgenden Fehlers nicht registriert werden: <span class="hljs-keyword">Die </span>
Paketinstallation ist fehlgeschlagen, da <span class="hljs-keyword">eine </span><span class="hljs-keyword">andere </span>
Version des <span class="hljs-keyword">Dienstes </span><span class="hljs-keyword">installiert </span>ist.
Unabhängig von diesem Problem ist es möglich und überaus ratsam, die Betriebssystemdienste in ein eigenes MSIX-Paket auszulagern und dieses als Voraussetzung in den „normalen“ Anwendungspaketen zu definieren. Durch den modularen Ansatz und der Technologietrennung lassen sich Aktualisierungen oder Erweiterungen wesentlich zielgerichteter erstellen und anwenden.
Interaktive Installationen mit dem App-Installer
Zur Bereitstellung von quergeladenen MSIX-Anwendungspaketen kann neben der Windows PowerShell auch der Microsoft App-Installer verwendet werden. Hierbei handelt es sich um eine App, die mit Windows 10 Version 1703 in das Betriebssystem integriert wurde. Obwohl der App-Installer nicht an die Möglichkeiten der Windows PowerShell heranreicht, haben erhebliche Weiterentwicklungen stattgefunden, sodass viele Anwendungsszenarien hiermit nun realisierbar sind. Der App-Installer ermöglicht die interaktive Installation und Wartung von Anwendungen, die in den folgenden Anwendungspaketen verpackt beziehungsweise referenziert sind:- MSIX-Paket und MSIX-Bundle (.msix, .msixbundle)
- APPX-Paket und APPX-Bundle (.appx, .appxbundle)
- APPINSTALLER-Datei (.appinstaller)
- Name:<Properties:DisplayName/>
- Version: <Identity:Version/>
- Herausgeber:<Properties: PublisherDisplayName/>
- Symbol:<Properties:Logo/>
- Funktionen:<Capabilities/>

Darstellung eines Downgradesim App-Installer(Bild 7)
Autor
Die Installation von Betriebssystemdiensten erfordert administrative Privilegien, sodass eine entsprechende PowerShell-Konsole hierfür erforderlich ist. Mit der neuesten Version des App-Installer ist die Installation ebenfalls möglich. Die Prüfung auf die Notwendigkeit administrativer Berechtigungen für die Installation erfolgt anhand der Capabilities-Auflistung des Manifests. Sobald hier die Funktion packagedServices aufgeführt wurde, sind erhöhte Privilegien für die Installation und Wartung erforderlich. Wird ein solches Paket doppelt angeklickt, weist das Schildsymbol auf der Installations-Schaltfläche auf die Notwendigkeit der Rechteerhöhung hin, wie das auch in Bild 8 erkennbar ist. Nach Aktivierung erfolgt dann der bekannte Bestätigungsdialog der Benutzerkontensteuerung.

Administrative Privilegienbei der Installation mit dem App-Installer(Bild 8)
Autor
Troubleshooting von Anwendungspaketen
Durch die Isolation der Anwendungspakete und die nur in Einzelfällen vorhandene stärkere Verzahnung mit dem Betriebssystem sind die Installations- und Wartungsprozesse wesentlich zuverlässiger als beim „alten“ Windows Installer. Auch wenn Erfolgsraten jenseits der 99 Prozent wenig Anlass zur Sorge bieten sollten, ist die Installation nur die eine Seite der Medaille. Die Kehrseite befasst sich mit der Funktionalität der Anwendung, und hier sieht es nicht so rosig aus, da Alt-Applikationen originär nicht für eine Verwendung im Container konzipiert wurden. Wirkungsvolle und effiziente Vorgehensweisen und Tools für das Troubleshooting sind daher unerlässlich.Beim Windows Installer kann ein proprietäres Installationsprotokoll erzeugt werden, das je nach Konfiguration immens umfangreiche Informationen beinhaltet. Bei MSIX ist das nicht erforderlich, denn alle diesbezüglichen Bereitstellungsaktivitäten werden automatisch protokolliert und in der Windows-Ereignisanzeige dargestellt. Die folgenden Protokolle sind unter Anwendungs- und Dienstprotokolle | Microsoft | Windows zu finden:- Bereitstellung:AppXDeployment-Server | Microsoft-Windows-AppXDeploymentServer | Operational
- Zustand:AppXDeployment | Operational
- Manifest und Signaturen:AppxPackagingOM | Microsoft-Windows-AppxPackaging | Operational
<span class="hljs-keyword">Get</span>-AppPackageLog -<span class="hljs-keyword">All</span>
Kommt es bei der Bereitstellung eines Anwendungspakets zu einem Fehler, wird je nach verwendeter Technologie eine informative Fehlerbeschreibung in der Windows PowerShell oder der App-Installer-Benutzeroberfläche angezeigt. Die Windows PowerShell geht dabei noch etwas weiter. Kommt es in der jeweiligen PowerShell-Session zu einem Fehler, können ergänzende Informationen mit dem in Listing 4 gezeigten Befehl abgerufen werden.
Listing 4: Ergänzende Informationen zu Fehlern abrufen
PS C:&gt; Get-AppPackageLastError <br/>Event logs for command: <span class="hljs-string">""</span> <br/><br/>Time ID Message <br/>---- -- ------- <br/><span class="hljs-number">05.01</span><span class="hljs-meta">.2020</span> <span class="hljs-number">14</span>:<span class="hljs-number">13</span>:<span class="hljs-number">00</span> <span class="hljs-number">603</span> Der Bereitstellungsvorgang <span class="hljs-keyword">Add</span> wurde für ein Paket mit dem Hauptparameter <br/> NativeNotepad2<span class="hljs-meta">.0_2</span><span class="hljs-meta">.0</span><span class="hljs-meta">.1</span>.0_x64__yf5adtgdrdj2a.msix und den Optionen <span class="hljs-number">0</span> und <span class="hljs-number">0</span> <br/> gestartet. Weitere Informationen zum Diagnostizieren von Problemen bei <br/> der Bereitstellung von Apps finden Sie unter <br/> http://go.microsoft.com/fwlink/?LinkId=<span class="hljs-number">235160</span>. <br/><span class="hljs-number">05.01</span><span class="hljs-meta">.2020</span> <span class="hljs-number">14</span>:<span class="hljs-number">13</span>:<span class="hljs-number">01</span> <span class="hljs-number">156</span> Fehler <span class="hljs-number">0x800B0100</span>: <span class="hljs-keyword">Das</span> App-Paket muss für die Signaturüberprüfung digital <br/> signiert sein. <br/><span class="hljs-number">05.01</span><span class="hljs-meta">.2020</span> <span class="hljs-number">14</span>:<span class="hljs-number">13</span>:<span class="hljs-number">01</span> <span class="hljs-number">465</span> Fehler <span class="hljs-number">0x800B0100</span>: Fehler beim Öffnen des Pakets im Speicherort <br/> <span class="hljs-string">"NativeNotepad2.0_2.0.1.0_x64__yf5adtgdrdj2a.msix"</span>. <br/><span class="hljs-number">05.01</span><span class="hljs-meta">.2020</span> <span class="hljs-number">14</span>:<span class="hljs-number">13</span>:<span class="hljs-number">01</span> <span class="hljs-number">497</span> Fehler <span class="hljs-number">0x80070002</span>: Fehler beim Öffnen des Msixvc-Pakets vom Speicherort <br/> NativeNotepad2<span class="hljs-meta">.0_2</span><span class="hljs-meta">.0</span><span class="hljs-meta">.1</span>.0_x64__yf5adtgdrdj2a.msix. Überprüfen Sie, ob die <br/> Msixvc-Supportdienste installiert sind. <br/><span class="hljs-number">05.01</span><span class="hljs-meta">.2020</span> <span class="hljs-number">14</span>:<span class="hljs-number">13</span>:<span class="hljs-number">01</span> <span class="hljs-number">403</span> Fehler <span class="hljs-number">0x800B0100</span>: Fehler beim Abrufen der Stagingsitzung für: <br/> file:///D:/MSIX/NativeNotepad2<span class="hljs-meta">.0_2</span><span class="hljs-meta">.0</span><span class="hljs-meta">.1</span>.0_x64__yf5adtgdrdj2a.msix.
Wesentlich schwieriger sind Fehler zu identifizieren, die sich auf die Funktionsfähigkeit der Anwendung auswirken, weil beispielsweise eine Datei nicht richtig geladen wurde oder ein Registrierungsschlüssel nicht existiert, um nur einige Probleme zu benennen.Solche Fehlerbilder sind im klassischen Desktop-Umfeld hinlänglich bekannt und durch den direkten Anwendungs- und Systemzugriff relativ einfach ermittelbar. Bei MSIX-Anwendungen ist das etwas schwieriger, da diese in einem Container ausgeführt werden und ein virtualisiertes Dateisystem und eine virtualisierte Systemregistrierung nutzen [2]. Da der Container nur geladen wird, wenn die App ausgeführt wird, ist die Fehlersuche ungleich komplizierter. Aus diesem Grund kann es erforderlich werden, Befehle innerhalb des jeweiligen Anwendungspakets auszuführen. Das ermöglicht den Zugriff auf alle virtualisierten Ressourcen, und die folgenden Anforderungen können geprüft und sichergestellt werden:
- Dateien und Registrierungseinträge befinden sich wie in der Manifest-Datei beschrieben an der richtigen Position im virtuellen Paket.
- Das virtuelle Dateisystem und die virtuelle Registrierung eines Modifikationspakets werden mit dem Basispaket korrekt zusammengeführt.
- Im Paket enthaltene ausführbare Dateien, die nicht zwingend als Einstiegspunkt festgelegt wurden, lassen sich korrekt und fehlerfrei ausführen.
- Paketfamilie:(Get-AppPackage -Name <Name>).PackageFamilyName
- AppID:(Get-AppPackageManifest -Package <Paket>).Package.Applications.Application.Id
- cmd.exe
- powershell.exe
- regedit.exe
- notepad.exe
- Ausführbare Dateien, die Bestandteil des Pakets sind
PS <span class="hljs-string">C:</span>\ >Invoke-CommandInDesktopPackage -AppId <span class="hljs-string">"App"</span>
-PackageFamilyName <span class="hljs-string">"NativeNotepadApp_yf5adtgdrdj2a"</span>
-Command <span class="hljs-string">"powershell.exe"</span> -PreventBreakaway
Durch den Parameter -PreventBreakaway wird sichergestellt, dass der gesamte Prozessbaum im Paketkontext verbleibt. Anwendungen, die in dem Beispiel aus der PowerShell aufgerufen werden, verbleiben im Paketkontext und können somit zur Analyse herangezogen werden. Eine sehr gute Hilfestellung gibt die Detailansicht des Task-Managers, sofern die Spalte Paketname eingeblendet wurde. Hiermit wird deutlich, ob die jeweiligen Troubleshooting-Anwendungen im Kontext des Pakets ausgeführt werden, wie das in Bild 9 erkennbar ist.

Separate Anwendungenwerden im Paketkontext ausgeführt(Bild 9)
Autor
Die Nutzung des Befehls Invoke-CommandInDesktopPackage innerhalb der Windows PowerShell ist nur eine Möglichkeit, solche Anwendungsfälle zu analysieren. Eine Alternative bietet die kostenlose Anwendung Hover [17]. Diese stellt in einer grafischen Benutzeroberfläche alle installierten Anwendungspakete dar und ermöglicht den Start einer beliebigen Anwendung im Paketkontext durch Mausklick, wie auch Bild 10 zeigt.

Die Anwendung Hoverunterstützt beim Troubleshooting von Anwendungspaketen(Bild 10)
Autor
Fazit
Seit der Veröffentlichung von MSIX hat sich nicht nur die Technologie weiterentwickelt, sondern auch die Tools haben einen großen Schritt nach vorn getan. Das MSIX-Verpackungstool wurde um viele Funktionen erweitert, und auch die Verwendung geht mittlerweile flüssiger von der Hand. Dem App-Installer wurden einige Funktionen spendiert, die sonst nur den Profis über die Windows PowerShell zur Verfügung standen. Neben diesen MSIX-Standardtools haben sich auch Tools etabliert, die eher in der zweiten Reihe zu finden sind. Mit dem AppInstaller File Builder [18] wird die Erstellung von APPINSTALLER-Dateien zum Kinderspiel, sodass sich automatische Updates wesentlich einfacher realisieren lassen. Mit MSIX Core [19] wird die MSIX-Funktionalität mit eingeschränktem Umfang nun auch für Systeme vor Windows 10 Version 1709 verfügbar gemacht, was gerade für die LTSC-Versionen von Windows 10 interessant sein dürfte.Weitere Indikatoren lassen auch die künftige Bereitstellungsstrategie von Microsoft erahnen. Hier zeigt sich mehr als deutlich, dass der Store nicht mehr die erste Wahl ist. Die angekündigte Abschaltung der Microsoft Stores für Unternehmen und Bildungseinrichtungen spricht eine deutliche Sprache. Die Aufwertung des Querladens durch neue Funktionen wie automatische Updates und die standardmäßige Aktivierung in Windows 10 Version 2004 [20] geben unmissverständliche Antworten. Es zeigt sich mehr als deutlich, dass MSIX tatsächlich auf dem Weg, ist den Windows Installer zu beerben, auch wenn dieser Weg voraussichtlich noch lang und steinig wird. Aber die Perspektive ist vorhanden und die Technologie steht bereit.Fussnoten
- MSIX-Verpackungstool, http://www.dotnetpro.de/SL2007MSIXNews1
- Andreas Kerl, Clever verpackt, Anwendungs-Setups mit MSIX, dotnetpro 8/2019, Seite 58 ff., http://www.dotnetpro.de/A1908MSIXEnterprise
- Andreas Kerl, Die eigene Note, Installationsprozesse durch benutzerdefinierte Aktionen erweitern, dotnetpro 12/2007, Seite 92 ff., http://www.dotnetpro.de/A0712OrcasDeploy
- Setup instructions for remote machine conversions, http://www.dotnetpro.de/SL2007MSIXNews2
- Sign an MSIX package with Device Guard signing, http://www.dotnetpro.de/SL2007MSIXNews3
- https://www.digicert.com, https://www.digicert.com
- Andreas Kerl, Das Ende einer Ära, MSI + APPX = MSIX, dotnetpro 2/2019, Seite 86 ff., http://www.dotnetpro.de/A1902MSIX
- Zeitstempelserver Comodoca, http://timestamp.comodoca.com
- Zeitstempelserver Digicert, http://timestamp.digicert.com
- Conversion with Command Line Interface (CLI), http://www.dotnetpro.de/SL2007MSIXNews4
- Shutdown, http://www.dotnetpro.de/SL2007MSIXNews5
- Convert an installer that includes services, http://www.dotnetpro.de/SL2007MSIXNews6
- Restricted capabilities, http://www.dotnetpro.de/SL2007MSIXNews7
- desktop6:Extension, http://www.dotnetpro.de/SL2007MSIXNews8
- Add-AppxProvisionedPackage, http://www.dotnetpro.de/SL2007MSIXNews9
- Invoke-CommandInDesktopPackage, http://www.dotnetpro.de/SL2007MSIXNews10
- Hover, http://www.dotnetpro.de/SL2007MSIXNews11
- AppInstaller File Builder, http://www.dotnetpro.de/SL2007MSIXNews12
- MSIX Core, http://www.dotnetpro.de/SL2007MSIXNews13
- Andreas Kerl, MSIX-Pakete verwalten, Unter der Haube von MSIX, dotnetpro 7/2020, Seite 22 ff., http://www.dotnetpro.de/A2007MSIX