Freigeben über


So beheben Sie mit dem Framework zur Paketunterstützung Fehler im Zusammenhang mit der Schreibberechtigung für Dateisysteme

Dieser Artikel erklärt, wie Sie mit dem Framework zur Paketunterstützung (Package Support Framework, PSF) einen Fehler im Zusammenhang mit der Schreibberechtigung für Dateisysteme beheben können.

Spezifische Verzeichnisse werden von Windows-Apps zum Ordner C:\Program Files\WindowsApps umgeleitet. Beim Versuch der Anwendung, in den Windows-Anwendungscontainer zu schreiben, tritt ein Fehler auf und das Schreiben schlägt fehl. Um dieses Problem zu lösen, können Sie das Windows-App-Paket erweitern.

Untersuchung

Ermitteln Sie im ersten Schritt, welcher Fehler genau vorliegt und welche Verzeichnispfade von der App angefordert werden.

Erfassen Sie den Fehler der Windows-App

Die Ergebnisse müssen nicht zwangsläufig gefiltert werden. Mit Filtern können Sie anwendungsbezogene Fehler aber einfacher finden. Um die Ergebnisse zu filtern, definieren Sie zwei Filterregeln. Ein Filter umfasst den Prozessnamen der Anwendung, und der andere schließt alle nicht erfolgreichen Ergebnisse ein.

  1. Laden Sie den SysInternals Process Monitor in den Ordner C:\PSF\ProcessMonitor herunter, und extrahieren Sie die Datei dort.

  2. Öffnen Sie im Windows Explorer den Ordner, in dem sich die extrahierten Dateien von SysInternals Process Monitor befinden.

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

  4. Wenn die Benutzerkontensteuerung Sie dazu auffordert, wählen Sie Ja aus.

  5. Wählen Sie im Fenster Process Monitor-Filter aus dem Dropdownmenü des ersten Feldes die Option Prozessname aus.

  6. Überprüfen Sie, ob im nächsten Feld ist angezeigt wird.

  7. Im nächsten Feld geben Sie den Namen des Prozesses der App ein, beispielsweise PSFSample.exe.

    Beispiel des Fensters „Process Monitor-Filter“ mit dem Namen der App

  8. Wählen Sie Hinzufügen.

  9. Im Fenster Process Monitor-Filter wählen Sie aus dem Dropdownmenü des ersten Feldes die Option Ergebnis aus.

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

  11. Geben Sie im Textfeld ERFOLG ein.

    Beispiel des Fensters „Process Monitor-Filter“ mit Ergebnis

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

  13. Öffnen Sie die Windows-App, lösen Sie den Fehler aus, und schließend Sie daraufhin die App wieder.

Untersuchen Sie die Fehlerprotokolle der Windows-App

Nachdem Sie die Windows-App-Prozesse erfasst haben, ermitteln Sie anhand der Ergebnisse, ob der Fehler mit dem Arbeitsverzeichnis zusammenhängt.

Sehen Sie sich die Ergebnisse vom SysInternals Process Monitor zum Fehler an. Finden Sie unter den Ergebnissen den Fehler Zugriff verweigert mit dem Zusatz Gewünschter Zugriff: Allgemeines Schreiben, wenn die App versucht, auf C:\Programme\WindowsApps\...\ zuzugreifen, liegt ein Fehler mit der Schreibberechtigung für das Arbeitsverzeichnis vor.

Zeigt die Fehlermeldung, die SysInternals Process Monitor ausgibt, wenn das Schreiben im Verzeichnis fehlschlägt.

Wenn Sie diesen Fehler feststellen, beheben Sie den Fehler mit dem Framework zur Paketunterstützung (PSF).

Lösung

Das Problem, dass die Windows-App nicht in den Windows-Anwendungscontainer schreiben kann, beheben Sie wie folgt:

  1. Extrahieren Sie die Dateien der Windows-App in ein lokales Stagingverzeichnis.
  2. Erstellen Sie eine Datei mit dem Namen config.json, und injizieren Sie die Korrekturdateien des Frameworks zur Paketunterstützung in das Stagingverzeichnis der Windows-App.
  3. Legen Sie fest, dass der Anwendungsstarter auf den PSF-Starter verweist und die Datei config.json den PSF-Starter umleitet, wobei Sie das Arbeitsverzeichnis angeben.
  4. Führen Sie ein Update der AppxManifest-Datei der Windows-App durch.
  5. Paketieren Sie die Windows-App neu, und signieren Sie sie.

Download und Installation der benötigten Tools

Für diesen Vorgang sind die folgenden Tools erforderlich:

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

Download und Installation von NuGet und PSF:

  1. Laden Sie die aktuelle Version (keine Vorschauversion) des NuGet-Client-Tools herunter. Speichern Sie die Datei nuget.exe im Verzeichnis C:\PSF\nuget.

  2. Um das Framework zur Paketunterstützung mit NuGet herunterzuladen und zu installieren, führen Sie den folgenden Befehl in einem PowerShell-Fenster mit erhöhten Rechten aus:

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

Download und Installation des Windows 10 SDK:

  1. Laden Sie das Win 10 SDK herunter.
  2. Führen Sie die Datei winsdksetup.exe aus.
  3. Wählen Sie Weiter aus.
  4. Wählen Sie ausschließlich folgende drei Funktionen aus:
    • Windows SDK-Signierungstools für Desktop-Apps
    • Windows SDK für UWP-C++-Apps
    • Windows SDK für die UWP-Apps-Lokalisierung
  5. Wählen Sie Installieren und dann OK aus.

Stagen der Windows-App

Beim Stagen der Windows-App werden die Inhalte der App in ein lokales Verzeichnis extrahiert und entpackt. Nach dem Entpacken der Windows-App am Staging-Speicherort haben Sie die Möglichkeit, die Korrekturdateien des Frameworks zur Paketunterstützung zu injizieren, um nicht erwünschtes Verhalten zu beheben.

  1. Konfigurieren Sie in einem PowerShell-Fenster mit erhöhten Rechten die folgenden Variablen, damit sie auf Ihre jeweilige App-Datei und die Windows 10 SDK abzielen:

    $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. Führen Sie folgendes Cmdlet in der PowerShell aus, um die Windows-App im Staging-Ordner zu entpacken:

    ## 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 Injizieren der benötigten PSF-Dateien

Zum Korrigieren der Windows-App erstellen Sie eine Datei mit dem Namen config.json und geben Details zum Windows-App-Starter ein, bei dem der Fehler auftritt. Sollte es bei mehreren Windows-App-Startern zu Problemen kommen, können Sie auch mehrere Einträge für die Datei config.json erstellen.

Nach dem Erstellen der Datei config.json verschieben Sie die Datei config.json und die dazugehörigen Korrekturdateien des Frameworks zur Paketunterstützung in das Stammverzeichnis vom Paket der Windows-App.

  1. Öffnen Sie Visual Studio Code oder einen anderen Texteditor.

  2. Erstellen Sie im Stagingverzeichnis der Windows-App, C:\PSF\Staging\PSFSampleApp, eine neue Datei mit dem Namen config.json.

  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 aus dem Stagingverzeichnis der Windows-App. Im folgenden Beispiel ist eine AppxManifest.xml-Datei dargestellt:

    <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 an der Datei config.json vor:

    • Legen Sie den Wert applications.id so fest, dass er dem Wert im Feld Applications.Application.ID der Datei AppxManifest.xml entspricht.

      Bild, das zeigt, wo Sie die ID in der AppxManifest-Datei finden.

    • Legen Sie den Wert applications.executable so fest, dass er auf den relativen Pfad der Anwendung aus dem Feld Applications.Application.Executable der Datei AppxManifest.xml verweist.

      Bild, das zeigt, wo Sie die ausführbare Datei in der Datei *AppxManifest.xml* finden.

    • Legen Sie den Wert applications.workingdirectory so fest, dass er auf den relativen Pfad des Ordners aus dem Feld Applications.Application.Executable der Datei AppxManifest.xml verweist.

      Bild, das zeigt, wo Sie das Arbeitsverzeichnis in der AppxManifest-Datei finden.

    • Legen Sie den Wert process.executable so fest, dass er auf den Dateinamen, ohne Pfad und Erweiterung, aus dem Feld Applications.Application.Executable der Datei AppxManifest.xml verweist.

      Bild, das zeigt, wo Sie die ausführbare Datei des Prozesses in der AppxManifest-Datei finden.

    • Legen Sie den Wert processes.fixups.dll so fest, dass er auf die architekturspezifische FileRedirectionFixup.dll verweist. Wenn Sie einen Fehler auf einer x64-Architektur beheben, legen Sie als Wert FileRedirectionFixup64.dll fest. Bei der x86-Architektur oder einer unbekannten Architektur legen Sie als Wert FileRedirectionFixup86.dll fest.

    • Legen Sie den Wert processes.fixups.config.redirectedPaths.packageRelative.base auf den relativen Pfad des Ordners für das Paket aus dem Feld Applications.Application.Executable der Datei AppxManifest.xml fest.

      Bild, das zeigt, wo Sie das Arbeitsverzeichnis in der AppxManifest-Datei finden.

    • Legen Sie den Wert processes.fixups.config.redirectedPaths.packageRelative.patterns so fest, dass er mit dem Dateityp übereinstimmt, den die Anwendung erstellt. Wenn Sie .*\\.log verwenden, werden alle Schreibvorgänge für die Protokolldatei von PSF in das Verzeichnis processes.fixups.config.redirectedPaths.packageRelative.base und seine untergeordneten Verzeichnisse umgeleitet.

  6. Speichern Sie die aktualisierte Datei config.json. Im folgenden Beispiel ist die aktualisierte Datei config.json dargestellt:

    {
        "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 folgende Dateien vom Framework zur Paketunterstützung für die Anwendungsarchitektur in das Stammverzeichnis der Staging-Windows-App. Diese Dateien finden Sie unter .\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

Nach dem Erstellen und Aktualisieren der Datei config.json aktualisieren Sie die Datei AppxManifest.xml der Windows-App für jeden Windows-App-Starter, den Sie in die Datei config.json aufgenommen haben. Die Datei AppxManifest.xml Applications muss jetzt die Datei PSFLauncher.exe ansprechen, die zur Anwendungsarchitektur gehört.

  1. Öffnen Sie die Datei AppxManifest.xml im Staging-MSIX-App-Ordner, C:\PSF\Staging\PSFSampleApp.
  2. Fügen Sie den folgenden Code in die Datei AppxManifest.xml ein, um sie zu aktualisieren:
    <Package ...>
    ...
    <Applications>
        <Application Id="PSFSample"
                    Executable="PSFLauncher32.exe"
                    EntryPoint="Windows.FullTrustApplication">
        ...
        </Application>
    </Applications>
    </Package>
    

Erneutes Paketieren der Anwendung

Wenn Sie alle Korrekturen vorgenommen haben, paketieren Sie die Windows-App erneut in ein MSIX. Signieren Sie dann die App mit einem Codesignaturzertifikat.

  1. Öffnen Sie ein PowerShell-Fenster mit erhöhten Rechten.

  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. Führen Sie folgendes Cmdlet in der PowerShell aus, um die Windows-App im Staging-Ordner neu zu packen:

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

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