Beheben von Fehler beim Schreiben von Berechtigungsfehlern des Paketunterstützungsframework-Dateisystems

In diesem Artikel wird beschrieben, wie Sie das Paketunterstützungsframework (PSF) verwenden, um einen Fehler beim Schreibzugriff auf Das Dateisystem zu beheben.

Windows-Apps leiten bestimmte anwendungsbezogene Verzeichnisse an den Ordner "Windows-App-Container" 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 an dem 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 jedoch das Anzeigen von anwendungsbezogenen Fehlern. Zum Filtern von Ergebnissen erstellen Sie zwei Filterregeln. Der erste Filter enthält den Namen des Anwendungsprozesss, und der zweite Filter enthält alle 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 ProcessMonitor-Ordner .

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

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

  5. Wählen Sie im Fenster " Prozessmonitorfilter " im Dropdownmenü des ersten Felds den Prozessnamen 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. Wählen Sie Hinzufügen.

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

  10. Wählen Sie im nächsten Feld nicht im Dropdownmenü aus.

  11. Geben Sie im Textfeld ERFOLG 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 die Windows-App.

Überprüfen der Windows-App-Fehlerprotokolle

Nachdem Sie die Windows-App-Prozesse erfasst haben, untersuchen Sie die Ergebnisse, um festzustellen, ob der Fehler mit dem Arbeitsverzeichnis verknüpft ist.

Überprüfen Sie die Fehlerergebnisse von SysInternals Process Monitor. Wenn die Ergebnisse Access verweigert haben, mit einem gewünschten Access: Generische Schreibdetail für Ihre App für C:\Program Files\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 schreibt:

  1. Extrahieren Sie den Inhalt der Windows-App in ein lokales Stagingverzeichnis.
  2. Erstellen Sie eine config.json, und injizieren Sie die PSF-Fixupdateien in das windows-App-Verzeichnis.
  3. Konfigurieren Sie das Anwendungsstartprogramm so, dass sie auf das PSF-Startfeld verweist, und konfigurieren Sie die PSF config.json-Datei , um das PSF-Startprogramm umzuleiten, indem Sie das Arbeitsverzeichnis angeben.
  4. Aktualisieren Sie die Windows-App-AppxManifest-Datei.
  5. Erneutes Packen und Signieren der Windows-App

Herunterladen und Installieren erforderlicher Tools

Dieser Prozess erfordert die folgenden Tools:

  • 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 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 diesen, indem Sie den folgenden Befehl aus 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 Sie es:

  1. Laden Sie das Win 10 SDK herunter.
  2. Führen Sie winsdksetup.exe aus.
  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.

Phasen 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 ist, können Sie PSF-Fixupdateien einfügen, um unerwünschte Erfahrungen zu korrigieren.

  1. Legen Sie in einem Administrativen PowerShell-Fenster die folgenden Variablen fest, um ihre spezifische App-Datei und Windows 10 SDK-Version zu erreichen:

    $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 datei config.json mit Informationen zum Windows-App-Startfeld, das fehlschlägt. Wenn mehrere Windows-App-Startelemente 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ützen 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 config.json-Datei .

    {
        "applications": [
            {
                "id": "",
                "executable": ""
            }
        ],
        "processes": [
            {
                "executable": "",
                "fixups": [
                {
                    "dll": "",
                    "config": {
                        "redirectedPaths": {
                            "packageRelative": [
                                {
                                    "base": "",
                                    "patterns": [
                                        ""
                                    ]
                                }
                            ]
                        }
                    }
                }
            ]
            }
        ]
    }
    
  4. Öffnen Sie die dateiAppxManifest.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 fest, der demselben Wert entspricht wie im Applications.Application.ID Feld der AppxManifest.xml Datei.

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

    • Legen Sie den applications.executable Wert fest, um den relativen Pfad zur Anwendung Applications.Application.Executable im Feld der dateiAppxManifest.xml festzulegen.

      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 AppxManifest.xml-Datei fest.

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

    • Legen Sie den process.executable Wert fest, um den Dateinamen ohne Pfad und Erweiterung im Applications.Application.Executable Feld der dateiAppxManifest.xml festzulegen.

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

    • Legen Sie den Wert fest, der auf processes.fixups.dll die architekturspezifische FileRedirectionFixup.dllZiel ausgerichtet ist. Wenn sich die Korrektur auf die x64-Architektur bezieht, legen Sie den Wert auf . fest 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 AppxManifest.xml-Datei 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 Dateityp entspricht, den die Anwendung erstellt. Wenn Sie verwenden .*\\.log, leitet die PSF alle Protokolldateien in das processes.fixups.config.redirectedPaths.packageRelative.base Verzeichnis und untergeordnete Verzeichnisse um.

  6. Speichern Sie die aktualisierte config.json-Datei . 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 den Stamm der schrittweisen Windows-App. Sie finden die Dateien in .\Microsoft.PackageSupportFramework.\<Version>\bin.

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

AppxManifest aktualisieren

Nachdem Sie die Datei config.json erstellt und aktualisiert haben, aktualisieren Sie die AppxManifest.xml Datei der Windows-App für jedes Windows-App-Startprogramm, das Sie in der Datei config.json enthalten haben. Die AppxManifest.xmlApplications müssen nun auf die PSFLauncher.exe abzielen, die der Anwendungsarchitektur zugeordnet ist.

  1. Öffnen Sie AppxManifest.xml im mehrstufigen MSIX-App-Ordner C:\PSF\Staging\PSFSampleApp.
  2. Aktualisieren SieAppxManifest.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 eine MSIX um, und signieren Sie sie mit einem Codesignaturzertifikat.

  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