Paketunterstützungsframework – Fehlerbehebung für Schreibberechtigungen im Dateisystem

Untersuchung

Windows Apps leiten bestimmte Verzeichnisse, die sich auf die Anwendung beziehen, an den Windows App-Containerordner um. Wenn eine Anwendung versucht, in den Windows App-Container zu schreiben, wird ein Fehler ausgelöst, und der Schreibvorgang schlägt fehl.

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

Erfassen des Windows App-Fehlers

Das Filtern der Ergebnisse ist ein optionaler Schritt, der das Anzeigen anwendungsbezogener Fehler vereinfacht. Hierzu erstellen wir zwei Filterregeln. Die erste ist ein Includefilter für den Namen des Anwendungsprozesses, und die zweite ist eine Aufnahme aller Ergebnisse, die nicht erfolgreich sind.

  1. Laden Sie den SysInternals-Prozessmonitor herunter, und extrahieren Sie diesen in das Verzeichnis C:\PSF\ProcessMonitor.
  2. Öffnen Sie Windows Explorer, und navigieren Sie zum extrahierten SysInternals-Prozessmonitorordner.
  3. Doppelklicken Sie auf die SysInternals-Prozessmonitordatei (procmon.exe), und starten Sie die App.
  4. Wenn Sie von UAC dazu 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. Vergewissern Sie sich im nächsten Dropdownmenü, dass es mit dem Wert festgelegt ist.
  8. Geben Sie im Textfeld den Prozessnamen Ihrer App ein (Beispiel: PSFSample.exe). Beispiel für den Prozessmonitorfilter Windows mit 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 im Dropdownmenü Ergebnis aus.
  12. Wählen Sie es im nächsten Dropdownmenü aus, und wählen Sie nicht aus dem Dropdownmenü aus.
  13. Geben Sie im Textfeld Folgendes ein: SUCCESS . Beispiel für den Prozessmonitorfilter Windows mit Ergebnis
  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 dem Erfassen der Windows App-Prozesse müssen die Ergebnisse untersucht werden, um zu ermitteln, ob der Fehler mit dem Arbeitsverzeichnis zusammenhängt.

  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 das Ergebnis "Name nicht gefunden" mit den Details "Desired Access: ..." für Ihre spezifische App anzeigen, die auf ein Verzeichnis außerhalb von "C:\Programme\WindowsApps \ ... \ " abzielt (Wie in der folgenden Abbildung zu sehen), haben Sie erfolgreich einen Fehler im Zusammenhang mit dem Arbeitsverzeichnis identifiziert. Informationen zum Anwenden der PSF-Korrektur auf Ihre App finden Sie im Artikel PSF-Unterstützung – Dateisystemzugriff. Zeigt die Fehlermeldung an, die im SysInternals-Prozessmonitor auf Fehler beim Schreiben in das Verzeichnis angezeigt wird.

Lösung

Windows Apps leiten bestimmte Verzeichnisse, die sich auf die Anwendung beziehen, an den Windows App-Containerordner um. Wenn eine Anwendung versucht, in den Windows App-Container zu schreiben, wird ein Fehler ausgelöst, und der Schreibvorgang schlägt fehl.

Um das Problem zu beheben, dass die Windows App nicht in den container Windows App schreiben kann, müssen sie die folgenden vier Schritte ausführen:

  1. Stagen der Windows-App in einem lokalen Verzeichnis
  2. Erstellen der Config.jsund Einfügen erforderlicher PSF-Dateien
  3. Aktualisieren der appxManifest-Datei Windows App
  4. Erneutes Packen und Signieren der Windows-App

Die obigen Schritte bieten Anleitungen, indem Sie den Inhalt der Windows-App in ein lokales gephasenes Verzeichnis extrahieren, die PSF-Fixupdateien in das geplatzte Windows App-Verzeichnis einfügen, die Anwendungs-Startprogramm so konfigurieren, dass sie auf den PSF-Starter verweisen, und dann die PSF-config.jsin der Datei konfigurieren, um das PSF-Starter an die App umzuleiten, die das Arbeitsverzeichnis angibt.

Herunterladen und Installieren der erforderlichen 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 eine Schritt-für-Schritt-Anleitung zum Herunterladen und Installieren der erforderlichen Tools.

  1. Laden Sie die neueste Version (ohne Vorschauversion) des NuGet-Clienttoolsherunter, und speichern Sie die nuget.exe im C:\PSF\nuget Ordner .

  2. Laden Sie das Paketunterstützungsframework mitHilfe von NuGet herunter, indem Sie Folgendes über ein Administratives 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 es.

    1. Laden Sie das Win 10 SDKherunter.
    2. Führen Sie den winsdksetup.exe aus, der 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
      • Lokalisierung des Windwos SDK für UWP-Apps
    5. Wählen Sie die Schaltfläche Installieren aus.
    6. Wählen Sie die Schaltfläche OK aus.

Stagen der Windows-App

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

  1. Öffnen Sie ein Administratives PowerShell-Fenster.

  2. Legen Sie die folgenden Variablen für Ihre spezifische 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 eine config.js in der Datei erstellt und Informationen über die fehlerhafte Windows App-Startprogramm bereitgestellt werden. Wenn bei mehreren Windows App-Startern Probleme auftreten, kann die config.js in der Datei mit mehreren Einträgen aktualisiert werden.

Nach dem Aktualisieren der config.js in der Datei müssen die config.js für die Datei und die unterstützenden PSF-Fixupdateien dann in das Stammverzeichnis 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 und im Dropdownmenü die Option Neue Datei auswählen.

  3. Speichern Sie die Datei als config.jsunter, indem Sie oben im fenster VS Code das Menü Datei auswählen und 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 auf config.json fest. Wählen Sie die Schaltfläche Speichern aus.

  4. Kopieren Sie den folgenden Code in die neu erstellte config.jsin der Datei .

    {
        "applications": [
            {
                "id": "",
                "executable": ""
            }
        ],
        "processes": [
            {
                "executable": "",
                "fixups": [
                {
                    "dll": "",
                    "config": {
                        "redirectedPaths": {
                            "packageRelative": [
                                {
                                    "base": "",
                                    "patterns": [
                                        ""
                                    ]
                                }
                            ]
                        }
                    }
                }
            ]
            }
        ]
    }
    
  5. Öffnen Sie die Windows App AppxManifest-Datei, die sich im Windows App-Stagingordner (C:\PSF\Staging\PSFSampleApp\AppxManifest.xml) befindet, indem Sie VS Code oder einen anderen Text-Editor verwenden.

    <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. Legen Sie den applications.id Wert imconfig.jsauf auf den gleichen Wert fest, der im Feld Applications.Application.ID der AppxManifest.xml-Datei gefunden wird. Bild, das den Speicherort der ID in der AppxManifest-Datei umschließt.

  7. Legen Sie den applications.executable Wert imconfig.jsauf fest, um den relativen Pfad zur Anwendung in Applications.Application.Exeausschneidenden Feld der AppxManifest.xml-Datei als Ziel festzulegen. Bild, das den Speicherort der ausführbaren Datei in der AppxManifest-Datei umschließt.

  8. Legen Sie den applications.workingdirectory Wert imconfig.jsauf fest, um den relativen Ordnerpfad im Applications.Application.Exebewertbaren Feld der AppxManifest.xml-Datei als Ziel festzulegen. Bild, das den Speicherort des Arbeitsverzeichnisses in der AppxManifest-Datei umschließt.

  9. Legen Sie den process.executable Wert imconfig.jsauf fest, um den Dateinamen (ohne Pfad und Erweiterungen) im Applications.Application.Exeausschneidenden Feld der AppxManifest.xml-Datei als Ziel festzulegen. Bild, das den Speicherort der ausführbaren Prozessdatei in der AppxManifest-Datei umschließt.

  10. Legen Sie den processes.fixups.dll Wert imconfig.jsauf fest, um die architekturspezifische FileRedirectionFixup.dll als Ziel festzulegen. Wenn die Korrektur für die x64-Architektur erfolgt, legen Sie den Wert aufFileRedirectionFixup64.dll fest. Wenn die Architektur x86 oder unbekannt ist, legen Sie den Wert auf FileRedirectionFixup86.dll

  11. Legen Sie den processes.fixups.config.redirectedPaths.packageRelative.base Wert imconfig.js auf den relativen Ordnerpfad des Pakets fest, wie in derApplications.Application.Exeaus der AppxManifest.xml-Datei ausgeschnitten werden kann. Bild, das den Speicherort des Arbeitsverzeichnisses in der AppxManifest-Datei umschließt.

  12. Legen Sie den processes.fixups.config.redirectedPaths.packageRelative.patterns Wert imconfig.jsfür die Datei so fest, dass er mit dem Dateityp übereinstimmt, der von der Anwendung erstellt wird. Mit ". \ .log"* leitet die PSF Schreibvorgänge für alle Protokolldateien um, die sich in dem Verzeichnis befinden, das im Pfad processes.fixups.config.redirectedPaths.packageRelative.base sowie in untergeordneten Verzeichnissen identifiziert ist.

  13. Speichern Sie die aktualisierte config.jsin der Datei.

    {
        "applications": [
            {
            "id": "PSFSample",
            "executable": "VFS/ProgramFilesX64/PS Sample App/PSFSample.exe"
            }
        ],
        "processes": [
            {
                "executable": "PSFSample",
                "fixups": [
                    {
                        "dll": "FileRedirectionFixup64.dll",
                        "config": {
                            "redirectedPaths": {
                                "packageRelative": [
                                    {
                                        "base": "VFS/ProgramFilesX64/PS Sample App/",
                                        "patterns": [
                                            ".*\\.log"
                                        ]
                                    }
                                ]
                            }
                        }
                    }
                ]
            }
        ]
    }
    
  14. Kopieren Sie die folgenden vier Dateien aus dem Paketunterstützungsframework basierend auf der ausführbaren Anwendungsarchitektur in das Stammverzeichnis der ge staged Windows App. Die folgenden Dateien befinden sich in .\Microsoft.PackageSupportFramework. \bin.

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

Aktualisieren von AppxManifest

Nach dem Erstellen und Aktualisieren desconfig.jsin der Datei muss dieAppxManifest.xmlder Windows-App für jede Windows-App Startprogramm aktualisiert werden, die in derconfig.js auf enthalten war. Die Anwendungen von AppxManifest müssen nun auf diePSFLauncher.exe anwendungsarchitektur zugeordneten Anwendungen.

  1. Öffnen Sie den Datei-Explorer, und navigieren Sie zum Ordner Gestagtete MSIX-App (C:\PSF\Staging\PSFSampleApp).

  2. Klicken Sie mit der rechten Maustaste aufAppxManifest.xml, und wählen Sie Öffnen mit-Code aus dem Dropdownmenü aus (optional können Sie mit einem anderen Text-Editor öffnen).

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

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

Erneutes Packen der Anwendung

Alle Korrekturen wurden angewendet, nun kann die Windows-App erneut in eine MSIX gepackt 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 erneut aus dem Stagingordner, 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