Freigeben über


So beheben Sie Fehler bei den Schreibberechtigungen im Dateisystem des Package Support Frameworks.

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.

Erfassung 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 SysInternals-Prozessüberwachung procmon.exe Datei 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 ist im nächsten Feld angezeigt wird.

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

    Beispiel für das Fenster

  8. Wählen Sie "Hinzufügen" aus.

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

  10. Im nächsten Feld wählen Sie ist nicht aus dem Dropdownmenü.

  11. Geben Sie im Textfeld SUCCESS ein.

    Beispiel für das Fenster

  12. Wählen Sie "Hinzufügen" und dann "OK" aus.

  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 denied enthalten, mit dem Detail Desired Access: Generic Write, bei der Arbeit mit Ihrer App unter C:\Programme\WindowsApps\...\, dann haben Sie einen Schreibberechtigungsfehler im Zusammenhang mit dem Arbeitsverzeichnis identifiziert.

Zeigt die Fehlermeldung an, die im SysInternals-Prozessmonitor für Fehler beim Schreiben in das Verzeichnis angezeigt wird.

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

Beschluss

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

  1. Extrahieren Sie den Inhalt der Windows-App in ein lokales Staging-Verzeichnis.
  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-Client-Tool
  • Paketunterstützungsframework (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. Führen Sie winsdksetup.exe aus.
  3. Wählen Sie "Weiter" aus.
  4. Wählen Sie nur die folgenden drei Features aus:
    • Windows SDK-Signaturtools 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.

Stagen 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 Staging-Speicherort entpackt wurde, können Sie PSF-Fixupdateien injizieren, um unerwünschtes Verhalten 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 config.json Datei mit mehreren Einträgen konfigurieren.

Nachdem Sie die config.json Datei erstellt haben, verschieben Sie die config.json und die unterstützenden PSF-Fixup-Dateien 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 dateiconfig.json vor:

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

      Abbildung des Speicherorts der ID in der AppxManifest-Datei.

    • Legen Sie den applications.executable Wert fest, um den relativen Pfad zu der Anwendung anzugeben, die sich im Applications.Application.Executable Feld der DateiAppxManifest.xml befindet.

      Abbildung des Speicherorts der ausführbaren Datei innerhalb der Datei *AppxManifest.xml*

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

      Abbildung des Speicherorts des Arbeitsverzeichnisses in der AppxManifest-Datei.

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

      Abbildung, die den Speicherort der ausführbaren Datei des Prozesses in der AppxManifest-Datei zeigt.

    • Legen Sie den processes.fixups.dll-Wert fest, um auf das architekturspezifische FileRedirectionFixup.dll zu zielen. 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 AppxManifest.xml Datei fest.

      Abbildung des Speicherorts des Arbeitsverzeichnisses in der AppxManifest-Datei.

    • Legen Sie den processes.fixups.config.redirectedPaths.packageRelative.patterns Wert fest, der dem von der Anwendung erstellten Dateityp entspricht. Bei der Verwendung von .*\\.log leitet die PSF alle Schreibvorgänge in Protokolldateien im processes.fixups.config.redirectedPaths.packageRelative.base Verzeichnis und dessen Unterverzeichnissen 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 das Stammverzeichnis der mehrstufigen 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

Aktualisieren von AppxManifest

Nachdem Sie die config.json-Datei erstellt und aktualisiert haben, aktualisieren Sie die AppxManifest.xml-Datei der Windows-App für jedes Windows-App-Startprogramm, das Sie in config.json eingeschlossen haben. Die AppxManifest.xmlApplications muss 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 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-Anwendung erneut aus dem Zwischenablageordner, 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