Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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.
Download en pak SysInternals Process Monitor uit in de map C:\PSF\ProcessMonitor.
Open Windows Verkenner en navigeer naar de uitgepakte map SysInternals ProcessMonitor .
Selecteer het bestand SysInternals Process Monitor procmon.exe om de app te starten.
Als u hierom wordt gevraagd door UAC, selecteert u Ja.
Selecteer in het venster Procescontrolefilterprocesnaam in het vervolgkeuzemenu van het eerste veld.
Controleer of is weergegeven wordt in het volgende veld.
Voer in het volgende veld de procesnaam van uw app in, bijvoorbeeld PSFSample.exe.
Selecteer Toevoegen.
Selecteer in het venster Filter voor procescontroleresultaat in het vervolgkeuzemenu van het eerste veld.
Selecteer in het volgende veld is niet in de vervolgkeuzelijst.
Voer GESLAAGD in het tekstveld in.
Selecteer Toevoegen en selecteer vervolgens OK.
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.
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:
- Pak de inhoud van de Windows-app uit naar een lokale testmap.
- Maak een config.json en injecteer de PSF-fixupbestanden in de geprepareerde map van de Windows-app.
- 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.
- Werk het Windows-app AppxManifest-bestand bij.
- 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:
Download de nieuwste niet-preview-versie van het NuGet-clienthulpprogramma en sla nuget.exe op in C:\PSF\nuget.
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:
- Download de Win 10 SDK.
- Voer winsdksetup.exe uit.
- Selecteer Volgende.
- 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
- 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.
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
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.
Open Visual Studio Code of een andere teksteditor.
Maak een nieuw bestand met de naam config.json in de faseringsmap van de Windows-app, C:\PSF\Staging\PSFSampleApp.
Kopieer de volgende code naar het zojuist gemaakte config.json-bestand .
{ "applications": [ { "id": "", "executable": "" } ], "processes": [ { "executable": "", "fixups": [ { "dll": "", "config": { "redirectedPaths": { "packageRelative": [ { "base": "", "patterns": [ "" ] } ] } } } ] } ] }
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>
Breng de volgende wijzigingen aan in het bestandconfig.json :
Stel de
applications.id
waarde in op dezelfde waarde als in hetApplications.Application.ID
veld van het AppxManifest.xml-bestand .Stel in de
applications.executable
-waarde het relatieve pad naar de toepassing in, dat zich in hetApplications.Application.Executable
-veld van het AppxManifest.xml-bestand bevindt.Stel de
applications.workingdirectory
waarde in om het relatieve mappad te richten in hetApplications.Application.Executable
veld van het AppxManifest.xml-bestand .Stel de
process.executable
waarde in op de bestandsnaam, zonder pad en extensie, in hetApplications.Application.Executable
veld van het AppxManifest.xml-bestand .Stel de
processes.fixups.dll
waarde in om de architectuurspecifiekeFileRedirectionFixup.dll
te richten. Als de correctie voor x64-architectuur is, stelt u de waarde in opFileRedirectionFixup64.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 hetApplications.Application.Executable
veld van het AppxManifest.xml-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 deprocesses.fixups.config.redirectedPaths.packageRelative.base
map en onderliggende mappen.
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" ] } ] } } } ] } ] }
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.
- Open AppxManifest.xml in de map met gefaseerde MSIX-apps, C:\PSF\Staging\PSFSampleApp.
- 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.
Open een PowerShell-venster met beheerdersrechten.
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
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"
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