調査
Windows アプリは、アプリケーションに関連する特定のディレクトリを C:\Program Files\WindowsApps
フォルダーにリダイレクトします。 アプリケーションがインストールの一部としてサブフォルダー (C:\Program Files\Vendor\subfolder
) を作成し、後でこのサブフォルダーを呼び出すと、ディレクトリが存在しないため、ディレクトリの検索に失敗します。
パッケージ サポート フレームワーク (PSF) を使用すると、この問題を解決するために Windows アプリ パッケージを強化できます。 まず、エラーと、アプリによって要求されているディレクトリ パスを特定する必要があります。
Windows アプリのエラーをキャプチャする
結果のフィルター処理は省略可能な手順であり、アプリケーション関連のエラーの表示が容易になります。 これを行うには、2 つのフィルター 規則を作成します。 1 つ目はアプリケーション プロセス名のインクルード フィルターで、2 つ目は成功しなかった結果を含めることです。
- SysInternals プロセス モニターをダウンロードし、C:\PSF\ProcessMonitor ディレクトリに展開します。
- Windows エクスプローラーを開き、抽出された SysInternals プロセス モニター フォルダーに移動します
- SysInternals プロセス モニター (procmon.exe) ファイルをダブルクリックし、アプリを起動します。
- UAC のプロンプトが表示されたら、[ はい ] ボタンを選択します。
- [プロセス モニター フィルター] ウィンドウで、[ アーキテクチャ] というラベルの付いた最初のドロップダウン メニューを選択します。
- ドロップダウン メニューから [プロセス名] を選択します。
- 次のドロップダウン メニューで、is の値が設定されていることを確認します。
- テキスト フィールドに、アプリのプロセス名を入力します (例: PSFSample.exe)。
- [追加] ボタンを選びます。
- プロセス モニター フィルター ウィンドウで、[ プロセス名] というラベルの付いた最初のドロップダウン メニューを選択します。
- ドロップダウン メニューから [結果 ] を選択します。
- 次のドロップダウン メニューを選択し、ドロップダウン メニューから [次の値に一致しない] を選択します。
- テキスト フィールドに「 SUCCESS」と入力します。
- [追加] ボタンを選びます。
- [OK] ボタンを選択します。
- Windows アプリを起動し、エラーをトリガーして、Windows アプリを閉じます。
Windows アプリのエラー ログを確認する
Windows アプリプロセスをキャプチャした後、エラーが作業ディレクトリに関連しているかどうかを特定するために結果を調査する必要があります。
- SysInternals プロセス モニターの結果を確認し、上記の表に記載されているエラーを検索します。
- 結果に "名前が見つかりません" という表示があり、ディレクトリ "C:\Program Files\WindowsApps\..." の外部をターゲットとする特定のアプリの詳細 (例えば "Desired Access: ...") がある場合、作業ディレクトリに関連するエラーが特定されたことになります。その際は、PSF サポート - ファイルシステム アクセス に関する記事を参照し、アプリに PSF 修正を適用するためのガイダンスを得てください。
解決策
Windows アプリは、アプリケーションに関連する特定のディレクトリを C:\Program Files\WindowsApps
フォルダーにリダイレクトします。 アプリケーションがインストールの一部としてサブフォルダー (C:\Program Files\Vendor\subfolder
) を作成し、後でこのサブフォルダーを呼び出すと、ディレクトリが存在しないため、ディレクトリの検索に失敗します。
正しくない作業ディレクトリを参照している Windows アプリに関連する問題を解決するには、次の 4 つの手順に従う必要があります。
- Windows アプリをローカル ディレクトリにステージングする
- Config.json を作成し、必要な PSF ファイルを挿入する
- Windows アプリ AppxManifest ファイルを更新する
- Windows アプリを再パッケージ化して署名する
上記の手順では、Windows アプリのコンテンツをローカルのステージング ディレクトリに抽出し、PSF 修正ファイルをステージングされた Windows アプリ ディレクトリに挿入し、PSF ランチャーを指すアプリケーションランチャーを構成してから、PSF ランチャーを作業ディレクトリを指定するアプリにリダイレクトするように PSF config.json ファイルを構成する方法について説明します。
必要なツールのダウンロードとインストール
このプロセスでは、次のツールの取得と使用について説明します。
- NuGet クライアント ツール
- パッケージ サポート フレームワーク
- Windows 10 SDK (最新バージョン)
- SysInternals プロセス モニター
以下では、必要なツールのダウンロードとインストールに関する詳細なガイダンスを提供します。
NuGet クライアント ツールの最新の (プレビュー以外の) バージョンをダウンロードし、nuget.exe を
C:\PSF\nuget
フォルダーに保存します。管理 PowerShell ウィンドウから次を実行して 、Nuget を使用してパッケージ サポート フレームワークをダウンロードします。
Set-Location "C:\PSF" .\nuget\nuget.exe install Microsoft.PackageSupportFramework
Windows 10 Software Development Toolkit (Win 10 SDK) をダウンロードしてインストールします。
- Win 10 SDK をダウンロードします。
- 前の手順でダウンロードした winsdksetup.exe を実行します。
- [次へ] ボタンを選択します。
- インストールには、次の 3 つの機能のみを選択します。
- デスクトップ アプリ用 Windows SDK 署名ツール
- ユニバーサル Windows プラットフォーム (UWP) C++ アプリ向け Windows SDK
- Windwos SDK for UWP Apps のローカライズ
- [ インストール ] ボタンを選択します。
- [OK] ボタンを選択します。
Windows アプリをステージングする
Windows アプリをステージングすることで、Windows アプリの内容をローカル ディレクトリに抽出/アンパックします。 Windows アプリがステージングの場所に展開されると、PSF Fixup ファイルを挿入して不要なエクスペリエンスを修正できます。
管理 PowerShell ウィンドウを開きます。
特定のアプリ ファイルと 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
次の PowerShell コマンドレットを実行して、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 アプリに適用するには、 config.json ファイルを作成し、失敗した Windows アプリ起動ツールに関する情報を提供する必要があります。 複数の Windows アプリ起動ツールで問題が発生している場合は、 config.json ファイルを複数のエントリで更新できます。
config.json ファイルを更新した後、config.json ファイルと PSF 修正ファイルをサポートする Windows アプリ パッケージのルートに移動する必要があります。
Visual Studio Code (VS Code) またはその他のテキスト エディターを開きます。
VS Code の上部にある [ ファイル ] メニューを選択し、ドロップダウン メニューから [新しいファイル ] を選択して、新しいファイルを作成します。
VS Code ウィンドウの上部にある [ファイル] メニューを選択し、ドロップダウン メニューから [保存] を選択して、ファイルを config.jsonとして保存します。 [名前を付けて保存] ウィンドウで、Windows アプリのステージング ディレクトリ (C:\PSF\Staging\PSFSampleApp) に移動し、 ファイル名 を
config.json
として設定します。 [保存] ボタンを選択します。新しく作成したconfig.jsonファイルに次のコード を コピーします。
{ "applications": [ { "id": "", "executable": "", "workingDirectory": "" } ], "processes": [ { "executable": "" } ] }
VS Code または別のテキスト エディターを使用して、Windows アプリのステージング フォルダー (C:\PSF\Staging\PSFSampleApp\AppxManifest.xml) にあるステージングされた Windows アプリ AppxManifest ファイルを開きます。
<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>
にあるAppxManifest.xml ファイルにある
Package.Applications.Application
フィールドの値を、config.json ファイルの [アプリケーション ID] フィールドにコピーします。にある AppxManifest.xml ファイルにある
Package.Applications.Application
] フィールドから、config.jsonファイルの [アプリケーション実行可能ファイル] フィールドにパッケージ相対パスをコピーします。にある AppxManifest.xml ファイルにある
Package.Applications.Application
] フィールドから、config.jsonファイルの [Applications WorkingDirectory] フィールドにパッケージ相対親パスをコピーします。にある AppxManifest.xml ファイルにある
Package.Applications.Application
] フィールドから、config.jsonファイルの [プロセス実行可能ファイル] フィールドに実行可能ファイル名をコピーします。更新された config.jsonファイルを 保存します。
{ "applications": [ { "id": "PSFSample", "executable": "VFS/ProgramFilesX64/PS Sample App/PSFSample.exe", "workingDirectory": "VFS/ProgramFilesX64/PS Sample App/" } ], "processes": [ { "executable": "PSFSample" } ] }
アプリケーションの実行可能アーキテクチャに基づくパッケージ サポート フレームワークから、ステージングされた Windows アプリのルートに次の 3 つのファイルをコピーします。 次のファイルは 、.\Microsoft.PackageSupportFramework.< 内にあります。バージョン>\bin。
アプリケーション (x64) アプリケーション (x86) PSFLauncher64.exe PSFLauncher32.exe PSFRuntime64.dll PSFRuntime32.dll PSFRunDll64.exe PSFRunDll32.exe
AppxManifest の更新
config.json ファイルを作成して更新した後、config.jsonに含まれていた Windows アプリ起動ツールごとに Windows アプリの AppxManifest.xmlを更新する必要があります。 AppxManifest のアプリケーションは、アプリケーション アーキテクチャに関連付けられている PSFLauncher.exe をターゲットにする必要があります。
エクスプローラーを開き、ステージング MSIX アプリ フォルダー (C:\PSF\Staging\PSFSampleApp) に移動します。
AppxManifest.xmlを右クリックし、ドロップダウン メニューから [コードで開く] を選択します (必要に応じて、別のテキスト エディターで開くことができます)。
AppxManifest.xml ファイルを次の情報で更新します。
<Package ...> ... <Applications> <Application Id="PSFSample" Executable="PSFLauncher32.exe" EntryPoint="Windows.FullTrustApplication"> ... </Application> </Applications> </Package>
アプリケーションを再パッケージ化する
すべての修正が適用され、Windows アプリを MSIX に再パッケージ化し、コード署名証明書を使用して署名できるようになりました。
管理 PowerShell ウィンドウを開きます。
次の変数を設定します。
$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
次の PowerShell コマンドレットを実行して、ステージング フォルダーから Windows アプリを再パックします。
Set-Location "${env:ProgramFiles(x86)}\Windows Kits\10\Bin\$Win10SDKVersion\$OSArchitecture" .\makeappx.exe pack /p "$AppPath" /d "$StagingFolder"
次の PowerShell コマンドレットを実行して、Windows アプリに署名します。
Set-Location "${env:ProgramFiles(x86)}\Windows Kits\10\Bin\$Win10SDKVersion\$OSArchitecture" .\signtool.exe sign /v /fd sha256 /f $CodeSigningCert /p $CodeSigningPass $AppPath