Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Lesedauer 23 Min.

Quo vadis, 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?
© Shutterstock / AVA Bitter
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.
Auch wenn diese Aussagen für sich sprechen, zeigen fehlende Funktionalitäten in die entgegengesetzte Richtung. Um die tatsächliche Akzeptanz von MSIX zu steigern, ist ein Nachrüsten dieser fehlenden Funktionalitäten unabdingbar. Hiermit wurde bereits im letzten Jahr begonnen, und viele inte­ressante Neuerungen und Anpassungen sind in die Technologie eingeflossen, sodass der nach vorne gerichtete Blick durchaus vielversprechend erscheint.

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 Installa­tionsaufgaben 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 Funk­tionserweiterungen 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

Signatur ohne Zeitstempel Signatur mit Zeitstempel
Zertifikat ist gültig App wird installiert. App wird installiert.
Zertifikat ist ungültig (abgelaufen) App wird nicht installiert. Die App wird installiert, da die Authentizität des Zertifikats zum Zeitpunkt der Signierung überprüft wurde.

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 Ak­tion 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-Schnell­erfassung problemlos angelegt werden kann, wie Bild 1 zeigt.
Erstellen eines Paketierungssystemsmit der Hyper-V-Schnell­erfassung(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.
Die Vorgehensweise für den Mitschnitt ist dann analog zum lokalen System durchzuführen. Alle Konfigurationen, also die Auswahl des Installationspakets, des Zertifikats und schließlich die Festlegung des Speicherorts, erfolgen auf dem Host. Die tatsächliche Installation und der Mitschnitt werden auf der virtuellen Maschine durchgeführt und das erstellte MSIX-Paket nach Fertigstellung auf den Host übertragen.Seit der Version 1.2019.402.0 des MSIX-Verpackungstools kann der Mitschnitt, wie in Bild 2 dargestellt, auch auf einem Remote-Computer erfolgen. Die Vorgehensweise und die Ergebnisbereitstellung sind identisch mit der Lösungsmöglichkeit auf einer virtuellen Maschine. Die vorbereitenden Maßnahmen und Konfigurationen fallen möglicherweise jedoch umfangreicher aus, da sie stark von der verwendeten Infrastruktur abhängen. Die genaue Vorgehensweise zeigt [4]. In den Einstellungen des Paketierungstools kann die präferierte Konvertierungsumgebung als Standard festgelegt werden.
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 Codesignatur­zertifikats übereinstimmen [7]. Die verwendete Zertifikats­datei 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.
In den Einstellungen des MSIX-Verpackungstools können die gewünschte Signieroption und gegebenenfalls das verwendete Zertifikat voreingestellt werden.Neben der Signatur sollte das Anwendungspaket zusätzlich mit einem Zeitstempel versehen werden. Hierdurch kann die Gültigkeit des Codesignaturzertifikats effektiver bestimmt werden. Beim Installationsaufruf erfolgt eine Validierung der Paketsignatur und des Signaturzeitpunkts. Durch ­einen Zeitstempel können Pakete auch dann akzeptiert werden, wenn das Zertifikat bereits abgelaufen ist. Anwendungspakete ohne Zeitstempel werden gegen die aktuelle Zeit geprüft. Ist das Zertifikat zu diesem Zeitpunkt bereits abgelaufen, wird das Anwendungspaket von Windows nicht mehr akzeptiert, wie auch die Anwendungsfälle in Tabelle 2 zeigen. Das Hinzufügen eines Zeitstempels zum Anwendungspaket ist mittlerweile über das MSIX-Verpackungstool möglich. Hier kann ein Zeitstempelserver wie [8] oder [9] referenziert werden, der den Signaturzeitpunkt festlegt.

Neustart des Computers

Einer Studie zufolge sind Anwendungs- und Betriebssystem­installationen 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 Installa­tionszeitpunkt 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.
Trotz optimaler Vorbereitungen und Bedingungen ist ein Computerneustart während eines Mitschnitts nicht immer auszuschließen. Sei es beispielsweise, dass mehrere Installationsprogramme innerhalb eines Mitschnitts ausgeführt werden müssen, die sich gegenseitig beeinflussen, oder dass aus Gründen des Anwendungsdesigns ein Neustart nach Abschluss der Installation erforderlich ist. Das MSIX-Verpackungstool kann mittlerweile mit solchen Situationen umgehen und trotz Computerneustarts den Mitschnitt anschließend fortsetzen und abschließen. Der Computerneustart bezieht sich aber ausschließlich auf den Entwicklungsprozess; die spätere Installation des MSIX erfolgt natürlich ohne Neustart des Computers.In den Tooleinstellungen lassen sich nun die Beendigungscodes für das Installationsprogramm definieren, die eine ­erfolgreiche Installation darstellen, jedoch einen Neustart ­benötigen. Standardmäßig sind dort folgende Beendigungscodes bereits enthalten:
  • 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.
Sollte das verwendete Installationsprogramm davon abweichende Beendigungscodes nutzen, so müssen diese ergänzt werden. In Bezug auf die Installation von Betriebssystemdiensten empfiehlt sich die Aufnahme des folgenden Codes:
  • 3011: Änderungen werden erst nach einem Neustart des Dienstes wirksam.
Die festgelegten Beendigungscodes haben allerdings nur bedingt Auswirkungen auf die Erstellung eines Mitschnitts über die Benutzeroberfläche des MSIX-Verpackungstools. Sie fungieren hierbei lediglich als Indikator für eine erfolgreiche Installation, aber steuern nicht das Neustartverhalten. Wird eine Installation beispielsweise mit dem Rückgabewert 3010 beendet und wurde dieser Wert in den Tooleinstellungen nicht definiert, wird die Installation als fehlerhaft interpretiert und der Mitschnitt beendet. Wurde die 3010 in den Tooleinstellungen hingegen festgelegt, wird die Installation als erfolgreich angesehen und der in Bild 5 dargestellte Dialog angezeigt. Hiermit wird der Benutzer aufgefordert, einen Neustart manuell zu initiieren, falls dieser aus seiner Sicht erforderlich ist. Die Darstellung des Dialogs ist aber unabhängig vom tatsächlichen Beendigungscode. Wird eine Installation mit 0 (ERROR_SUCCESS) erfolgreich beendet, kann der Benutzer auf die identische Weise einen Neustart veranlassen. Die Notwendigkeit eines Neustarts wird somit nicht durch das Tool bestimmt, sondern durch den Anwender.
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.
Das MSIX-Verpackungstool ist aber intelligent genug, dies zu berücksichtigen. Falls es zu einem Computerneustart kommt, wird das MSIX-Verpackungstool im Anschluss neu gestartet und die Tätigkeiten können von dieser Position aus fortgesetzt werden. Hierbei ist es unerheblich, ob der Computerneustart durch den Benutzer initiiert wird oder durch das Installationsprogramm direkt veranlasst wurde.

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>&lt;<span class="hljs-string">Pfad </span><span class="hljs-string">zur </span>
  <span class="hljs-string">Konfigurationsdatei&gt;</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
&lt;span class="php"&gt;&lt;span class="hljs-meta"&gt;&amp;lt;?&lt;/span&gt;xml version=&lt;span class="hljs-string"&gt;"1.0"&lt;/span&gt;&lt;span class="hljs-meta"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt; &lt;br/&gt;&lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;MsixPackagingToolTemplate&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;  &lt;span class="hljs-attr"&gt;xmlns&lt;/span&gt;=&lt;span class="hljs-string"&gt;"http://schemas.microsoft.com/appx/&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;    msixpackagingtool/template/2018"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;  &lt;span class="hljs-attr"&gt;xmlns:p3&lt;/span&gt;=&lt;span class="hljs-string"&gt;"http://schemas.microsoft.com/msix/&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;    msixpackagingtool/template/1907"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;  &lt;span class="hljs-attr"&gt;xmlns:p4&lt;/span&gt;=&lt;span class="hljs-string"&gt;"http://schemas.microsoft.com/msix/&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;    msixpackagingtool/template/1904"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;  &lt;span class="hljs-attr"&gt;xmlns:p5&lt;/span&gt;=&lt;span class="hljs-string"&gt;"http://schemas.microsoft.com/msix/&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;    msixpackagingtool/template/2001"&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Settings&lt;/span&gt; &lt;span class="hljs-attr"&gt;AllowTelemetry&lt;/span&gt;=&lt;span class="hljs-string"&gt;"false"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;      &lt;span class="hljs-attr"&gt;ApplyAllPrepareComputerFixes&lt;/span&gt;=&lt;span class="hljs-string"&gt;"false"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;    &lt;span class="hljs-attr"&gt;GenerateCommandLineFile&lt;/span&gt;=&lt;span class="hljs-string"&gt;"true"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;    &lt;span class="hljs-attr"&gt;AllowPromptForPassword&lt;/span&gt;=&lt;span class="hljs-string"&gt;"false"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;    &lt;span class="hljs-attr"&gt;EnforceMicrosoftStoreVersioningRequirements&lt;/span&gt;=&lt;span class="hljs-string"&gt;"true"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;      &lt;span class="hljs-attr"&gt;p4:ServerPortNumber&lt;/span&gt;=&lt;span class="hljs-string"&gt;"1599"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;      &lt;span class="hljs-attr"&gt;p5:AddPackageIntegrity&lt;/span&gt;=&lt;span class="hljs-string"&gt;"false"&lt;/span&gt;  &amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;ExclusionItems&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;FileExclusion&lt;/span&gt; &lt;span class="hljs-attr"&gt;ExcludePath&lt;/span&gt;=&lt;span class="hljs-string"&gt;"[...]"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;br/&gt;      (...) &lt;br/&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;RegistryExclusion&lt;/span&gt; &lt;span class="hljs-attr"&gt;ExcludePath&lt;/span&gt;=&lt;span class="hljs-string"&gt;"..."&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;br/&gt;      (...) &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;ExclusionItems&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;	  &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;p4:ValidInstallerExitCodes&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;p4:ValidInstallerExitCode&lt;/span&gt; &lt;span class="hljs-attr"&gt;ExitCode&lt;/span&gt;=&lt;span class="hljs-string"&gt;"3010"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;        &lt;span class="hljs-attr"&gt;p3:Reboot&lt;/span&gt;=&lt;span class="hljs-string"&gt;"true"&lt;/span&gt;/&amp;gt;&lt;/span&gt; &lt;br/&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;p4:ValidInstallerExitCode&lt;/span&gt; &lt;span class="hljs-attr"&gt;ExitCode&lt;/span&gt;=&lt;span class="hljs-string"&gt;"1641"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;        &lt;span class="hljs-attr"&gt;p3:Reboot&lt;/span&gt;=&lt;span class="hljs-string"&gt;"true"&lt;/span&gt;/&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;p4:ValidInstallerExitCodes&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Settings&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;PrepareComputer&lt;/span&gt; &lt;span class="hljs-attr"&gt;DisableWindowsSearchService&lt;/span&gt;=&lt;span class="hljs-string"&gt;"true"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;    &lt;span class="hljs-attr"&gt;DisableWindowsUpdateService&lt;/span&gt;=&lt;span class="hljs-string"&gt;"true"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;SaveLocation&lt;/span&gt; &lt;span class="hljs-attr"&gt;PackagePath&lt;/span&gt;=&lt;span class="hljs-string"&gt;"D:\MSIX\NativeNotepad_&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;      2.0.8.0_x64.msix"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;    &lt;span class="hljs-attr"&gt;TemplatePath&lt;/span&gt;=&lt;span class="hljs-string"&gt;"D:\MSIX\NativeNotepad_2.0.8.0_x64&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;      .xml"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Installer&lt;/span&gt; &lt;span class="hljs-attr"&gt;Path&lt;/span&gt;=&lt;span class="hljs-string"&gt;"D:\MSIX\Setup.msi"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;p4:RemoteMachine&lt;/span&gt; &lt;span class="hljs-attr"&gt;ComputerName&lt;/span&gt;=&lt;span class="hljs-string"&gt;"W10-19035X64"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;    &lt;span class="hljs-attr"&gt;Username&lt;/span&gt;=&lt;span class="hljs-string"&gt;"TestUser"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;    &lt;span class="hljs-attr"&gt;p3:EnableAutoLogon&lt;/span&gt;=&lt;span class="hljs-string"&gt;"true"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;PackageInformation&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;    &lt;span class="hljs-attr"&gt;PackageName&lt;/span&gt;=&lt;span class="hljs-string"&gt;"NativeNotepadApp"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;    &lt;span class="hljs-attr"&gt;PackageDisplayName&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Native Notepad 2.0 (App)"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;    &lt;span class="hljs-attr"&gt;PublisherName&lt;/span&gt;=&lt;span class="hljs-string"&gt;"CN=AK"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;    &lt;span class="hljs-attr"&gt;PublisherDisplayName&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Andreas Kerl"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;    &lt;span class="hljs-attr"&gt;Version&lt;/span&gt;=&lt;span class="hljs-string"&gt;"2.0.8.0"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;    &lt;span class="hljs-attr"&gt;p4:PackageDescription&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Native Notepad 2.0"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;br/&gt;&lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;MsixPackagingToolTemplate&lt;/span&gt;&amp;gt;&lt;/span&gt;  
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 --virtual­MachinePassword zu übergeben. Bei einem Remote-Computer erfolgt die Konfiguration innerhalb des Elements <Remote­Machine/>, 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-Einrichtungs­schritte durchlaufen. Dies ist auf Dauer sehr zeit­intensiv, 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.
Wünschenswert wäre an dieser Stelle eine performantere und fehlertolerante Implementierung, bei der der im Template konfigurierte Benutzer nach dem Neustart automatisch verwendet wird.

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)
&lt;span class="xml"&gt;&lt;span class="hljs-comment"&gt;&amp;lt;!-- Ordner, Komponenten und Ressourcen --&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Directory&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"TARGETDIR"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"SourceDir"&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Directory&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"ProgramFiles64Folder"&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span class="xml"&gt;    &lt;span class="hljs-comment"&gt;&amp;lt;!--Ordnername wird durch Binder-Variablen &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-comment"&gt;      modelliert--&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Directory&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"INSTALLLOCATION"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"!(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;      bind.property.ProductName)"&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span class="xml"&gt;      &lt;span class="hljs-comment"&gt;&amp;lt;!--App--&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Component&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"C__SC_ViewerApp"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Guid&lt;/span&gt;=&lt;span class="hljs-string"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="hljs-template-variable"&gt;{&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-template-variable"&gt;          C9B33A42-B05E-43A5-B9AE-6892F779C251}&lt;/span&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;"&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;        &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;File&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"F__SC_ViewerApp"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Source&lt;/span&gt;=&lt;span class="hljs-string"&gt;"$(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;          var.SourceFolder)"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"SC_ViewerApp.exe"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;          &lt;span class="hljs-attr"&gt;KeyPath&lt;/span&gt;=&lt;span class="hljs-string"&gt;"yes"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;        &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Shortcut&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"S__SC_ViewerApp"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Directory&lt;/span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;          &lt;span class="hljs-string"&gt;"ProgramMenuFolder"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Services Viewer &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;          2.0"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Hotkey&lt;/span&gt;=&lt;span class="hljs-string"&gt;"0"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Icon&lt;/span&gt;=&lt;span class="hljs-string"&gt;"I__Icon.exe"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;          &lt;span class="hljs-attr"&gt;IconIndex&lt;/span&gt;=&lt;span class="hljs-string"&gt;"0"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Show&lt;/span&gt;=&lt;span class="hljs-string"&gt;"normal"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Advertise&lt;/span&gt;=&lt;span class="hljs-string"&gt;"yes"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;          &lt;span class="hljs-attr"&gt;WorkingDirectory&lt;/span&gt; =&lt;span class="hljs-string"&gt;"INSTALLLOCATION"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Component&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span class="xml"&gt;      &lt;span class="hljs-comment"&gt;&amp;lt;!--Master Service--&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Component&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"C__SC_Master"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Guid&lt;/span&gt;=&lt;span class="hljs-string"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="hljs-template-variable"&gt;{&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-template-variable"&gt;          5EF55263-6F15-4F8A-9ED0-670578B15886}&lt;/span&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;"&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;        &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;File&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"F__SC_Master"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;          &lt;span class="hljs-attr"&gt;Source&lt;/span&gt;=&lt;span class="hljs-string"&gt;"$(var.SourceFolder)"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;          &lt;span class="hljs-attr"&gt;Name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"SC_Master.exe"&lt;/span&gt; &lt;span class="hljs-attr"&gt;KeyPath&lt;/span&gt;=&lt;span class="hljs-string"&gt;"yes"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span class="xml"&gt;        &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;ServiceInstall&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"C__SC_Master_Install"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-attr"&gt;DisplayName&lt;/span&gt;=&lt;span class="hljs-string"&gt;"SC (Master)"&lt;/span&gt; &lt;span class="hljs-attr"&gt;ErrorControl&lt;/span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-string"&gt;"normal"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"SC_Master"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Start&lt;/span&gt;=&lt;span class="hljs-string"&gt;"auto"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-attr"&gt;Type&lt;/span&gt;=&lt;span class="hljs-string"&gt;"ownProcess"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Vital&lt;/span&gt;=&lt;span class="hljs-string"&gt;"yes"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Description&lt;/span&gt;= &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-string"&gt;"Hauptservice der Service-Demo-App"&lt;/span&gt; &amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;          &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;util:ServiceConfig&lt;/span&gt; &lt;span class="hljs-attr"&gt;FirstFailureActionType&lt;/span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-string"&gt;"restart"&lt;/span&gt; &lt;span class="hljs-attr"&gt;SecondFailureActionType&lt;/span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-string"&gt;"restart"&lt;/span&gt; &lt;span class="hljs-attr"&gt;ThirdFailureActionType&lt;/span&gt;=&lt;span class="hljs-string"&gt;"restart"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-attr"&gt;ResetPeriodInDays&lt;/span&gt;=&lt;span class="hljs-string"&gt;"1"&lt;/span&gt; &lt;span class="hljs-attr"&gt;RestartServiceDelay&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-attr"&gt;InSeconds&lt;/span&gt;=&lt;span class="hljs-string"&gt;"300"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;        &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;ServiceInstall&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;        &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;ServiceControl&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"C__SC_Master_Control"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Name&lt;/span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;          &lt;span class="hljs-string"&gt;"SC_Master"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Wait&lt;/span&gt;=&lt;span class="hljs-string"&gt;"yes"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Remove&lt;/span&gt;=&lt;span class="hljs-string"&gt;"uninstall"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;          &lt;span class="hljs-attr"&gt;Stop&lt;/span&gt;=&lt;span class="hljs-string"&gt;"both"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Start&lt;/span&gt;=&lt;span class="hljs-string"&gt;"install"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Component&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span class="xml"&gt;      &lt;span class="hljs-comment"&gt;&amp;lt;!--Child Service--&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Component&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"C__SC_Child"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Guid&lt;/span&gt;=&lt;span class="hljs-string"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="hljs-template-variable"&gt;{784A3D65-&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-template-variable"&gt;          F8A1-415D-BCB2-E57F9D8E2AC9}&lt;/span&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;"&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;        &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;File&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"F__SC_Child"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Source&lt;/span&gt;=&lt;span class="hljs-string"&gt;"$(var.Source&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;          Folder)"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"SC_Child.exe"&lt;/span&gt; &lt;span class="hljs-attr"&gt;KeyPath&lt;/span&gt;=&lt;span class="hljs-string"&gt;"yes"&lt;/span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span class="xml"&gt;        &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;ServiceInstall&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"C__SC_Child_Install"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-attr"&gt;DisplayName&lt;/span&gt;=&lt;span class="hljs-string"&gt;"SC (Child)"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-attr"&gt;ErrorControl&lt;/span&gt;=&lt;span class="hljs-string"&gt;"normal"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-attr"&gt;Name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"SC_Child"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Start&lt;/span&gt;=&lt;span class="hljs-string"&gt;"auto"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-attr"&gt;Type&lt;/span&gt;=&lt;span class="hljs-string"&gt;"ownProcess"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Vital&lt;/span&gt;=&lt;span class="hljs-string"&gt;"yes"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-attr"&gt;Description&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Untergeordneter Dienst der &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;            Service-Demo-App"&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;          &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;util:ServiceConfig&lt;/span&gt; &lt;span class="hljs-attr"&gt;FirstFailureActionType&lt;/span&gt;=&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-string"&gt;"restart"&lt;/span&gt; &lt;span class="hljs-attr"&gt;SecondFailureActionType&lt;/span&gt;=&lt;span class="hljs-string"&gt;"restart"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-attr"&gt;ThirdFailureActionType&lt;/span&gt;=&lt;span class="hljs-string"&gt;"restart"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-attr"&gt;ResetPeriodInDays&lt;/span&gt;=&lt;span class="hljs-string"&gt;"1"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-attr"&gt;RestartServiceDelayInSeconds&lt;/span&gt;=&lt;span class="hljs-string"&gt;"300"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;          &lt;span class="hljs-comment"&gt;&amp;lt;!--Abhängig vom Master-Service--&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;          &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;ServiceDependency&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"SC_Master"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;        &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;ServiceInstall&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;        &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;ServiceControl&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"C__SC_Child_Control"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;          &lt;span class="hljs-attr"&gt;Name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"SC_Child"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Wait&lt;/span&gt;=&lt;span class="hljs-string"&gt;"yes"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Remove&lt;/span&gt;=&lt;span class="hljs-string"&gt;"uninstall"&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;          &lt;span class="hljs-attr"&gt;Stop&lt;/span&gt;=&lt;span class="hljs-string"&gt;"both"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Start&lt;/span&gt;=&lt;span class="hljs-string"&gt;"install"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Component&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span class="xml"&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Directory&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Directory&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Directory&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"ProgramMenuFolder"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Directory&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"DesktopFolder"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="xml"&gt;&lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Directory&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;/span&gt; 
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
&lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Package&lt;/span&gt; &lt;span class="hljs-attr"&gt;...&lt;/span&gt; &amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-comment"&gt;&amp;lt;!--Package created by MSIX Packaging Tool version: &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-comment"&gt;    1.2019.1220.0--&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Identity&lt;/span&gt; &lt;span class="hljs-attr"&gt;Name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"SC-ServiceApp"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Publisher&lt;/span&gt;=&lt;span class="hljs-string"&gt;"CN=AK"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;    &lt;span class="hljs-attr"&gt;Version&lt;/span&gt;=&lt;span class="hljs-string"&gt;"2.0.0.0"&lt;/span&gt; &lt;span class="hljs-attr"&gt;ProcessorArchitecture&lt;/span&gt;=&lt;span class="hljs-string"&gt;"x64"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Properties&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;DisplayName&lt;/span&gt;&amp;gt;&lt;/span&gt;SC-ServiceApp (App)&lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;DisplayName&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;PublisherDisplayName&lt;/span&gt;&amp;gt;&lt;/span&gt;Andreas Kerl&lt;br/&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;PublisherDisplayName&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Description&lt;/span&gt;&amp;gt;&lt;/span&gt;SC-ServiceApp as MSIX Package&lt;br/&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Description&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Logo&lt;/span&gt;&amp;gt;&lt;/span&gt;Assets\StoreLogo.png&lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Logo&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Properties&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Resources&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Resource&lt;/span&gt; &lt;span class="hljs-attr"&gt;Language&lt;/span&gt;=&lt;span class="hljs-string"&gt;"en-us"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Resources&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Dependencies&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;TargetDeviceFamily&lt;/span&gt; &lt;span class="hljs-attr"&gt;Name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Windows.Desktop"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;      &lt;span class="hljs-attr"&gt;MinVersion&lt;/span&gt;=&lt;span class="hljs-string"&gt;"10.0.19025.0"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;      &lt;span class="hljs-attr"&gt;MaxVersionTested&lt;/span&gt;=&lt;span class="hljs-string"&gt;"10.0.19025.0"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Dependencies&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Capabilities&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;rescap:Capability&lt;/span&gt; &lt;span class="hljs-attr"&gt;Name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"localSystemServices"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;rescap:Capability&lt;/span&gt; &lt;span class="hljs-attr"&gt;Name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"packagedServices"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;rescap:Capability&lt;/span&gt; &lt;span class="hljs-attr"&gt;Name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"runFullTrust"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Capabilities&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Applications&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Application&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"SCVIEWERAPP"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Executable&lt;/span&gt;=&lt;span class="hljs-string"&gt;"VFS\&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;        ProgramFilesX64\SC-ServiceApp\SC_ViewerApp.exe"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;        &lt;span class="hljs-attr"&gt;EntryPoint&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Windows.FullTrustApplication"&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;uap:VisualElements&lt;/span&gt; &lt;span class="hljs-attr"&gt;BackgroundColor&lt;/span&gt;=&lt;span class="hljs-string"&gt;"transparent"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;          &lt;span class="hljs-attr"&gt;DisplayName&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Services Viewer 2.0"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Square150x&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;          &lt;span class="hljs-attr"&gt;150Logo&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Assets\Square150x150Logo.png"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;          &lt;span class="hljs-attr"&gt;Square44x44Logo&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Assets\Square44x44Logo.png"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;          &lt;span class="hljs-attr"&gt;Description&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Services Viewer 2.0"&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;        &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;uap:DefaultTile&lt;/span&gt; &lt;span class="hljs-attr"&gt;Wide310x150Logo&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Assets\Wide&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;          310x150Logo.png"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Square310x310Logo&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Assets\&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;          Square310x310Logo.png"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Square71x71Logo&lt;/span&gt;=&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;          &lt;span class="hljs-string"&gt;"Assets\Square71x71Logo.png"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;br/&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;uap:VisualElements&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Application&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Application&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"SCCHILD"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Executable&lt;/span&gt;=&lt;span class="hljs-string"&gt;"VFS\&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;        ProgramFilesX64\SC-ServiceApp\SC_Child.exe"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;        &lt;span class="hljs-attr"&gt;EntryPoint&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Windows.FullTrustApplication"&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;uap:VisualElements&lt;/span&gt; &lt;span class="hljs-attr"&gt;BackgroundColor&lt;/span&gt;=&lt;span class="hljs-string"&gt;"transparent"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;        &lt;span class="hljs-attr"&gt;DisplayName&lt;/span&gt;=&lt;span class="hljs-string"&gt;"SC (Child)"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Square150x150Logo&lt;/span&gt;=&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;        &lt;span class="hljs-string"&gt;"Assets\Square150x150Logo.png"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Square44x44&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;        &lt;span class="hljs-attr"&gt;Logo&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Assets\Square44x44Logo.png"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Description&lt;/span&gt;=&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;        &lt;span class="hljs-string"&gt;"Untergeordneter Dienst der Service-Demo-App"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;        &lt;span class="hljs-attr"&gt;AppListEntry&lt;/span&gt;=&lt;span class="hljs-string"&gt;"none"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;br/&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Extensions&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;        &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;desktop6:Extension&lt;/span&gt; &lt;span class="hljs-attr"&gt;Category&lt;/span&gt;=&lt;span class="hljs-string"&gt;"windows.service"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-attr"&gt;Executable&lt;/span&gt;=&lt;span class="hljs-string"&gt;"VFS\ProgramFilesX64\&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;            SC-ServiceApp\SC_Child.exe"&lt;/span&gt; &lt;span class="hljs-attr"&gt;EntryPoint&lt;/span&gt;=&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-string"&gt;"Windows.FullTrustApplication"&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;          &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;desktop6:Service&lt;/span&gt; &lt;span class="hljs-attr"&gt;Name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"SC_Child"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Startup&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;              &lt;span class="hljs-attr"&gt;Type&lt;/span&gt;=&lt;span class="hljs-string"&gt;"auto"&lt;/span&gt; &lt;span class="hljs-attr"&gt;StartAccount&lt;/span&gt;=&lt;span class="hljs-string"&gt;"localSystem"&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;            &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;desktop6:Dependencies&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;              &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;desktop6:DependentService&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;                &lt;span class="hljs-attr"&gt;Name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"SC_Master"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;br/&gt;            &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;desktop6:Dependencies&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;          &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;desktop6:Service&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;        &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;desktop6:Extension&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Extensions&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Application&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Application&lt;/span&gt; &lt;span class="hljs-attr"&gt;Id&lt;/span&gt;=&lt;span class="hljs-string"&gt;"SCMASTER"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Executable&lt;/span&gt;=&lt;span class="hljs-string"&gt;"VFS\&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;        ProgramFilesX64\SC-ServiceApp\SC_Master.exe"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;        &lt;span class="hljs-attr"&gt;EntryPoint&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Windows.FullTrustApplication"&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;uap:VisualElements&lt;/span&gt; &lt;span class="hljs-attr"&gt;BackgroundColor&lt;/span&gt;=&lt;span class="hljs-string"&gt;"transparent"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;        &lt;span class="hljs-attr"&gt;DisplayName&lt;/span&gt;=&lt;span class="hljs-string"&gt;"SC (Master)"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Square150x150Logo&lt;/span&gt;=&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;        &lt;span class="hljs-string"&gt;"Assets\Square150x150Logo.png"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Square44x&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;        &lt;span class="hljs-attr"&gt;44Logo&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Assets\Square44x44Logo.png"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;        &lt;span class="hljs-attr"&gt;Description&lt;/span&gt;=&lt;span class="hljs-string"&gt;"Hauptservice der Service-&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;        Demo-App"&lt;/span&gt; &lt;span class="hljs-attr"&gt;AppListEntry&lt;/span&gt;=&lt;span class="hljs-string"&gt;"none"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;br/&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;Extensions&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;        &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;desktop6:Extension&lt;/span&gt; &lt;span class="hljs-attr"&gt;Category&lt;/span&gt;=&lt;span class="hljs-string"&gt;"windows.service"&lt;/span&gt; &lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-attr"&gt;Executable&lt;/span&gt;=&lt;span class="hljs-string"&gt;"VFS\ProgramFilesX64\&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;&lt;span class="hljs-string"&gt;            SC-ServiceApp\SC_Master.exe"&lt;/span&gt; &lt;span class="hljs-attr"&gt;EntryPoint&lt;/span&gt;=&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-string"&gt;"Windows.FullTrustApplication"&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;          &lt;span class="hljs-tag"&gt;&amp;lt;&lt;span class="hljs-name"&gt;desktop6:Service&lt;/span&gt; &lt;span class="hljs-attr"&gt;Name&lt;/span&gt;=&lt;span class="hljs-string"&gt;"SC_Master"&lt;/span&gt; &lt;span class="hljs-attr"&gt;Startup&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-tag"&gt;            &lt;span class="hljs-attr"&gt;Type&lt;/span&gt;=&lt;span class="hljs-string"&gt;"auto"&lt;/span&gt; &lt;span class="hljs-attr"&gt;StartAccount&lt;/span&gt;=&lt;span class="hljs-string"&gt;"localSystem"&lt;/span&gt; /&amp;gt;&lt;/span&gt; &lt;br/&gt;        &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;desktop6:Extension&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;      &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Extensions&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;    &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Application&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;  &lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Applications&lt;/span&gt;&amp;gt;&lt;/span&gt; &lt;br/&gt;&lt;span class="hljs-tag"&gt;&amp;lt;/&lt;span class="hljs-name"&gt;Package&lt;/span&gt;&amp;gt;&lt;/span&gt;  
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 Installa­tion 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)
Der App-Installer verfügt über eine benutzerfreundliche Oberfläche, die durch einen Doppelklick auf die jeweilige Paketdatei geöffnet wird. Die Oberfläche zeigt Informationen zum Anwendungspaket, das Symbol der Startmenü-Kachel und die aktivierten Funktionen an. Die dargestellten Informationen werden aus den jeweiligen Attributen und Elementen des Manifests ermittelt.
  • Name:<Properties:DisplayName/>
  • Version: <Identity:Version/>
  • Herausgeber:<Properties: PublisherDisplayName/>
  • Symbol:<Properties:Logo/>
  • Funktionen:<Capabilities/>
Jedes Anwendungspaket muss mit einem gültigen Code­signaturzertifikat signiert werden, das zudem auf dem Gerät als vertrauenswürdig eingestuft wurde. In den neuesten Versionen des App-Installer weist eine grafische Darstellung bereits auf das Ergebnis der Zertifikatsprüfung und somit die Vertrauenswürdigkeit der App hin. Ist das Ergebnis der Zertifikatsprüfung hingegen negativ, wird nach einem Klick auf die Installations-Schaltfläche eine entsprechende Fehlermeldung angezeigt. Im positiven Fall wird die Installation gestartet und eine Fortschrittsanzeige informiert über den Installationsverlauf. Nach erfolgreicher Installation kann die App über die entsprechende Schaltfläche gestartet werden.Der aktuellen Version des App-Installer wurden weitere Funktionalitäten spendiert, um Downgrade- und Reinstallations-Szenarien über die Benutzeroberfläche zugänglich zu machen. Beim Doppelklick auf das Anwendungspaket findet zu diesem Zweck eine Versionsprüfung auf Paketebene statt. Weist das zu installierende Paket eine höhere Versionsnummer auf, wird die Aktualisierungsschaltfläche angezeigt. Sind beide Versionen identisch, wird die Reinstallations-Schaltfläche angezeigt. Gleiches geschieht auch bei einer niedrigeren Versionsnummer des neuen Pakets. In diesem Fall gibt der Hauptdialog eine zusätzliche Information aus und zeigt einen Bestätigungsdialog für die Durchführung des Downgrades an, wie das in Bild 7 ersichtlich ist.
Darstellung eines Downgradesim App-Installer(Bild 7) © Autor
Die Installation von Betriebssystemdiensten erfordert administrative Privilegien, sodass eine entsprechende Power­Shell-Konsole hierfür erforderlich ist. Mit der neuesten Ver­sion 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 packaged­Services 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
Die Analyse der Protokolle kann auch mithilfe der Windows PowerShell erfolgen. Mit dem nachfolgenden Befehl werden alle Protokolleinträge ausgegeben. Hierbei werden die Informationen aller drei Protokolle chronologisch zusammengefasst und dann sequenziell ausgegeben. Statt des Arguments All kann ebenfalls eine Filterung anhand einer Aktivitäts-ID vorgenommen werden:
<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:&amp;gt; Get-AppPackageLastError &lt;br/&gt;Event logs for command: &lt;span class="hljs-string"&gt;""&lt;/span&gt; &lt;br/&gt;&lt;br/&gt;Time                      ID          Message                                                                                                                                                      &lt;br/&gt;----                      --          -------                                                                                                                                                      &lt;br/&gt;&lt;span class="hljs-number"&gt;05.01&lt;/span&gt;&lt;span class="hljs-meta"&gt;.2020&lt;/span&gt; &lt;span class="hljs-number"&gt;14&lt;/span&gt;:&lt;span class="hljs-number"&gt;13&lt;/span&gt;:&lt;span class="hljs-number"&gt;00&lt;/span&gt;      &lt;span class="hljs-number"&gt;603&lt;/span&gt;          Der Bereitstellungsvorgang &lt;span class="hljs-keyword"&gt;Add&lt;/span&gt; wurde für ein Paket mit dem Hauptparameter &lt;br/&gt;                                      NativeNotepad2&lt;span class="hljs-meta"&gt;.0_2&lt;/span&gt;&lt;span class="hljs-meta"&gt;.0&lt;/span&gt;&lt;span class="hljs-meta"&gt;.1&lt;/span&gt;.0_x64__yf5adtgdrdj2a.msix und den Optionen &lt;span class="hljs-number"&gt;0&lt;/span&gt; und &lt;span class="hljs-number"&gt;0&lt;/span&gt;    &lt;br/&gt;                                      gestartet. Weitere Informationen zum Diagnostizieren von Problemen bei &lt;br/&gt;                                      der Bereitstellung von Apps finden Sie unter                                          &lt;br/&gt;                                      http://go.microsoft.com/fwlink/?LinkId=&lt;span class="hljs-number"&gt;235160&lt;/span&gt;.                                                                                                              &lt;br/&gt;&lt;span class="hljs-number"&gt;05.01&lt;/span&gt;&lt;span class="hljs-meta"&gt;.2020&lt;/span&gt; &lt;span class="hljs-number"&gt;14&lt;/span&gt;:&lt;span class="hljs-number"&gt;13&lt;/span&gt;:&lt;span class="hljs-number"&gt;01&lt;/span&gt;      &lt;span class="hljs-number"&gt;156&lt;/span&gt;          Fehler &lt;span class="hljs-number"&gt;0x800B0100&lt;/span&gt;: &lt;span class="hljs-keyword"&gt;Das&lt;/span&gt; App-Paket muss für die Signaturüberprüfung digital &lt;br/&gt;                                      signiert sein.                                                                    &lt;br/&gt;&lt;span class="hljs-number"&gt;05.01&lt;/span&gt;&lt;span class="hljs-meta"&gt;.2020&lt;/span&gt; &lt;span class="hljs-number"&gt;14&lt;/span&gt;:&lt;span class="hljs-number"&gt;13&lt;/span&gt;:&lt;span class="hljs-number"&gt;01&lt;/span&gt;      &lt;span class="hljs-number"&gt;465&lt;/span&gt;          Fehler &lt;span class="hljs-number"&gt;0x800B0100&lt;/span&gt;: Fehler beim Öffnen des Pakets im Speicherort &lt;br/&gt;                                      &lt;span class="hljs-string"&gt;"NativeNotepad2.0_2.0.1.0_x64__yf5adtgdrdj2a.msix"&lt;/span&gt;.                                          &lt;br/&gt;&lt;span class="hljs-number"&gt;05.01&lt;/span&gt;&lt;span class="hljs-meta"&gt;.2020&lt;/span&gt; &lt;span class="hljs-number"&gt;14&lt;/span&gt;:&lt;span class="hljs-number"&gt;13&lt;/span&gt;:&lt;span class="hljs-number"&gt;01&lt;/span&gt;      &lt;span class="hljs-number"&gt;497&lt;/span&gt;          Fehler &lt;span class="hljs-number"&gt;0x80070002&lt;/span&gt;: Fehler beim Öffnen des Msixvc-Pakets vom Speicherort &lt;br/&gt;                                      NativeNotepad2&lt;span class="hljs-meta"&gt;.0_2&lt;/span&gt;&lt;span class="hljs-meta"&gt;.0&lt;/span&gt;&lt;span class="hljs-meta"&gt;.1&lt;/span&gt;.0_x64__yf5adtgdrdj2a.msix. Überprüfen Sie, ob die            &lt;br/&gt;                                      Msixvc-Supportdienste installiert sind.                                                                                                                      &lt;br/&gt;&lt;span class="hljs-number"&gt;05.01&lt;/span&gt;&lt;span class="hljs-meta"&gt;.2020&lt;/span&gt; &lt;span class="hljs-number"&gt;14&lt;/span&gt;:&lt;span class="hljs-number"&gt;13&lt;/span&gt;:&lt;span class="hljs-number"&gt;01&lt;/span&gt;      &lt;span class="hljs-number"&gt;403&lt;/span&gt;          Fehler &lt;span class="hljs-number"&gt;0x800B0100&lt;/span&gt;: Fehler beim Abrufen der Stagingsitzung für: &lt;br/&gt;                                      file:///D:/MSIX/NativeNotepad2&lt;span class="hljs-meta"&gt;.0_2&lt;/span&gt;&lt;span class="hljs-meta"&gt;.0&lt;/span&gt;&lt;span class="hljs-meta"&gt;.1&lt;/span&gt;.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 Modi­fikationspakets 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.
Was sich kompliziert anhört, ist durch den PowerShell-Befehl Invoke-CommandInDesktopPackage [16] relativ einfach umsetzbar. Bei Produktivsystemen vor Windows 10 Version 2004 muss hierfür noch der Entwicklermodus aktiviert werden. Mit dem Befehl kann eine festgelegte Troubleshooting-Anwendung im Kontext des Anwendungspakets ausgeführt werden und hiermit auf die virtualisierten Bereiche zugegriffen werden. Zur Verwendung sind zunächst die App und die Paketfamilie zu identifizieren, wozu die folgenden Befehle verwendet werden können:
  • Paketfamilie:(Get-AppPackage -Name <Name>).PackageFamilyName
  • AppID:(Get-AppPackageManifest -Package <Paket>).Package.Applications.Application.Id
Im Weiteren muss die Troubleshooting-Anwendung festgelegt werden, die im Kontext des Pakets ausgeführt werden soll. Beim Windows-Explorer gibt es Einschränkungen, sodass von dessen Verwendung derzeitig Abstand genommen werden sollte. Die folgenden Anwendungen sind aber uneingeschränkt nutzbar:
  • cmd.exe
  • powershell.exe
  • regedit.exe
  • notepad.exe
  • Ausführbare Dateien, die Bestandteil des Pakets sind
Mit dem folgenden Befehl lässt sich beispielsweise die Windows PowerShell im Kontext des Anwendungspakets Native­NotepadApp_2.0.8.0_x64__yf5adtgdrdj2a ausführen:
PS <span class="hljs-string">C:</span>\ &gt;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.
Projektdateien herunterladen

Fussnoten

  1. MSIX-Verpackungstool, http://www.dotnetpro.de/SL2007MSIXNews1
  2. Andreas Kerl, Clever verpackt, Anwendungs-Setups mit MSIX, dotnetpro 8/2019, Seite 58 ff., http://www.dotnetpro.de/A1908MSIXEnterprise
  3. Andreas Kerl, Die eigene Note, Installationsprozesse durch benutzerdefinierte Aktionen erweitern, dotnetpro 12/2007, Seite 92 ff., http://www.dotnetpro.de/A0712OrcasDeploy
  4. Setup instructions for remote machine conversions, http://www.dotnetpro.de/SL2007MSIXNews2
  5. Sign an MSIX package with Device Guard signing, http://www.dotnetpro.de/SL2007MSIXNews3
  6. https://www.digicert.com, https://www.digicert.com
  7. Andreas Kerl, Das Ende einer Ära, MSI + APPX = MSIX, dotnetpro 2/2019, Seite 86 ff., http://www.dotnetpro.de/A1902MSIX
  8. Zeitstempelserver Comodoca, http://timestamp.comodoca.com
  9. Zeitstempelserver Digicert, http://timestamp.digicert.com
  10. Conversion with Command Line Interface (CLI), http://www.dotnetpro.de/SL2007MSIXNews4
  11. Shutdown, http://www.dotnetpro.de/SL2007MSIXNews5
  12. Convert an installer that includes services, http://www.dotnetpro.de/SL2007MSIXNews6
  13. Restricted capabilities, http://www.dotnetpro.de/SL2007MSIXNews7
  14. desktop6:Extension, http://www.dotnetpro.de/SL2007MSIXNews8
  15. Add-AppxProvisionedPackage, http://www.dotnetpro.de/SL2007MSIXNews9
  16. Invoke-CommandInDesktopPackage, http://www.dotnetpro.de/SL2007MSIXNews10
  17. Hover, http://www.dotnetpro.de/SL2007MSIXNews11
  18. AppInstaller File Builder, http://www.dotnetpro.de/SL2007MSIXNews12
  19. MSIX Core, http://www.dotnetpro.de/SL2007MSIXNews13
  20. Andreas Kerl, MSIX-Pakete verwalten, Unter der Haube von MSIX, dotnetpro 7/2020, Seite 22 ff., http://www.dotnetpro.de/A2007MSIX

Neueste Beiträge

DWX hakt nach: Wie stellt man Daten besonders lesbar dar?
Dass das Design von Websites maßgeblich für die Lesbarkeit der Inhalte verantwortlich ist, ist klar. Das gleiche gilt aber auch für die Aufbereitung von Daten für Berichte. Worauf besonders zu achten ist, erklären Dr. Ina Humpert und Dr. Julia Norget.
3 Minuten
27. Jun 2025
DWX hakt nach: Wie gestaltet man intuitive User Experiences?
DWX hakt nach: Wie gestaltet man intuitive User Experiences? Intuitive Bedienbarkeit klingt gut – doch wie gelingt sie in der Praxis? UX-Expertin Vicky Pirker verrät auf der Developer Week, worauf es wirklich ankommt. Hier gibt sie vorab einen Einblick in ihre Session.
4 Minuten
27. Jun 2025
„Sieh die KI als Juniorentwickler“
CTO Christian Weyer fühlt sich jung wie schon lange nicht mehr. Woran das liegt und warum er keine Angst um seinen Job hat, erzählt er im dotnetpro-Interview.
15 Minuten
27. Jun 2025
Miscellaneous

Das könnte Dich auch interessieren

UIs für Linux - Bedienoberflächen entwickeln mithilfe von C#, .NET und Avalonia
Es gibt viele UI-Frameworks für .NET, doch nur sehr wenige davon unterstützen Linux. Avalonia schafft als etabliertes Open-Source-Projekt Abhilfe.
16 Minuten
16. Jun 2025
Mythos Motivation - Teamentwicklung
Entwickler bringen Arbeitsfreude und Engagement meist schon von Haus aus mit. Diesen inneren Antrieb zu erhalten sollte für Führungskräfte im Fokus stehen.
13 Minuten
19. Jan 2017
Evolutionäres Prototyping von Business-Apps - Low Code/No Code und KI mit Power Apps
Microsoft baut Power Apps zunehmend mit Features aus, um die Low-Code-/No-Code-Welt mit der KI und der professionellen Programmierung zu verbinden.
19 Minuten
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige