Windows でパッケージ化されたデスクトップ アプリが動作するしくみについてUnderstanding how packaged desktop apps run on Windows

この記事では、デスクトップ アプリケーション用の Windows アプリ パッケージを作成するときに、ファイルとレジストリ エントリに対して何が行われるかについて詳しく説明します。This article provides a deeper dive on what happens to files and registry entries when you create a Windows app package for your desktop application.

最新のパッケージの主な目的は、他のアプリとの互換性を維持しつつ、アプリケーションの状態をシステムの状態からできるだけ分離することです。A key goal of a modern package is to separate application state from system state as much as possible while maintaining compatibility with other apps. Windows 10 ではこれを行うために、アプリケーションが MSIX パッケージ内に配置され、実行時にファイル システムとレジストリに対して行われる変更が検出されて、一部の変更がリダイレクトされます。Windows 10 accomplishes this by placing the application inside a MSIX package, and then detecting and redirecting some changes it makes to the file system and registry at runtime.

デスクトップ アプリケーション用に作成するパッケージは、デスクトップ専用の完全信頼アプリケーションであり、仮想化もサンドボックス化もされません。Packages that you create for your desktop application are desktop-only, full-trust applications and are not virtualized or sandboxed. このため、従来のデスクトップ アプリケーションと同じように、他のアプリとやり取りすることが可能です。This allows them to interact with other apps the same way classic desktop applications do.

インストールInstallation

アプリ パッケージは C:\Program Files\WindowsApps\package_name にインストールされ、実行可能プログラム名は app_name.exe になります。App packages are installed under C:\Program Files\WindowsApps\package_name, with the executable titled app_name.exe. 各パッケージ フォルダーには、パッケージ アプリ用の XML 名前空間を含むマニフェスト (AppxManifest.xml という名前) が含まれています。Each package folder contains a manifest (named AppxManifest.xml) that contains a special XML namespace for packaged apps. マニフェスト ファイル内の <EntryPoint> 要素で、完全信頼アプリを参照します。Inside that manifest file is an <EntryPoint> element, which references the full-trust app. そのアプリケーションは、起動されたときに、アプリ コンテナーの内部では実行されず、ユーザーが通常実行するように実行されます。When that application is launched, it does not run inside an app container, but instead it runs as the user as it normally would.

展開後、パッケージ ファイルは読み取り専用としてマークされ、オペレーティング システムによって厳重にロックダウンされます。After deployment, package files are marked read-only and heavily locked down by the operating system. これらのファイルが改ざんされると、Windows によりアプリの起動が回避されます。Windows prevents apps from launching if these files are tampered with.

ファイル システムFile system

OS では、フォルダーの場所に応じて、パッケージ デスクトップ アプリケーションに対してさまざまなレベルのファイル システム操作がサポートされます。The OS supports different levels of file system operations for packaged desktop applications, depending on the folder location.

Windows 10 バージョン 1903 以降の AppData 操作AppData operations on Windows 10, version 1903 and later

ユーザーの AppData フォルダー (例: C:\Users\user_name\AppData) に新しく作成されたすべてのファイルとフォルダーは、ユーザーごと、アプリごとのプライベートな場所に書き込まれますが、実際の AppData の場所に表示されるように、実行時にマージされます。All newly created files and folders in the user's AppData folder (e.g., C:\Users\user_name\AppData) are written to a private per-user, per-app location but merged at runtime to appear in the real AppData location. これにより、アプリケーション自体によってのみ使用される成果物に対して、ある程度の状態の分離が可能になり、アプリケーションのアンインストール時に、システムでそれらのファイルをクリーンアップできるようになります。This allows some degree of state separation for artifacts that are only used by the application itself, and this enables the system to clean up those files when the application is uninstalled. ユーザーの AppData フォルダーにある既存のファイルに変更を加えることによって、アプリケーションと OS の間でより高いレベルの互換性と対話機能を提供できるようになります。Modifications to existing files under the user's AppData folder is allowed to provide a higher degree of compatibility and interactivity between applications and the OS. これにより、アプリケーションによって行われるすべてのファイルまたはディレクトリの変更が OS に認識されるため、ファイル システムの "劣化" が抑えられます。This reduces filesystem “rot” because the OS is aware of every file or directory change made by an application. また、状態を分離することで、パッケージ化したデスクトップ アプリケーションでは、同じアプリケーションのパッケージ化されていないバージョンが停止した場所から開始することもできます。State separation also allows packaged desktop applications to pick up where a non-packaged version of the same application left off. 仮想ファイル システム (VFS) フォルダーは、ユーザーの AppData フォルダーとして OS でサポートされていないことにご注意ください。Note that the OS does not support a virtual file system (VFS) folder for the user's AppData folder.

Windows 10 バージョン 1809 以前での AppData 操作AppData operations on Windows 10, version 1809 and earlier

作成、削除、更新など、ユーザーの AppData フォルダー (例: C:\Users\user_name\AppData) に対する書き込みはすべて、書き込み時にユーザーごと、アプリごとのプライベートな場所にコピーされます。All writes to the user's AppData folder (e.g., C:\Users\user_name\AppData), including create, delete, and update, are copied on write to a private per-user, per-app location. つまり、パッケージ化したアプリケーションで実際の AppData への編集を行っているように見えても、実際に行われているのはプライベート コピーへの変更です。This creates the illusion that the packaged application is editing the real AppData when it is actually modifying a private copy. このように書き込みのリダイレクトを行うことで、アプリによって行われたすべてのファイル変更をシステムで追跡できます。By redirecting writes this way, the system can track all file modifications made by the app. これにより、アプリケーションのアンインストール時にシステムがそれらのファイルをクリーンアップできるため、システムの "劣化" を抑え、ユーザーから見たアプリケーション削除の操作を改善することができます。This allows the system to clean up those files when the application is uninstalled, thus reducing system "rot" and providing a better application removal experience for the user.

その他のフォルダーOther folders

AppData のリダイレクトに加えて、Windows の既知のフォルダー (System32、Program Files (x86) など) がアプリ パッケージ内の対応するディレクトリに動的にマージされます。In addition to redirecting AppData, Windows' well-known folders (System32, Program Files (x86), etc) are dynamically merged with corresponding directories in the app package. それぞれのパッケージのルート ディレクトリには、"VFS" という名前のフォルダーが含まれています。Each package contains a folder named "VFS" at its root. この VFS ディレクトリ内のディレクトリまたはファイルに対する読み取り操作は、実行時にそれぞれ対応するネイティブ部分にマージされます。Any reads of directories or files in the VFS directory are merged at runtime with their respective native counterparts. たとえば、アプリケーション パッケージに C:\Program Files\WindowsApps\package_name\VFS\SystemX86\vc10.dll が含まれている場合、このファイルは C:\Windows\System32\vc10.dll にインストールされているように表示されます。For example, an application could contain C:\Program Files\WindowsApps\package_name\VFS\SystemX86\vc10.dll as part of its app package, but the file would appear to be installed at C:\Windows\System32\vc10.dll. これにより、ファイルがパッケージ外の場所にあることを想定しているデスクトップ アプリケーションとの互換性が維持されます。This maintains compatibility with desktop applications that may expect files to live in non-package locations.

アプリ パッケージ内のファイルまたはフォルダーへの書き込みは、許可されていません。Writes to files/folders in the app package are not allowed. パッケージに含まれないファイルやフォルダーへの書き込みは、OS では無視され、ユーザーにアクセス許可があれば許可されます。Writes to files and folders that are not part of the package are ignored by the OS and are allowed as long as the user has permission.

一般的な操作Common operations

一般的なファイル システム操作と OS での処理方法を以下の表に示します。This short reference table shows common file system operations and how the OS handles them.

操作Operation 結果Result Example
既知の Windows ファイルまたはフォルダーに対する読み取りまたは列挙Read or enumerate a well-known Windows file or folder C:\Program Files\package_name\VFS\well_known_folder がローカル システムの対応部分に動的にマージされます。A dynamic merge of C:\Program Files\package_name\VFS\well_known_folder with the local system counterpart. C:\Windows\System32 の読み取りでは、C:\Windows\System32 の内容と C:\Program Files\WindowsApps\package_name\VFS\SystemX86 の内容が返されます。Reading C:\Windows\System32 returns the contents of C:\Windows\System32 plus the contents of C:\Program Files\WindowsApps\package_name\VFS\SystemX86.
AppData 内の書き込みWrite under AppData Windows 10 バージョン 1903 以降: 次のディレクトリの下に作成された新しいファイルとフォルダーは、ユーザーごと、パッケージごとのプライベートな場所にリダイレクトされます。Windows 10, version 1903 and later: New files and folders created under the following directories are redirected to a per-user, per-package private location:
  • ローカルLocal
  • Local\MicrosoftLocal\Microsoft
  • ローミングRoaming
  • Roaming\MicrosoftRoaming\Microsoft
  • Roaming\Microsoft\Windows\Start Menu\ProgramsRoaming\Microsoft\Windows\Start Menu\Programs
ファイルを開くコマンドに応答して、OS によってユーザーごと、パッケージごとの場所から最初にファイルが開かれます。In response to a file open command, the OS will open the file from the per-user, per-package location first. この場所が存在しない場合、OS では実際の AppData の場所からファイルを開こうと試みられます。If this location doesn't exist, the OS will attempt to open the file from the real AppData location. ファイルが実際の AppData の場所から開かれた場合、そのファイルの仮想化は実行されません。If the file is opened from the real AppData location, no virtualization for that file occurs. ユーザーにアクセス許可がある場合は、AppData の下でのファイルの削除が許可されます。File deletes under AppData are allowed if user has permissions.

Windows 10 バージョン 1809 以前: 書き込み時に、ユーザーごと、アプリごとの場所にコピーされます。Windows 10, version 1809 and earlier: Copy-on-written to a per-user, per-app location.

AppData は通常、C:\Users\user_name\AppData です。AppData is typically C:\Users\user_name\AppData.
パッケージ内の書き込みWrite inside the package 許可しない。Not allowed. パッケージは読み取り専用です。The package is read-only. C:\Program Files\WindowsApps\package_name 内の書き込みは、許可されていません。Writes under C:\Program Files\WindowsApps\package_name are not allowed.
パッケージ外の書き込みWrites outside the package ユーザーにアクセス許可があれば、許可されます。Allowed if the user has permissions. C:\Windows\System32\foo.dll への書き込みは、パッケージに C:\Program Files\WindowsApps\package_name\VFS\SystemX86\foo.dll が含まれておらずユーザーにアクセス許可があれば許可されます。A write to C:\Windows\System32\foo.dll is allowed if the package does not contain C:\Program Files\WindowsApps\package_name\VFS\SystemX86\foo.dll and the user has permissions.

パッケージ化された VFS の場所Packaged VFS locations

次の表は、パッケージの一部として含まれるファイルが、システム上でアプリのためにどのように配置されるかを示しています。The following table shows where files shipping as part of your package are overlaid on the system for the app. これらのファイルは、アプリケーションではここに示されているシステム内の場所にあると認識されますが、実際にはリダイレクトされており、C:\Program Files\WindowsApps\package_name\VFS 内の場所に配置されます。Your application will perceive these files to be in the listed system locations, when in fact they are in the redirected locations inside C:\Program Files\WindowsApps\package_name\VFS. FOLDERID の場所は KNOWNFOLDERID 定数で示されます。The FOLDERID locations are from the KNOWNFOLDERID constants.

システムの場所System Location リダイレクトされた場所 ([PackageRoot]\VFS\ の下)Redirected Location (Under [PackageRoot]\VFS) 有効なアーキテクチャValid on architectures
FOLDERID_SystemX86FOLDERID_SystemX86 SystemX86SystemX86 x86、amd64x86, amd64
FOLDERID_SystemFOLDERID_System SystemX64SystemX64 amd64amd64
FOLDERID_ProgramFilesX86FOLDERID_ProgramFilesX86 ProgramFilesX86ProgramFilesX86 x86、amd64x86, amd6
FOLDERID_ProgramFilesX64FOLDERID_ProgramFilesX64 ProgramFilesX64ProgramFilesX64 amd64amd64
FOLDERID_ProgramFilesCommonX86FOLDERID_ProgramFilesCommonX86 ProgramFilesCommonX86ProgramFilesCommonX86 x86、amd64x86, amd64
FOLDERID_ProgramFilesCommonX64FOLDERID_ProgramFilesCommonX64 ProgramFilesCommonX64ProgramFilesCommonX64 amd64amd64
FOLDERID_WindowsFOLDERID_Windows WindowsWindows x86、amd64x86, amd64
FOLDERID_ProgramDataFOLDERID_ProgramData 一般的な AppDataCommon AppData x86、amd64x86, amd64
FOLDERID_System\catrootFOLDERID_System\catroot AppVSystem32CatrootAppVSystem32Catroot x86、amd64x86, amd64
FOLDERID_System\catroot2FOLDERID_System\catroot2 AppVSystem32Catroot2AppVSystem32Catroot2 x86、amd64x86, amd64
FOLDERID_System\drivers\etcFOLDERID_System\drivers\etc AppVSystem32DriversEtcAppVSystem32DriversEtc x86、amd64x86, amd64
FOLDERID_System\driverstoreFOLDERID_System\driverstore AppVSystem32DriverstoreAppVSystem32Driverstore x86、amd64x86, amd64
FOLDERID_System\logfilesFOLDERID_System\logfiles AppVSystem32LogfilesAppVSystem32Logfiles x86、amd64x86, amd64
FOLDERID_System\spoolFOLDERID_System\spool AppVSystem32SpoolAppVSystem32Spool x86、amd64x86, amd64

RegistryRegistry

アプリ パッケージには、registry.dat ファイルが含まれています。このファイルは、実際のレジストリ内の HKLM\Software に論理的に対応しています。App packages contain a registry.dat file, which serves as the logical equivalent of HKLM\Software in the real registry. 実行時には、この仮想レジストリのハイブの内容がネイティブ システム ハイブにマージされ、両方が一括して表示されます。At runtime, this virtual registry merges the contents of this hive into the native system hive to provide a singular view of both. たとえば、registry.dat に単一のキー "Foo" が含まれている場合、実行時に HKLM\Software を読み取ると、(すべてのネイティブ システム キーに加えて) "Foo" も含まれているように表示されます。For example, if registry.dat contains a single key "Foo", then a read of HKLM\Software at runtime will also appear to contain "Foo" (in addition to all the native system keys).

パッケージに含まれる部分は HKLM\Software 以下のキーのみです。HKCU 以下のキーやレジストリの他の部分は、パッケージに含まれていません。Only keys under HKLM\Software are part of the package; keys under HKCU or other parts of the registry are not. パッケージ内のキーまたは値への書き込みは許可されていません。Writes to keys or values in the package are not allowed. パッケージに含まれないキーまたは値への書き込みは、ユーザーにそのアクセス許可があれば許可されます。Writes to keys or values not part of the package are allowed as long as the user has permission.

HKCU 以下の書き込みはすべて、書き込み時にユーザーごと、アプリごとのプライベートな場所にコピーされます。All writes under HKCU are copy-on-written to a private per-user, per-app location. 従来、ログアウトしたユーザーのレジストリ データはマウント解除され使用できなくなるため、アンインストーラーが HKEY_CURRENT_USER をクリーンアップできませんでした。Traditionally, uninstallers are unable to clean HKEY_CURRENT_USER because the registry data for logged out users is unmounted and unavailable.

書き込みはすべて、パッケージのアップグレード中には保持され、アプリケーションが完全に削除された場合にのみ削除されます。All writes are kept during package upgrade and only deleted when the application is removed entirely.

一般的な操作Common operations

一般的なレジストリ操作と OS での処理方法を以下の表に示します。This short reference table shows common registry operations and how the OS handles them.

操作Operation 結果Result Example
HKLM\Software に対する読み取りまたは列挙Read or enumerate HKLM\Software パッケージのハイブがローカル システムの対応部分に動的にマージされます。A dynamic merge of the package hive with the local system counterpart. registry.dat に単一のキー "Foo" が含まれている場合、実行時に HKLM\Software を読み取ると、HKLM\SoftwareHKLM\Software\Foo の内容がどちらも表示されます。If registry.dat contains a single key "Foo," at runtime a read of HKLM\Software will show the contents of both HKLM\Software plus HKLM\Software\Foo.
HKCU 以下の書き込みWrites under HKCU 書き込み時に、ユーザーごと、アプリごとのプライベートな場所にコピーされます。Copy-on-written to a per-user, per-app private location. ファイルの AppData と同じです。The same as AppData for files.
パッケージ内の書き込みWrites inside the package. 許可しない。Not allowed. パッケージは読み取り専用です。The package is read-only. 対応するキー/値がパッケージ ハイブに存在する場合、HKLM\Software 以下の書き込みは許可されません。Writes under HKLM\Software are not allowed if a corresponding key/value exist in the package hive.
パッケージ外の書き込みWrites outside the package OS では無視されます。Ignored by the OS. ユーザーにアクセス許可があれば、許可されます。Allowed if the user has permissions. HKLM\Software 以下の書き込みは、対応するキー/値がパッケージに含まれておらずユーザーに適切なアクセス許可があれば許可されます。Writes under HKLM\Software are allowed as long as a corresponding key/value does not exist in the package hive and the user has the correct access permissions.

アンインストールUninstallation

パッケージがユーザーによってアンインストールされると、C:\Program Files\WindowsApps\package_name の下にあるすべてのファイルとフォルダーが削除されます。また、パッケージ化処理中にキャプチャされた、AppData またはレジストリに対するリダイレクトされた書き込みも削除されます。When a package is uninstalled by the user, all files and folders located under C:\Program Files\WindowsApps\package_name are removed, as well as any redirected writes to AppData or the registry that were captured during the packaging process.