Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.
Laden Sie den SysInternals-Prozessmonitor herunter, und extrahieren Sie es in das Verzeichnis "C:\PSF\ProcessMonitor" .
Öffnen Sie Windows Explorer, und navigieren Sie zum extrahierten SysInternals ProcessMonitor-Ordner .
Wählen Sie die SysInternals-Prozessüberwachung procmon.exe Datei aus, um die App zu starten.
Wenn Sie von der UAC aufgefordert werden, wählen Sie "Ja" aus.
Wählen Sie im Fenster "Prozessüberwachungsfilter " im Dropdownmenü des ersten Felds " Prozessname " aus.
Stellen Sie sicher, dass ist im nächsten Feld angezeigt wird.
Geben Sie im nächsten Feld den Prozessnamen Ihrer App ein, z. B. PSFSample.exe.
Wählen Sie "Hinzufügen" aus.
Wählen Sie im Fenster "Prozessüberwachungsfilter " im Dropdownmenü des ersten Felds " Ergebnis " aus.
Im nächsten Feld wählen Sie ist nicht aus dem Dropdownmenü.
Geben Sie im Textfeld SUCCESS ein.
Wählen Sie "Hinzufügen" und dann "OK" aus.
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.
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:
- Extrahieren Sie den Inhalt der Windows-App in ein lokales Staging-Verzeichnis.
- Erstellen Sie eine config.json, und fügen Sie die PSF-Fixupdateien in das mehrstufige Windows-App-Verzeichnis ein.
- 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.
- Aktualisieren Sie die Datei "AppxManifest" der Windows-App.
- 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:
Laden Sie die neueste Nichtvorschauversion des NuGet-Clienttools herunter, und speichern Sie nuget.exe in C:\PSF\nuget.
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:
- Laden Sie das Win 10 SDK herunter.
- Führen Sie winsdksetup.exe aus.
- Wählen Sie "Weiter" aus.
- 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
- 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.
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
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.
Öffnen Sie Visual Studio Code oder einen anderen Text-Editor.
Erstellen Sie eine neue Datei namens config.json im Windows-App-Stagingverzeichnis C:\PSF\Staging\PSFSampleApp.
Kopieren Sie den folgenden Code in die neu erstellte config.json Datei.
{ "applications": [ { "id": "", "executable": "" } ], "processes": [ { "executable": "", "fixups": [ { "dll": "", "config": { "redirectedPaths": { "packageRelative": [ { "base": "", "patterns": [ "" ] } ] } } } ] } ] }
Ö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>
Nehmen Sie die folgenden Änderungen in der dateiconfig.json vor:
Legen Sie den
applications.id
Wert auf denselben Wert fest wie imApplications.Application.ID
Feld der AppxManifest.xml Datei.Legen Sie den
applications.executable
Wert fest, um den relativen Pfad zu der Anwendung anzugeben, die sich imApplications.Application.Executable
Feld der DateiAppxManifest.xml befindet.Legen Sie den
applications.workingdirectory
Wert auf den relativen Ordnerpfad imApplications.Application.Executable
Feld der AppxManifest.xml-Datei fest.Legen Sie den
process.executable
Wert im FeldApplications.Application.Executable
der AppxManifest.xml Datei auf den Dateinamen ohne Pfad und Erweiterung fest.Legen Sie den
processes.fixups.dll
-Wert fest, um auf das architekturspezifischeFileRedirectionFixup.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 imApplications.Application.Executable
Feld der AppxManifest.xml Datei fest.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 improcesses.fixups.config.redirectedPaths.packageRelative.base
Verzeichnis und dessen Unterverzeichnissen um.
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" ] } ] } } } ] } ] }
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.
- Öffnen Sie AppxManifest.xml im mehrstufigen MSIX-App-Ordner C:\PSF\Staging\PSFSampleApp.
- 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.
Öffnen Sie ein PowerShell-Verwaltungsfenster.
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
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"
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