So beheben Sie Fehler beim Schreiben von Schreibberechtigungen für das Paketunterstützungsframework-Dateisystem

In diesem Artikel wird beschrieben, wie Sie das Paketunterstützungsframework (Package Support Framework, PSF) verwenden, um einen Fehler beim Schreiben von Dateisystemberechtigungen zu beheben.

Windows-Apps leiten bestimmte anwendungsbezogene Verzeichnisse in den C:\Program Files\WindowsApps Ordner um. Wenn die Anwendung versucht, in den Windows-App-Container zu schreiben, wird ein Fehler ausgelöst, und der Schreibvorgang schlägt fehl. Sie können Verbesserungen am Windows-App-Paket vornehmen, um dieses Problem zu beheben.

Untersuchung

Identifizieren Sie zunächst den Fehler und die Verzeichnispfade, die die App anfordert.

Erfassen des Windows-App-Fehlers

Das Filtern der Ergebnisse ist optional, erleichtert aber das Anzeigen anwendungsbezogener Fehler. Zum Filtern von Ergebnissen erstellen Sie zwei Filterregeln. Der erste Filter enthält den Namen des Anwendungsprozesses, und der zweite Filter enthält alle Ergebnisse, die nicht erfolgreich sind.

  1. Laden Sie den SysInternals-Prozessmonitor herunter, und extrahieren Sie es in das Verzeichnis "C:\PSF\ProcessMonitor".

  2. Öffnen Sie Windows Explorer, und navigieren Sie zum extrahierten SysInternals ProcessMonitor-Ordner .

  3. Wählen Sie die Datei SysInternals Process Monitor procmon.exe aus, um die App zu starten.

  4. Wenn Sie von der UAC aufgefordert werden, wählen Sie "Ja" aus.

  5. Wählen Sie im Fenster "Prozessüberwachungsfilter" im Dropdownmenü des ersten Felds "Prozessname" aus.

  6. Stellen Sie sicher, dass im nächsten Feld angezeigt wird .

  7. Geben Sie im nächsten Feld den Prozessnamen Ihrer App ein, z . B. PSFSample.exe.

    Example of the Process Monitor Filter window with app name.

  8. Klicken Sie auf Hinzufügen.

  9. Wählen Sie im Fenster "Prozessüberwachungsfilter" im Dropdownmenü des ersten Felds "Ergebnis" aus.

  10. Im nächsten Feld befindet sich die Option nicht im Dropdownmenü.

  11. Geben Sie im Textfeld SUCCESS ein.

    Example of the Process Monitor Filter window with Result.

  12. Klicken Sie auf Hinzufügen und dann auf OK.

  13. Starten Sie die Windows-App, lösen Sie den Fehler aus, und schließen Sie dann die Windows-App.

Überprüfen der Fehlerprotokolle der Windows-App

Untersuchen Sie nach der Erfassung der Windows-App-Prozesse die Ergebnisse, um zu ermitteln, ob der Fehler mit dem Arbeitsverzeichnis verknüpft ist.

Überprüfen Sie die Fehlerergebnisse des SysInternals-Prozessmonitors. Wenn die Ergebnisse Access verweigert haben, mit einem gewünschten Zugriff: Generisches Schreibdetail für Ihre App für C:\Programme\WindowsApps\...\, haben Sie einen Schreibberechtigungsfehler im Zusammenhang mit dem Arbeitsverzeichnis identifiziert.

Displays the error message witnessed in the SysInternals Process Monitor for failure to write to directory.

Wenn Sie diesen Fehler identifizieren, wenden Sie die folgende PSF-Korrektur auf Ihre App an.

Lösung

Führen Sie die folgenden Schritte aus, um das Problem der Windows-App zu beheben, das nicht in den Windows-App-Container geschrieben werden kann:

  1. Extrahieren Sie den Inhalt der Windows-App in ein lokales Stagingverzeichnis.
  2. Erstellen Sie eine config.json, und fügen Sie die PSF-Fixupdateien in das mehrstufige Windows-App-Verzeichnis ein.
  3. Konfigurieren Sie das Anwendungsstartprogramm so, dass es auf das PSF-Startfeld zeigt, und konfigurieren Sie die PSF config.json-Datei , um das PSF-Startfeld umzuleiten, und geben Sie das Arbeitsverzeichnis an.
  4. Aktualisieren Sie die Datei "AppxManifest" der Windows-App.
  5. Packen Sie die Windows-App neu, und signieren Sie sie.

Herunterladen und Installieren der erforderlichen Tools

Für diesen Vorgang sind die folgenden Tools erforderlich:

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

So laden Sie NuGet und PSF herunter und installieren sie:

  1. Laden Sie die neueste Nichtvorschauversion des NuGet-Clienttools herunter, und speichern Sie nuget.exe in C:\PSF\nuget.

  2. Laden Sie das Paketunterstützungsframework mit NuGet herunter, und installieren Sie es, indem Sie den folgenden Befehl in einem Administrativen PowerShell-Fenster ausführen:

    Set-Location "C:\PSF"
    .\nuget\nuget.exe install Microsoft.PackageSupportFramework
    

So laden Sie das Windows 10 SDK herunter und installieren es:

  1. Laden Sie das Win 10 SDK herunter.
  2. Run winsdksetup.exe .
  3. Wählen Sie Weiter aus.
  4. Wählen Sie nur die folgenden drei Features 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 "Installieren" und dann "OK" aus.

Stufen der Windows-App

Das Staging der Windows-App extrahiert und entpackt den Inhalt der App in ein lokales Verzeichnis. Sobald die Windows-App an den Stagingspeicherort entpackt wurde, können Sie PSF-Fixupdateien einfügen, um unerwünschte Erfahrungen zu korrigieren.

  1. Legen Sie in einem Administrativen PowerShell-Fenster die folgenden Variablen so fest, dass sie auf Ihre spezifische App-Datei und die Windows 10 SDK-Version ausgerichtet sind:

    $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
    
  2. 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 die Windows-App zu korrigieren, erstellen Sie eine config.json-Datei mit Informationen zum Windows-App-Startfeld, das fehlschlägt. Wenn mehrere Windows-App-Startprogramme Probleme haben, können Sie die Datei config.json mit mehreren Einträgen konfigurieren.

Nachdem Sie die Datei config.json erstellt haben, verschieben Sie die Datei config.json und unterstützende PSF-Fixupdateien in das Stammverzeichnis des Windows-App-Pakets.

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

  2. Erstellen Sie eine neue Datei namens config.json im Windows-App-Stagingverzeichnis C :\PSF\Staging\PSFSampleApp.

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

    {
        "applications": [
            {
                "id": "",
                "executable": ""
            }
        ],
        "processes": [
            {
                "executable": "",
                "fixups": [
                {
                    "dll": "",
                    "config": {
                        "redirectedPaths": {
                            "packageRelative": [
                                {
                                    "base": "",
                                    "patterns": [
                                        ""
                                    ]
                                }
                            ]
                        }
                    }
                }
            ]
            }
        ]
    }
    
  4. Öffnen Sie die Datei "AppxManifest.xml " im Windows-App-Stagingordner. Das folgende Beispiel zeigt eine AppxManifest.xml-Datei :

    <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>
    
  5. Nehmen Sie die folgenden Änderungen in der Datei config.json vor:

    • Legen Sie den applications.id Wert auf denselben Wert fest wie im Applications.Application.ID Feld der Datei "AppxManifest.xml ".

      Image showing the location of the ID within the AppxManifest file.

    • Legen Sie den applications.executable Wert auf den relativen Pfad der Anwendung fest, die Applications.Application.Executable sich im Feld der Datei "AppxManifest.xml " befindet.

      Image showing the location of the executable within the *AppxManifest.xml* file.

    • Legen Sie den applications.workingdirectory Wert auf den relativen Ordnerpfad im Applications.Application.Executable Feld der Datei "AppxManifest.xml " fest.

      Image showing the location of the working directory within the AppxManifest file.

    • Legen Sie den process.executable Wert auf den Dateinamen ohne Pfad und Erweiterung im Applications.Application.Executable Feld der Datei "AppxManifest.xml " fest.

      Image showing the location of the process executable within the AppxManifest file.

    • Legen Sie den processes.fixups.dll Wert auf die architekturspezifische Ziel fest FileRedirectionFixup.dll. Wenn die Korrektur für die x64-Architektur gilt, legen Sie den Wert auf .FileRedirectionFixup64.dll Wenn die Architektur x86 ist oder unbekannt ist, legen Sie den Wert auf .FileRedirectionFixup86.dll

    • Legen Sie den processes.fixups.config.redirectedPaths.packageRelative.base Wert auf den paketrelativen Ordnerpfad im Applications.Application.Executable Feld der Datei "AppxManifest.xml " fest.

      Image showing the location of the working directory within the AppxManifest file.

    • Legen Sie den processes.fixups.config.redirectedPaths.packageRelative.patterns Wert fest, der dem von der Anwendung erstellten Dateityp entspricht. Bei Verwendung .*\\.logleitet die PSF alle Protokolldateien in das processes.fixups.config.redirectedPaths.packageRelative.base Verzeichnis und die untergeordneten Verzeichnisse um.

  6. Speichern Sie die aktualisierte Datei config.json . Das folgende Beispiel zeigt eine aktualisierte Config.json-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"
                                        ]
                                    }
                                ]
                            }
                        }
                    }
                ]
            }
        ]
    }
    
  7. Kopieren Sie die folgenden Dateien aus dem Paketunterstützungsframework für die ausführbare Anwendungsarchitektur in das Stammverzeichnis der mehrstufigen Windows-App. Sie finden die Dateien in .\Microsoft.PackageSupportFramework.\<Version>\bin.

    Anwendung (x64) Anwendung (x86)
    PSF Startprogramm 64.exe PSF Startprogramm 32.exe
    PSFRuntime64.dll PSFRuntime32.dll
    PSFRunDll64.exe PSFRunDll32.exe
    FileRedirectionFixup64.dll FileRedirectionFixup64.dll

Aktualisieren von AppxManifest

Aktualisieren Sie nach dem Erstellen und Aktualisieren der Datei config.json die AppxManifest.xml-Datei der Windows-App für jedes Windows-App-Startfeld, das Sie in der Datei config.json enthalten haben. Die AppxManifest.xmlApplications muss nun auf die PSF Startprogramm.exe ausgerichtet sein, die der Anwendungsarchitektur zugeordnet ist.

  1. Öffnen Sie AppxManifest.xml im mehrstufigen MSIX-App-Ordner C :\PSF\Staging\PSFSampleApp.
  2. Aktualisieren Sie AppxManifest.xml mit dem folgenden Code:
    <Package ...>
    ...
    <Applications>
        <Application Id="PSFSample"
                    Executable="PSFLauncher32.exe"
                    EntryPoint="Windows.FullTrustApplication">
        ...
        </Application>
    </Applications>
    </Package>
    

Erneutes Packen der Anwendung

Nachdem Sie alle Korrekturen angewendet haben, packen Sie die Windows-App in ein MSIX neu, und signieren Sie sie mit einem Codesignaturzertifikat.

  1. Öffnen Sie ein PowerShell-Verwaltungsfenster.

  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, 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