Paketunterstützungsframework – Working Directory Fixup

Untersuchung

Windows Apps leiten bestimmte Verzeichnisse, die mit der Anwendung in Zusammenhang stehen, an den Ordner "Windows App-Container" um. Wenn eine Anwendung einen Unterordner (C:\Program Files\Vendor\subfolder) als Teil der Installation erstellt und später diesen Unterordner aufruft, wird das Verzeichnis nicht gefunden, da er nicht vorhanden ist.

Mithilfe des Paketsupportframeworks (PSF) können Verbesserungen an dem Windows App-Paket vorgenommen werden, um dieses Problem zu beheben. Zunächst müssen wir den Fehler und Verzeichnispfade identifizieren, die von der App angefordert werden.

Erfassen des Windows App-Fehlers

Das Filtern der Ergebnisse ist ein optionaler Schritt, der das Anzeigen von anwendungsbezogenen Fehlern erleichtert. Dazu erstellen wir zwei Filterregeln. Der erste Einschließfilter für den Namen des Anwendungsprozesses und der zweite ist eine Einschluss aller Ergebnisse, die nicht erfolgreich sind.

  1. Laden Sie den SysInternals Process Monitor in das Verzeichnis "C:\PSF\ProcessMonitor " herunter, und extrahieren Sie sie.
  2. Öffnen Sie Windows Explorer, und navigieren Sie zum extrahierten SysInternals-Prozessüberwachungsordner
  3. Doppelklicken Sie auf die Datei SysInternals Process Monitor (procmon.exe), und starten Sie die App.
  4. Wenn Sie von UAC aufgefordert werden, wählen Sie die Schaltfläche "Ja " aus.
  5. Wählen Sie im Fenster "Prozessmonitorfilter" das erste Dropdownmenü mit der Bezeichnung "Architektur" aus.
  6. Wählen Sie im Dropdownmenü " Prozessname " aus.
  7. Überprüfen Sie im nächsten Dropdownmenü, ob sie mit dem Wert festgelegt ist.
  8. Geben Sie im Textfeld den Prozessnamen Ihrer App ein (Beispiel: PSFSample.exe). Example of the Process Monitor Filter Windows with App Name
  9. Wählen Sie die Schaltfläche Hinzufügen aus.
  10. Wählen Sie im Fenster "Prozessmonitorfilter" das erste Dropdownmenü mit der Bezeichnung "Prozessname" aus.
  11. Wählen Sie "Ergebnis " aus dem Dropdownmenü aus.
  12. Wählen Sie im nächsten Dropdownmenü es aus, und wählen Sie ihn aus , und wählen Sie nicht im Dropdownmenü aus.
  13. Im Textfeldtyp: ERFOLG. Example of the Process Monitor Filter Windows with Result
  14. Wählen Sie die Schaltfläche Hinzufügen aus.
  15. Wählen Sie die Schaltfläche OK aus.
  16. starten Sie die Windows App, lösen Sie den Fehler aus, und schließen Sie die Windows App.

Überprüfen der Windows App-Fehlerprotokolle

Nach der Erfassung der Windows App-Prozesse müssen die Ergebnisse untersucht werden, um festzustellen, ob der Fehler im Zusammenhang mit dem Arbeitsverzeichnis liegt.

  1. Überprüfen Sie die Ergebnisse des SysInternals-Prozessmonitors, und suchen Sie nach Fehlern, die in der obigen Tabelle beschrieben sind.
  2. Wenn die Ergebnisse ein Ergebnis "Name Nicht gefunden" mit den Details "Gewünschter Zugriff: ..." für Ihre spezifische App anzeigen, die auf ein Verzeichnis außerhalb der "C:\Program Files\WindowsApps\...\" (wie in der nachstehenden Abbildung dargestellt) angezeigt wird, haben Sie erfolgreich einen Fehler im Zusammenhang mit dem Arbeitsverzeichnis identifiziert, verwenden Sie den PSF-Support - Filesystem Access-Artikel , um Anleitungen zum Anwenden der PSF-Korrektur auf Ihre App zu erhalten. Displays the error message witnessed in the SysInternals Process Monitor for failure to write to directory.

Lösung

Windows Apps leiten bestimmte Verzeichnisse, die mit der Anwendung in Zusammenhang stehen, an den Ordner "Windows App-Container" um. Wenn eine Anwendung einen Unterordner (C:\Program Files\Vendor\subfolder) als Teil der Installation erstellt und später diesen Unterordner aufruft, wird das Verzeichnis nicht gefunden, da er nicht vorhanden ist.

Um das Problem im Zusammenhang mit der Windows App zu beheben, das auf ein falsches Arbeitsverzeichnis verweist, müssen wir die folgenden vier Schritte ausführen:

  1. Stufen Sie die Windows App in ein lokales Verzeichnis ein
  2. Erstellen Sie die Config.json- und injizieren Sie erforderliche PSF-Dateien
  3. Aktualisieren der datei Windows App AppxManifest
  4. Erneutes Packen und Signieren der Windows App

Die obigen Schritte bieten Anleitungen, indem sie den Inhalt der Windows App in ein lokales stufendes Verzeichnis extrahieren, die PSF-Fixupdateien in das schrittweise Windows App-Verzeichnis einfügen, die Anwendung Startprogramm so konfigurieren, dass sie auf das PSF-Startfeld zeigen und dann die PSF config.json-Datei konfigurieren, um das PSF-Startfeld an die App umzuleiten, die das Arbeitsverzeichnis angibt.

Herunterladen und Installieren erforderlicher Tools

Dieser Prozess führt Sie durch den Abruf und die Verwendung der folgenden Tools:

  • NuGet Clienttool
  • Framework zur Paketunterstützung (Package Support Framework, PSF)
  • Windows 10 SDK (neueste Version)
  • SysInternals-Prozessmonitor

Im Folgenden finden Sie schrittweise Anleitungen zum Herunterladen und Installieren der erforderlichen Tools.

  1. Laden Sie die neueste (nicht vorschaufreie) Version des NuGet-Clienttools herunter, und speichern Sie die nuget.exe im C:\PSF\nuget Ordner.

  2. Laden Sie das Paketunterstützungsframework mithilfe von Nuget herunter, indem Sie folgendes aus einem Administrativen PowerShell-Fenster ausführen:

    Set-Location "C:\PSF"
    .\nuget\nuget.exe install Microsoft.PackageSupportFramework
    
  3. Laden Sie das Windows 10 Software Development Toolkit (Win 10 SDK) herunter und installieren Sie sie.

    1. Laden Sie das Win 10 SDK herunter.
    2. Führen Sie die winsdksetup.exe aus, die im vorherigen Schritt heruntergeladen wurde.
    3. Wählen Sie die Schaltfläche Weiter aus.
    4. Wählen Sie nur die folgenden drei Features für die Installation aus:
      • Windows SDK-Signierungstools für Desktop-Apps
      • Windows SDK für UWP-C++-Apps
      • Windwos SDK für die Lokalisierung von UWP-Apps
    5. Wählen Sie die Schaltfläche Installieren aus.
    6. Wählen Sie die Schaltfläche OK aus.

Phasen der Windows App

Durch das Staging der Windows App werden wir den Inhalt der Windows App in ein lokales Verzeichnis extrahieren/entpacken. Sobald die Windows App auf den Stagingspeicherort entpackt wurde, können PSF-Fixupdateien eingefügt werden, um unerwünschte Erfahrungen zu korrigieren.

  1. Öffnen Sie ein PowerShell-Fenster für Administratives.

  2. Legen Sie die folgenden Variablen für Ihre bestimmte App-Datei und Windows 10 SDK-Version fest:

    $AppPath          = "C:\PSF\SourceApp\PSFSampleApp.msix"         ## Path to the MSIX App Installer
    $StagingFolder    = "C:\PSF\Staging\PSFSampleApp"                ## Path to where the MSIX App will be staged
    $OSArchitecture   = "x$((gwmi Win32_Processor).AddressWidth)"    ## Operating System Architecture
    $Win10SDKVersion  = "10.0.19041.0"                               ## Latest version of the Win10 SDK
    
  3. Entpacken Sie die Windows App in den Stagingordner, indem Sie das folgende PowerShell-Cmdlet ausführen:

    ## Sets the directory to the Windows 10 SDK
    Set-Location "${env:ProgramFiles(x86)}\Windows Kits\10\Bin\$Win10SDKVersion\$OSArchitecture"
    
    ## Unpackages the Windows App to the staging folder
    .\makeappx.exe unpack /p "$AppPath" /d "$StagingFolder"
    

Erstellen und Einfügen erforderlicher PSF-Dateien

Um Korrekturmaßnahmen auf die Windows App anzuwenden, muss die Datei "config.json" erstellt werden und informationen über die Windows App-Startprogramm bereitgestellt werden, die fehlschlägt. Wenn mehrere Windows App-Launcher probleme haben, kann die Datei config.json mit mehreren Einträgen aktualisiert werden.

Nach dem Aktualisieren der Datei config.json müssen die Datei config.json und die unterstützenden PSF-Fixupdateien dann in den Stamm des Windows App-Pakets verschoben werden.

  1. Öffnen Sie Visual Studio Code (VS Code) oder einen anderen Text-Editor.

  2. Erstellen Sie eine neue Datei, indem Sie oben im VS Code das Menü "Datei" auswählen, indem Sie im Dropdownmenü "Neue Datei" auswählen.

  3. Speichern Sie die Datei als config.json, indem Sie oben im fenster VS Code das Menü "Datei" auswählen, indem Sie im Dropdownmenü "Speichern" auswählen. Navigieren Sie im Fenster "Speichern unter" zum Verzeichnis Windows App-Staging (C:\PSF\Staging\PSFSampleApp), und legen Sie den Dateinamen als config.jsonfest. Klicken Sie auf die Schaltfläche Speichern.

  4. Kopieren Sie den folgenden Code in die neu erstellte config.json-Datei .

    {
        "applications": [
            {
                "id": "",
                "executable": "",
                "workingDirectory": ""
            }
        ],
        "processes": [
            {
                "executable": ""
            }
        ]
    }
    
  5. Öffnen Sie die Windows AppxManifest-Datei im Windows App-Stagingordner (C:\PSF\Staging\PSFSampleApp\AppxManifest.xml) mit VS Code oder einem anderen Text-Editor.

    <Applications>
        <Application Id="PSFSAMPLE" Executable="VFS\ProgramFilesX64\PS Sample App\PSFSample.exe" EntryPoint="Windows.FullTrustApplication">
        <uap:VisualElements BackgroundColor="transparent" DisplayName="PSFSample" Square150x150Logo="Assets\StoreLogo.png" Square44x44Logo="Assets\StoreLogo.png" Description="PSFSample">
            <uap:DefaultTile Wide310x150Logo="Assets\StoreLogo.png" Square310x310Logo="Assets\StoreLogo.png" Square71x71Logo="Assets\StoreLogo.png" />
        </uap:VisualElements>
        </Application>
    </Applications>
    
  6. Kopieren Sie den Wert im ID-Feld , das sich in der dateiAppxManifest.xml befindet, in Package.Applications.Application das Feld "Anwendungs-ID" in der Datei "config.json ". Image circling the location of the ID within the AppxManifest file.

  7. Kopieren Sie den paketrelativen Pfad aus dem ausführbaren Feld, das sich in der dateiAppxManifest.xml befindet, in Package.Applications.Application das Feld "Ausführbare Anwendungen" in der Datei "config.json ". Image circling the location of the executable within the AppxManifest file.

  8. Kopieren Sie den paketrelativen übergeordneten Pfad aus dem ausführbaren Feld, das sich in der dateiAppxManifest.xml befindet, in Package.Applications.Application das Feld "Applications WorkingDirectory " in der Datei "config.json ". Image circling the location of the working directory within the AppxManifest file.

  9. Kopieren Sie den ausführbaren Namen aus dem ausführbaren Feld, das sich in der dateiAppxManifest.xml befindet, in Package.Applications.Application das Feld "Ausführbare Prozesse" in der Datei "config.json ". Image circling the location of the process executable within the AppxManifest file.

  10. Speichern Sie die aktualisierte config.json-Datei .

    {
        "applications": [
            {
            "id": "PSFSample",
            "executable": "VFS/ProgramFilesX64/PS Sample App/PSFSample.exe",
            "workingDirectory": "VFS/ProgramFilesX64/PS Sample App/"
            }
        ],
        "processes": [
            {
            "executable": "PSFSample"
            }
        ]
    }
    
  11. Kopieren Sie die folgenden drei Dateien aus dem Paketunterstützungsframework basierend auf der ausführbaren Architektur der Anwendung in den Stamm der stufenden Windows App. Die folgenden Dateien befinden sich im .\Microsoft.PackageSupportFramework.< Version>\bin.

    Anwendung (x64) Anwendung (x86)
    PSFLauncher64.exe PSFLauncher32.exe
    PSFRuntime64.dll PSFRuntime32.dll
    PSFRunDll64.exe PSFRunDll32.exe

AppxManifest aktualisieren

Nach dem Erstellen und Aktualisieren der Datei config.json muss die AppxManifest.xmlder Windows App für jede Windows App-Startprogramm aktualisiert werden, die in der config.json enthalten war. Die Anwendungen von AppxManifest müssen nun auf die PSFLauncher.exeabzielen, die der Anwendungsarchitektur zugeordnet sind.

  1. Öffnen Sie Explorer, und navigieren Sie zum Ordner "MsIX-App in Phasen" (C:\PSF\Staging\PSFSampleApp).

  2. Klicken Sie mit der rechten Maustaste auf AppxManifest.xml, und wählen Sie " Mit Code öffnen" im Dropdownmenü aus (Optional können Sie mit einem anderen Text-Editor öffnen).

  3. Aktualisieren Sie die AppxManifest.xml Datei mit den folgenden Informationen:

    <Package ...>
    ...
    <Applications>
        <Application Id="PSFSample"
                    Executable="PSFLauncher32.exe"
                    EntryPoint="Windows.FullTrustApplication">
        ...
        </Application>
    </Applications>
    </Package>
    

Packen Sie die Anwendung erneut

Alle Korrekturen wurden angewendet, jetzt kann die Windows App erneut in ein MSIX verpackt und mit einem Codesignaturzertifikat signiert werden.

  1. Öffnen Sie ein Administratives PowerShell-Fenster.

  2. Legen Sie die folgenden Variablen fest:

    $AppPath          = "C:\PSF\SourceApp\PSFSampleApp_Updated.msix" ## Path to the MSIX App Installer
    $CodeSigningCert  = "C:\PSF\Cert\CodeSigningCertificate.pfx"     ## Path to your code signing certificate
    $CodeSigningPass  = "<Password>"                                 ## Password used by the code signing certificate
    $StagingFolder    = "C:\PSF\Staging\PSFSampleApp"                ## Path to where the MSIX App will be staged
    $OSArchitecture   = "x$((gwmi Win32_Processor).AddressWidth)"    ## Operating System Architecture
    $Win10SDKVersion  = "10.0.19041.0"                               ## Latest version of the Win10 SDK
    
  3. Packen Sie die Windows App aus dem Stagingordner neu, indem Sie das folgende PowerShell-Cmdlet ausführen:

    Set-Location "${env:ProgramFiles(x86)}\Windows Kits\10\Bin\$Win10SDKVersion\$OSArchitecture"
    .\makeappx.exe pack /p "$AppPath" /d "$StagingFolder"
    
  4. Signieren Sie die Windows App, indem Sie das folgende PowerShell-Cmdlet ausführen:

    Set-Location "${env:ProgramFiles(x86)}\Windows Kits\10\Bin\$Win10SDKVersion\$OSArchitecture"
    .\signtool.exe sign /v /fd sha256 /f $CodeSigningCert /p $CodeSigningPass $AppPath