套件支援架構-檔案系統寫入權限修復

調查

Windows Apps 會將與應用程式相關的特定目錄重新導向至 Windows 應用程式容器檔案夾。 如果應用程式嘗試寫入 Windows 應用程式容器,將會觸發錯誤,而且寫入將會失敗。

使用套件支援架構 (.psf) ,您可以對 Windows 應用程式套件進行增強,以解決此問題。 首先,我們必須找出應用程式所要求的失敗和目錄路徑。

捕捉 Windows 應用程式失敗

篩選結果是選擇性步驟,可讓您更輕鬆地查看應用程式相關的失敗。 若要這樣做,我們將建立兩個篩選規則。 第一個包含應用程式進程名稱的篩選,而第二個則是包含任何不成功的結果。

  1. SysInternals 流程監視器 下載並解壓縮至 C:\PSF\ProcessMonitor 目錄。
  2. 開啟 Windows 檔案總管並流覽至解壓縮的 SysInternals 流程監視資料夾
  3. 按兩下 SysInternals 進程監視器 (procmon.exe) 檔案,啟動應用程式。
  4. 如果 UAC 出現提示,請選取 [ 是] 按鈕。
  5. 在 [進程監視器篩選] 視窗中,選取標示為 [ 架構] 的第一個下拉式功能表。
  6. 從下拉式功能表中選取 [ 進程名稱 ]。
  7. 在下一個下拉式功能表中,確認其值設定 為 [是]。
  8. 在 [文字] 欄位中,輸入應用程式的進程名稱 (範例: PSFSample.exe) 。 使用應用程式名稱的進程監視篩選 Windows 範例
  9. 選取 [新增] 按鈕。
  10. 在 [進程監視器篩選] 視窗中,選取標示為 [ 進程名稱] 的第一個下拉式功能表。
  11. 從下拉式功能表中選取 [ 結果 ]。
  12. 在下一個下拉式功能表中,選取它, 然後從下拉式功能表中選取 [否]。
  13. 在 [文字] 欄位中輸入: SUCCESS具有結果的進程監視篩選 Windows 範例
  14. 選取 [新增] 按鈕。
  15. 選取 [ 確定] 按鈕。
  16. 啟動 Windows 應用程式、觸發錯誤,然後關閉 Windows 應用程式。

查看 Windows 應用程式失敗記錄

在捕獲 Windows 的應用程式處理常式之後,必須調查結果,以找出失敗是否與工作目錄相關。

  1. 檢查 SysInternals Process Monitor 結果,並搜尋上表中所述的失敗。
  2. 如果結果顯示「找不到名稱」結果,針對以"C:\Program Files\WindowsApps\...\"以外的目錄為目標的特定應用程式,使用詳細資料「所需的存取: ... 」 (如下圖所示,您已成功識別出與工作) 目錄相關的失敗,請使用.psf 支援檔案系統存取文章,以取得如何將 .psf 更正套用至您的應用程式的指引。 顯示 SysInternals 流程監視器中無法寫入目錄的錯誤訊息目睹。

解決方案

Windows Apps 會將與應用程式相關的特定目錄重新導向至 Windows 應用程式容器檔案夾。 如果應用程式嘗試寫入 Windows 應用程式容器,將會觸發錯誤,而且寫入將會失敗。

若要解決與 Windows 應用程式無法寫入 Windows 應用程式容器相關的問題,我們必須遵循下列四個步驟:

  1. 將 Windows 應用程式暫存至本機目錄
  2. 建立 Config.xml 並插入必要的 .PSF 檔
  3. 更新 Windows 應用程式 package.appxmanifest 檔
  4. 重新封裝和簽署 Windows 應用程式

上述步驟說明如何將 Windows 應用程式的內容解壓縮至本機臨時目錄、將 .psf 修復檔案插入預備的 Windows 應用 Launcher 程式目錄、將應用程式設定為指向 .psf 啟動器,然後設定 .psf 的 config.xml 檔案,以將 .psf 啟動器重新導向至指定工作目錄的應用程式。

下載並安裝必要的工具

此程式將會引導您完成和使用下列工具:

  • NuGet 用戶端工具
  • 套件支援架構
  • Windows 10 SDK (最新版本)
  • SysInternals 進程監視

以下將提供有關下載及安裝必要工具的逐步指引。

  1. 下載NuGet 用戶端工具的最新 (非預覽) 版,並將nuget.exe儲存在資料夾中

  2. 從系統管理 PowerShell 視窗中執行下列程式,以使用 Nuget 下載套件支援架構:

    Set-Location "C:\PSF"
    .\nuget\nuget.exe install Microsoft.PackageSupportFramework
    
  3. 下載並安裝Windows 10 軟體發展工具組 (Win 10 SDK)

    1. 下載「 Win 10 SDK」。
    2. 執行上一個步驟中所下載的 winsdksetup.exe
    3. 選取 [下一步] 按鈕。
    4. 只選取下列三個安裝功能:
      • 適用于桌面應用程式的 Windows SDK 簽署工具
      • UWP c + + 應用程式的 Windows SDK
      • 適用于 UWP 應用程式的 Windwos SDK 當地語系化
    5. 選取 [安裝] 按鈕。
    6. 選取 [ 確定] 按鈕。

暫存 Windows 應用程式

藉由暫存 Windows 應用程式,我們會將 Windows 應用程式的內容解壓縮/解除封裝至本機目錄。 將 Windows 應用程式解壓縮至預備位置之後,就可以插入 .psf 修復檔案,以更正任何不需要的體驗。

  1. 開啟系統管理 PowerShell 視窗。

  2. 設定下列以特定應用程式檔為目標的變數,以及 Windows 10 SDK 版本:

    $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
    
  3. 藉由執行下列 PowerShell Cmdlet,將 Windows 應用程式解壓縮至暫存資料夾:

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

建立並插入所需的 .PSF 檔案

若要將矯正措施套用至 Windows 應用程式,必須建立設定json檔案,並提供失敗的 Windows 應用程式 Launcher 的相關資訊。 如果有多個 Windows 的應用程式啟動器遇到問題,則可以使用多個專案更新config.xml檔案。

更新設定json檔案之後,必須將config.xml檔案和支援的 .psf 修復檔案移至 Windows 應用程式封裝的根目錄中。

  1. 開啟 Visual Studio Code (VS Code) 或任何其他文字編輯器。

  2. 選取 VS Code 頂端的 [檔案] 功能表,然後從下拉式功能表中選取 [新增檔案],以建立新檔案。

  3. 將檔案儲存為config.xml,方法是選取 VS Code 視窗頂端的 [檔案] 功能表,然後從下拉式功能表中選取 [儲存]。 在 [另存新檔] 視窗中,流覽至 Windows 應用程式臨時目錄 (C:\PSF\Staging\PSFSampleApp) 並將檔案名設定為 。 選取 [儲存] 按鈕。

  4. 將下列程式碼複製到新建立的 config.xml 檔案。

    {
        "applications": [
            {
                "id": "",
                "executable": ""
            }
        ],
        "processes": [
            {
                "executable": "",
                "fixups": [
                {
                    "dll": "",
                    "config": {
                        "redirectedPaths": {
                            "packageRelative": [
                                {
                                    "base": "",
                                    "patterns": [
                                        ""
                                    ]
                                }
                            ]
                        }
                    }
                }
            ]
            }
        ]
    }
    
  5. 使用) 或其他文字編輯器,開啟位於 Windows 應用程式暫存資料夾中的暫存 Windows 應用程式package.appxmanifest檔 (C:\PSF\Staging\PSFSampleApp\AppxManifest.xml VS Code。

    <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>
    
  6. applications.idapplications.id中的值設定為與AppxManifest.xml檔案的Applications.Application.ID欄位中所找到的相同值。 影像會在 Package.appxmanifest 檔案中將識別碼的位置圈起來。

  7. 將設定 applications.executable 中的值設為目標applications.executable指向應用程式中的應用程式的相對路徑(位於AppxManifest.xml檔案的應用程式.可執行檔欄位中)。 影像會將可執行檔的位置圈到 Package.appxmanifest 檔中。

  8. 將設定 applications.workingdirectory 中的值設定為,以在AppxManifest.xml檔案的applications.workingdirectory欄位中找到的相對資料夾路徑為目標。 影像會將工作目錄的位置圈到 Package.appxmanifest 檔案內。

  9. 將設定 process.executable 中的值設定為以檔案名 (,而不是在AppxManifest.xml檔的process.executable欄位中找到的路徑和副檔名) 。 影像會將進程可執行檔的位置圈到 Package.appxmanifest 檔中。

  10. processes.fixups.dllprocesses.fixups.dll 中的值設定為以架構特定 FileRedirectionFixup.dll為目標。 如果是針對 x64 架構的更正,請將值設定為 FileRedirectionFixup64.dll。 如果架構為 x86 或不明,請將值設定為 FileRedirectionFixup86.dll

  11. 將設定 processes.fixups.config.redirectedPaths.packageRelative.base 中的值processes.fixups.config.redirectedPaths.packageRelative.base設定為封裝相對資料夾路徑,如同在AppxManifest.xml檔案的應用程式中找到的可執行檔。 影像會將工作目錄的位置圈到 Package.appxmanifest 檔案內。

  12. 設定 processes.fixups.config.redirectedPaths.packageRelative.patternsprocesses.fixups.config.redirectedPaths.packageRelative.patterns 檔案中的值,以符合應用程式所建立的檔案類型。 藉由使用 ". * \.log" ,.psf 將會將所有記錄檔的寫入重新導向至 processes.fixups.config. redirectedPaths. packageRelative 中所識別的目錄,以及子目錄。

  13. 儲存更新的 config.xml 檔案。

    {
        "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"
                                        ]
                                    }
                                ]
                            }
                        }
                    }
                ]
            }
        ]
    }
    
  14. 根據應用程式可執行檔架構,將下列四個檔案從封裝支援架構複製到預備的 Windows 應用程式的根目錄。 下列檔案位於 .\Microsoft.PackageSupportFramework. 中>\Bin 版

    應用程式 (x64) 應用程式 (x86)
    PSFLauncher64.exe PSFLauncher32.exe
    PSFRuntime64.dll PSFRuntime32.dll
    PSFRunDll64.exe PSFRunDll32.exe
    FileRedirectionFixup64.dll FileRedirectionFixup64.dll

更新 Package.appxmanifest

建立和更新config.xml檔案之後,必須針對設定中包含的每個 Windows 應用程式 Launcher 更新 Windows 應用程式的AppxManifest.xmlPackage.appxmanifest的應用程式現在必須將目標設為與應用程式架構相關聯的PSFLauncher.exe

  1. 開啟檔案總管,然後流覽至暫存的 MSIX 應用程式資料夾, (C:\PSF\Staging\PSFSampleApp) 。

  2. 以滑鼠右鍵按一下 AppxManifest.xml,然後從下拉式功能表中選取 [ 開啟檔案程式碼 ] (您也可以選擇使用其他文字編輯器) 來開啟。

  3. 以下列資訊更新 AppxManifest.xml 檔案:

    <Package ...>
    ...
    <Applications>
        <Application Id="PSFSample"
                    Executable="PSFLauncher32.exe"
                    EntryPoint="Windows.FullTrustApplication">
        ...
        </Application>
    </Applications>
    </Package>
    

重新封裝應用程式

所有更正都已套用,現在 Windows 的應用程式可以重新封裝成 MSIX,並使用程式碼簽署憑證進行簽署。

  1. 開啟系統管理 PowerShell 視窗。

  2. 設定下列變數:

    $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. 藉由執行下列 PowerShell Cmdlet,從預備資料夾重新封裝 Windows 應用程式:

    Set-Location "${env:ProgramFiles(x86)}\Windows Kits\10\Bin\$Win10SDKVersion\$OSArchitecture"
    .\makeappx.exe pack /p "$AppPath" /d "$StagingFolder"
    
  4. 藉由執行下列 PowerShell Cmdlet 來簽署 Windows 的應用程式:

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