Delen via


Fouten met schrijfmachtigingen voor Package Support Framework-bestandssysteem oplossen

In dit artikel wordt beschreven hoe u het Package Support Framework (PSF) gebruikt om een schrijfmachtigingsfout voor bestandssysteem op te lossen.

Windows-apps leiden specifieke toepassingsgerelateerde mappen om naar de C:\Program Files\WindowsApps map. Als de toepassing probeert te schrijven naar de Windows-app-container, wordt er een fout geactiveerd en mislukt de schrijfbewerking. U kunt verbeteringen aanbrengen in het Windows-app-pakket om dit probleem op te lossen.

Onderzoek

Identificeer eerst de fout en de mappaden die de app aanvraagt.

De Windows-app-fout vastleggen

Het filteren van de resultaten is optioneel, maar maakt het gemakkelijker om toepassingsgerelateerde fouten te zien. Als u resultaten wilt filteren, maakt u twee filterregels. Het eerste filter bevat de naam van het toepassingsproces en het tweede filter bevat eventuele resultaten die niet zijn geslaagd.

  1. Download en pak SysInternals Process Monitor uit in de map C:\PSF\ProcessMonitor.

  2. Open Windows Verkenner en navigeer naar de uitgepakte map SysInternals ProcessMonitor .

  3. Selecteer het bestand SysInternals Process Monitor procmon.exe om de app te starten.

  4. Als u hierom wordt gevraagd door UAC, selecteert u Ja.

  5. Selecteer in het venster Procescontrolefilterprocesnaam in het vervolgkeuzemenu van het eerste veld.

  6. Controleer of is weergegeven wordt in het volgende veld.

  7. Voer in het volgende veld de procesnaam van uw app in, bijvoorbeeld PSFSample.exe.

    Voorbeeld van het venster Filter voor procesmonitor met app-naam.

  8. Selecteer Toevoegen.

  9. Selecteer in het venster Filter voor procescontroleresultaat in het vervolgkeuzemenu van het eerste veld.

  10. Selecteer in het volgende veld is niet in de vervolgkeuzelijst.

  11. Voer GESLAAGD in het tekstveld in.

    Voorbeeld van het venster Procescontrolefilter met Resultaat.

  12. Selecteer Toevoegen en selecteer vervolgens OK.

  13. Start de Windows-app, veroorzaak de fout; sluit daarna de Windows-app.

Bekijk de windows-app-foutenlogboeken

Nadat u de Processen van de Windows-app hebt vastgelegd, onderzoekt u de resultaten om te bepalen of de fout is gerelateerd aan de werkmap.

Bekijk de foutresultaten van SysInternals Process Monitor. Als de resultaten toegang geweigerd bevatten, met een Gewenste toegang: Generiek schrijven detail, voor uw app die zich richt op C:\Program Files\WindowsApps\...\, hebt u een schrijfrechtenfout geïdentificeerd die betrekking heeft op de werkmap.

Geeft het foutbericht weer dat is weergegeven in de SysInternals-procesmonitor voor het niet schrijven naar de map.

Als u deze fout identificeert, past u de volgende PSF-correctie toe op uw app.

Resolutie / Besluit

Voer de volgende stappen uit om het probleem op te lossen dat de Windows-app niet naar de Windows-app-container kan schrijven:

  1. Pak de inhoud van de Windows-app uit naar een lokale testmap.
  2. Maak een config.json en injecteer de PSF-fixupbestanden in de geprepareerde map van de Windows-app.
  3. Configureer het startprogramma voor toepassingen om naar het PSF-startprogramma te verwijzen en configureer het PSF -config.json-bestand om het PSF-startprogramma om te leiden, waarbij de werkmap wordt opgegeven.
  4. Werk het Windows-app AppxManifest-bestand bij.
  5. De Windows-app opnieuw verpakken en ondertekenen.

Vereiste hulpprogramma's downloaden en installeren

Voor dit proces zijn de volgende hulpprogramma's vereist:

  • NuGet-clienthulpprogramma
  • Pakketondersteuningsraamwerk (PSF)
  • Windows 10 Software Development Toolkit (Win 10 SDK), nieuwste versie
  • SysInternals Proces Monitor

NuGet en PSF downloaden en installeren:

  1. Download de nieuwste niet-preview-versie van het NuGet-clienthulpprogramma en sla nuget.exe op in C:\PSF\nuget.

  2. Download en installeer het Package Support Framework met NuGet door de volgende opdracht uit te voeren vanuit een PowerShell-venster met beheerdersrechten:

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

De Windows 10 SDK downloaden en installeren:

  1. Download de Win 10 SDK.
  2. Voer winsdksetup.exe uit.
  3. Selecteer Volgende.
  4. Selecteer alleen de volgende drie functies:
    • Hulpprogramma's voor windows-SDK-ondertekening voor desktop-apps
    • Windows SDK voor UWP C++-apps
    • Windwos SDK voor LOKALISATIE VAN UWP-apps
  5. Selecteer Installeren en selecteer vervolgens OK.

De Windows-app klaar maken

Door het klaarzetten van de Windows-app wordt de inhoud van de app geëxtraheerd en uitgepakt naar een lokale map. Zodra de Windows-app is uitgepakt naar de faseringslocatie, kunt u PSF-fixupbestanden injecteren om ongewenste ervaringen te corrigeren.

  1. Stel in een PowerShell-venster met beheerdersrechten de volgende variabelen in om het specifieke app-bestand en de Windows 10 SDK-versie te richten:

    $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. Pak de Windows-app uit in de stagingmap door de volgende PowerShell-cmdlet uit te voeren:

    ## 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"
    

Vereiste PSF-bestanden maken en injecteren

Als u de Windows-app wilt corrigeren, maakt u een config.json-bestand met informatie over het startprogramma voor Windows-apps dat mislukt. Als er problemen zijn met meerdere startprogramma's voor Windows-apps, kunt u het config.json-bestand met meerdere vermeldingen configureren.

Nadat u het config.json-bestand hebt gemaakt, verplaatst u de config.json en ondersteunende PSF-fixupbestanden naar de hoofdmap van het Windows-app-pakket.

  1. Open Visual Studio Code of een andere teksteditor.

  2. Maak een nieuw bestand met de naam config.json in de faseringsmap van de Windows-app, C:\PSF\Staging\PSFSampleApp.

  3. Kopieer de volgende code naar het zojuist gemaakte config.json-bestand .

    {
        "applications": [
            {
                "id": "",
                "executable": ""
            }
        ],
        "processes": [
            {
                "executable": "",
                "fixups": [
                {
                    "dll": "",
                    "config": {
                        "redirectedPaths": {
                            "packageRelative": [
                                {
                                    "base": "",
                                    "patterns": [
                                        ""
                                    ]
                                }
                            ]
                        }
                    }
                }
            ]
            }
        ]
    }
    
  4. Open het bestandAppxManifest.xml in de faseringsmap van de Windows-app. In het volgende voorbeeld ziet u een AppxManifest.xml bestand:

    <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. Breng de volgende wijzigingen aan in het bestandconfig.json :

    • Stel de applications.id waarde in op dezelfde waarde als in het Applications.Application.ID veld van het AppxManifest.xml-bestand .

      Afbeelding van de locatie van de id in het AppxManifest-bestand.

    • Stel in de applications.executable-waarde het relatieve pad naar de toepassing in, dat zich in het Applications.Application.Executable-veld van het AppxManifest.xml-bestand bevindt.

      Afbeelding van de locatie van het uitvoerbare bestand in het bestand *AppxManifest.xml*.

    • Stel de applications.workingdirectory waarde in om het relatieve mappad te richten in het Applications.Application.Executable veld van het AppxManifest.xml-bestand .

      Afbeelding van de locatie van de werkmap in het AppxManifest-bestand.

    • Stel de process.executable waarde in op de bestandsnaam, zonder pad en extensie, in het Applications.Application.Executable veld van het AppxManifest.xml-bestand .

      Afbeelding van de locatie van het uitvoerbare proces in het AppxManifest-bestand.

    • Stel de processes.fixups.dll waarde in om de architectuurspecifieke FileRedirectionFixup.dll te richten. Als de correctie voor x64-architectuur is, stelt u de waarde in op FileRedirectionFixup64.dll. Als de architectuur x86 is of onbekend is, stelt u de waarde in op .FileRedirectionFixup86.dll

    • Stel de processes.fixups.config.redirectedPaths.packageRelative.base waarde in op het pakket-relatieve mappad in het Applications.Application.Executable veld van het AppxManifest.xml-bestand .

      Afbeelding van de locatie van de werkmap in het AppxManifest-bestand.

    • Stel de waarde in zodat deze processes.fixups.config.redirectedPaths.packageRelative.patterns overeenkomt met het bestandstype dat de toepassing maakt. Als u .*\\.log gebruikt, leidt de PSF alle logboekbestandschrijvingen om in de processes.fixups.config.redirectedPaths.packageRelative.base map en onderliggende mappen.

  6. Sla het bijgewerkte config.json-bestand op. In het volgende voorbeeld ziet u een bijgewerkt config.json-bestand :

    {
        "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. Kopieer de volgende bestanden uit het Package Support Framework voor de uitvoerbare architectuur van de toepassing naar de hoofdmap van de gefaseerde Windows-app. U vindt de bestanden in .\Microsoft.PackageSupportFramework.\<Version>\bin.

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

AppxManifest bijwerken

Nadat u het config.json-bestand hebt gemaakt en bijgewerkt, werkt u het AppxManifest.xml-bestand van de Windows-app bij voor elk startprogramma voor Windows-apps dat u in de config.jsonhebt opgenomen. De AppxManifest.xmlApplications moet nu gericht zijn op de PSFLauncher.exe die aan de toepassingsarchitectuur zijn gekoppeld.

  1. Open AppxManifest.xml in de map met gefaseerde MSIX-apps, C:\PSF\Staging\PSFSampleApp.
  2. Werk AppxManifest.xml bij met de volgende code:
    <Package ...>
    ...
    <Applications>
        <Application Id="PSFSample"
                    Executable="PSFLauncher32.exe"
                    EntryPoint="Windows.FullTrustApplication">
        ...
        </Application>
    </Applications>
    </Package>
    

De toepassing opnieuw verpakken

Nadat u alle correcties hebt toegepast, verpakt u de Windows-app opnieuw in een MSIX en ondertekent u deze met een certificaat voor ondertekening van programmacode.

  1. Open een PowerShell-venster met beheerdersrechten.

  2. Stel de volgende variabelen in:

    $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. Verpak de Windows-app opnieuw vanuit de stagingmap door de volgende PowerShell-cmdlet uit te voeren:

    Set-Location "${env:ProgramFiles(x86)}\Windows Kits\10\Bin\$Win10SDKVersion\$OSArchitecture"
    .\makeappx.exe pack /p "$AppPath" /d "$StagingFolder"
    
  4. Onderteken de Windows-app door de volgende PowerShell-cmdlet uit te voeren:

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