MSIX 影响实际注册表的机制(清单声明与虚拟注册表) 一、虚拟注册表的文件构成MSIX 虚拟注册表的本质是一个标准的.dathive 文件在运行时通过内核 CM 过滤器与实际系统注册表进行动态合并。registry.dat映射到HKLM\SoftwareUser.dat映射到HKCU\Software运行时写入则通过 Copy-on-Write 机制存入用户私有位置从而实现应用隔离与干净卸载的目标。MSIX 包中的虚拟注册表以标准的 Windows 注册表 hive 二进制格式.dat文件存储最多包含三个文件文件对应实际注册表位置说明registry.datHKLM\Software核心文件存储机器级别配置User.datHKCU\Software存储当前用户级别配置可选User.Classes.datHKCU\Software\Classes存储用户级 COM 类注册信息可选这些.dat文件内部有一个名为REGISTRY的根键其下包含MACHINE和USER两个子键分别对应实际系统中的HKLM和HKCU。MSIX 虚拟注册表的核心设计思想是分层合并layered merge。当应用启动时操作系统会将包内的registry.dat作为应用配置单元Application Hive加载到容器进程中在运行时将其内容动态合并到实际系统注册表之上形成统一的视图合并的优先级层级从低到高为系统实际注册表底层 ↓ 合并 包内 registry.dat中间层 ↓ 合并 运行时写入的私有 Hive顶层Copy-on-Write例如如果registry.dat中包含一个键HKLM\Software\Foo应用在运行时读取HKLM\Software时会同时看到系统原有的所有键加上Foo。二、清单声明需参考 应用包清单(AppxManifest.xml与Package.appxmanifest)manifest.xml什么用-CSDN博客MSIX清单实际写入注册表位置以及对比原始win32程序注册表注而Package/ComExtensions与Package/Extensions、 Package/Applications/Application/Extensions 功能上相同作用范围不同清单扩展类别实际清单标签功能说明MSIX 部署真实写入位置等价非 MSIX传统 Win32注册位置windows.comServercom:Extension Categorywindows.comServer将包内 COM 类CLSID、ProgID、TreatAs、OLE 文档服务器等以进程外OOP或进程内方式暴露给系统HKCR\PackagedCom\Package\PFN\CLSID含LocalServer32、InprocServer32、ProgId、TreatAs等子键AppId、Server同级子键HKCR\CLSID\{CLSID}HKCR\AppID\{AppID}由regsvr32/regasm等直接写入全局 Hivewindows.comInterfacecom:Extension Categorywindows.comInterface注册 COM 接口IID、类型库TypeLib和代理/存根ProxyStubHKCR\PackagedCom\Package\PFN\InterfaceTypeLibProxyStub同级子键HKCR\Interface\{IID}含NumMethods、ProxyStubClsid32HKCR\TypeLib\{TLBID}由regsvr32/oleaut32注册windows.fileTypeAssociationuap:Extension Categorywindows.fileTypeAssociation声明应用可处理特定文件扩展名如.pdfHKCR\.ext默认值指向包内 ProgIDHKCR\PackagedCom\Package\PFN下的上下文菜单处理程序 Shell 关联数据库更新HKCR\.ext默认值指向全局 ProgIDHKCR\ProgID\shell\open\commandHKCR\SystemFileAssociations\.extwindows.protocoluap:Extension Categorywindows.protocol声明应用可处理特定 URI 协议方案如myapp://HKCR\protocol含URL Protocol值激活目标指向 PackagedCom 路由 Shell 协议关联数据库HKCR\protocol含URL Protocol值 shell\open\command直接指向可执行文件路径windows.autoPlayContentuap:Extension Categorywindows.autoPlayContent将应用注册为 AutoPlay 内容事件处理程序当用户插入含特定内容如相机照片、音乐文件的可移动介质时系统将该应用作为自动播放选项展示HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\Handlers\HandlerNameAction、Provider、DefaultContent等值同上路径由应用安装程序或手动注册写入结构相同windows.autoPlayDeviceuap:Extension Categorywindows.autoPlayDevice将应用注册为 AutoPlay 设备事件处理程序当特定硬件设备如 WPD 便携设备连接时系统将该应用作为自动播放选项展示HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\Handlers\HandlerName 设备元数据关联同上路径由驱动安装包或应用安装程序写入windows.shareTargetuap:Extension Categorywindows.shareTarget声明应用可作为 Windows 共享契约Share Contract的目标当用户通过系统共享面板分享数据时该应用出现在共享目标列表中HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AppContract\Windows.ShareTarget\PFN 系统 Share 契约服务数据库无直接等价项传统 Win32 通过注册IDropTarget/IExplorerCommandCOM 对象 Shell 上下文菜单扩展模拟windows.servicedesktop6:Extension Categorywindows.service将包内可执行文件注册为 Windows 系统服务使该程序能以服务模式开机自启、后台运行、SCM 管理在系统启动时自动运行HKLM\SYSTEM\CurrentControlSet\Services\ServiceNameImagePath、Start、Type等由包安装器在服务控制管理器中创建同上路径由sc.exe create、InstallUtil、CreateServiceAPI 创建windows.appExtensionuap3:Extension Categorywindows.appExtension将应用声明为插件提供者通过AppExtensionCatalogAPI 实现应用间插件发现与通信支持包间松耦合的扩展架构包私有 Hive不写入全局注册表扩展元数据由AppExtensionCatalogAPI 通过系统目录服务在包间发现无直接等价项传统 Win32 通过 COM 组件注册 应用自定义注册表键 插件目录文件发现实现windows.searchFilterHandlerdesktop2:Extension Categorywindows.searchFilterHandler注册 IFilter COM 实现使 Windows Search 索引服务能提取特定文件格式的文本内容和属性进行全文搜索索引自 Win10 1809 / Win11 22H2 起桌面桥应用不再支持此扩展HKCR\PackagedCom\Package\PFN\CLSIDIFilter COM 类注册 包私有 Hive 中的 IFilter 实现绑定信息HKCR\CLSID\{CLSID}IFilter COM 类HKLM\...\ContentIndex\{PersistentHandler}链windows.appExecutionAliasuap3:Extension Categorywindows.appExecutionAlias/uap5:Extension Categorywindows.appExecutionAlias为包内可执行文件创建命令行别名使用户可在 cmd、PowerShell、运行对话框中通过短名称如python.exe直接启动打包应用文件系统重解析点%ProgramFiles%\WindowsApps\Microsoft\WindowsApps\alias.exe由包部署引擎创建指向包内可执行入口无直接等价项传统 Win32 通过HKLM\...\App Paths\app.exe 手动将目录加入%PATH%实现RegistryWriteVirtualizationdesktop6:RegistryWriteVirtualization(位于Properties下)控制包对HKLM\Software等受保护注册表路径的写入行为enabled默认时写入被重定向到包私有层实现隔离disabled时写入穿透到物理 Hive非注册表写入项——包清单属性控制 CM 合并过滤器Composition/Merge Filter对HKLM\Software的虚拟化拦截策略无等价项传统 Win32 应用直接读写物理注册表不存在虚拟化层写入 HKCR\PackagedCom 的扩展全局可见1.windows.comServer写入PackagedCom\Package\包全名\CLSID、AppId、Server三个子树。支持多种服务器类型子元素传统注册表对应说明com:ExeServerHKCR\CLSID\{...}\LocalServer32AppID进程外 .exe 服务器com:SurrogateServerHKCR\CLSID\{...}\InprocServer32 dllsurrogate由 dllhost.exe 托管的 DLLcom4:InProcessServerHKCR\CLSID\{...}\InprocServer32 包内 DLL 路径原生进程内服务器com4 新增com4:ManagedInProcessServer.NET COM 注册Assembly/Class/CodeBase托管 .NET 进程内服务器com4 新增com:ProgIdHKCR\ProgId\CLSID程序标识符注册com:TreatAsClassHKCR\CLSID\{...}\TreatAs类重定向com:Class的 OLE 属性Insertable、MiscStatus、Verb、AuxUserType、DefaultIcon等OLE 文档服务器支持2.windows.comInterface声明 COM 接口和类型库信息写入PackagedCom\Package\包全名\Interface和TypeLib子树。com:Extension Categorywindows.comInterface com:ComInterface !-- 接口注册 → 对应 HKCR\Interface\{IID} -- com:Interface Id0BDD0E81-... UseUniversalMarshalertrue com:TypeLib Id4B115284-... VersionNumber1.0 / /com:Interface !-- 类型库注册 → 对应 HKCR\TypeLib\{TLBID} -- com:TypeLib Id4B115284-... com:Version DisplayNameMyLib VersionNumber1.0 com:Win32Path PathMyLib.tlb / /com:Version /com:TypeLib !-- ProxyStub 注册 → 对应 HKCR\Interface\{IID}\ProxyStubClsid32 -- com:ProxyStub Id... DisplayNameMyProxyStub com:Path PathMyProxyStub.dll / /com:ProxyStub /com:ComInterface /com:Extension实际注册表映射PackagedCom\Package\包全名\ ├── Interface │ └── {0BDD0E81-...} │ ├── (Default) IDualAClick │ ├── ProxyStubClsid32 {00020424-...} (或自定义) │ └── TypeLib {4B115284-...} ├── TypeLib │ └── {4B115284-...} │ └── 1.0 │ ├── (Default) MyLib │ ├── 0\win32 包路径\MyLib.tlb │ └── FLAGS 0 └── ProxyStub └── {自定义GUID} └── Path 包路径\MyProxyStub.dll3.windows.fileTypeAssociation声明文件扩展名关联部署引擎将其写入PackagedCom目录下的文件关联索引同时系统 Shell 会据此在HKCR\.ext下建立关联。uap:Extension Categorywindows.fileTypeAssociation uap:FileTypeAssociation Namemydoc uap:SupportedFileTypes uap:FileType.myext/uap:FileType /uap:SupportedFileTypes /uap:FileTypeAssociation /uap:Extension影响注册表HKCR\.myext→ 默认值指向包的 ProgIDHKCR\PackagedCom\Package\包全名\FileTypeAssociation\→ 包内部索引Shell 的 打开方式 数据库HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.myext4.windows.protocol声明自定义 URI 协议处理程序写入PackagedCom目录及 Shell 协议关联。uap:Extension Categorywindows.protocol uap:Protocol Namemyapp uap:DisplayNameMy App Protocol/uap:DisplayName /uap:Protocol /uap:Extension影响注册表HKCR\myapp→ Shell 协议注册HKCR\PackagedCom\Package\包全名\Protocol\→ 包内部索引HKCU\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\myapp\→ 用户选择5.windows.autoPlayContent/windows.autoPlayDevice注册自动播放处理程序写入HKCR\PackagedCom下的自动播放索引以及系统的 AutoPlay 处理程序注册表。uap:Extension Categorywindows.autoPlayContent uap:AutoPlayContent uap:LaunchAction Verbimport ActionDisplayNameImport Photos ContentEventShowPicturesOnArrival / /uap:AutoPlayContent /uap:Extension影响注册表HKCR\PackagedCom\Package\包全名\AutoPlay\→ 包内部索引HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\AutoplayHandlers\→ 系统自动播放处理程序6.windows.shareTarget注册为 Windows 共享目标写入PackagedCom下的共享目标索引。uap:Extension Categorywindows.shareTarget uap:ShareTarget uap:SupportedFileTypes uap:SupportsAnyFileType / /uap:SupportedFileTypes uap:DataFormatBitmap/uap:DataFormat /uap:ShareTarget /uap:Extension影响注册表HKCR\PackagedCom\Package\包全名\ShareTarget\→ 包内部索引系统共享契约数据库写入 HKLM\SYSTEM 的扩展系统级服务7.windows.servicedesktop6 命名空间这是唯一直接写入系统服务注册表的扩展需要packagedServices受限能力。desktop6:Extension Categorywindows.service desktop6:Service NameMyService StartupTypeauto StartAccountlocalSystem desktop6:ExecutableServices\MyService.exe/desktop6:Executable /desktop6:Service /desktop6:Extension实际写入位置HKLM\SYSTEM\CurrentControlSet\Services\MyService ├── Type 0x10 (WIN32_OWN_PROCESS) ├── Start 2 (AUTO_START) ├── ImagePath 包路径\Services\MyService.exe ├── ObjectName LocalSystem ├── DisplayName MyService └── PackageFullName 包全名 (标记为打包服务)⚠️ 这是 MSIX 中唯一直接修改 HKLM 非 PackagedCom 区域的扩展卸载时由部署引擎自动清理。三、写入包私有 Hive 的扩展仅包内可见以下扩展的注册信息存储在包内的registry.dat中运行时通过 CM 过滤器合并到进程视图中外部进程不可见。8.windows.appExtension注册应用扩展宿主关系信息存储在包私有 Hive 中。uap3:Extension Categorywindows.appExtension uap3:AppExtension Namecom.example.myext IdmyExtension DisplayNameMy Extension uap3:Properties streamExtensions\myext.xml/stream /uap3:Properties /uap3:AppExtension /uap3:Extension9.windows.searchFilterHandler注册 Windows 搜索筛选处理程序基于 IFilter 接口信息写入包私有 Hive。uap:Extension Categorywindows.searchFilterHandler uap:SearchFilterHandler uap:SupportedFileTypes uap:FileType.custom/uap:FileType /uap:SupportedFileTypes com:Class Id{...} / /uap:SearchFilterHandler /uap:Extension10.windows.appExecutionAlias创建命令行执行别名通过 AppX 部署引擎在 WindowsApps 目录下创建重解析点reparse point而非传统注册表条目。uap5:Extension Categorywindows.appExecutionAlias uap5:AppExecutionAlias uap5:ExecutionAlias Aliasmyapp.exe / /uap5:AppExecutionAlias /uap5:Extension四、影响注册表虚拟化行为的属性这些不是扩展类别而是清单中的属性声明直接改变注册表过滤器的行为11.RegistryWriteVirtualization关闭注册表写入虚拟化允许应用直接写入真实注册表。Properties desktop6:RegistryWriteVirtualizationdisabled/desktop6:RegistryWriteVirtualization /Properties Capabilities rescap:Capability NameunvirtualizedResources / /Capabilities12.RegistryWriteFilterExemption声明特定注册表路径豁免虚拟化过滤。virtualization:RegistryWriteVirtualization virtualization:ExcludedKeys virtualization:ExcludedKeyHKEY_CURRENT_USER\Software\MyApp/virtualization:ExcludedKey /virtualization:ExcludedKeys /virtualization:RegistryWriteVirtualization补充清单实际清单标签功能说明MSIX 部署真实写入位置等价非 MSIX传统 Win32注册位置rescap3:Extension Categorywindows.desktopAppMigration将用户已固定到任务栏或开始菜单的旧版桌面快捷方式.lnk自动迁移指向打包后的新应用实现从 MSI/Setup 到 MSIX 的无缝过渡包私有 Hive迁移映射元数据 Shell 快捷方式更新不适用仅 MSIX 部署引擎管理的迁移场景desktop:Extension Categorywindows.fullTrustProcess声明包内 Win32 可执行文件以完整信任非沙箱模式运行使该进程可访问完整文件系统、注册表和系统 API不受 AppContainer 隔离限制非注册表项——清单能力声明rescap:Capability NamerunFullTrust由系统策略引擎在进程创建时豁免 AppContainer 令牌不适用传统 Win32 默认即以完整信任运行uap:Extension Categorywindows.appointmentsProvider声明应用可作为系统日历约会Appointments提供程序使其他应用可通过AppointmentDataProviderAPI 读写该应用管理的日历数据包私有 Hive约会提供程序注册无直接等价项传统 Win32 通过 MAPI 提供程序或 COM 自动化接口注册uap3:Extension Categorywindows.contactDataProvider声明应用可作为系统联系人Contacts数据提供程序使其他应用可通过ContactDataProviderAPI 读写该应用管理的联系人数据包私有 Hive联系人数据提供程序注册无直接等价项传统 Win32 通过 MAPI 地址簿提供程序IAddrBook注册desktop2:Extension Categorywindows.appPrinter将应用注册为打印目标当用户从其他应用如记事本打印时该应用出现在可用打印目标列表中包私有 Hive打印目标注册 PackagedCom 激活路由无直接等价项传统 Win32 通过HKCR\PrintProcessor 打印机端口监视器注册uap:Extension Categorywindows.toastNotification声明应用可接收和处理 Toast 通知的激活事件使系统通知中心在用户点击 Toast 时能将激活上下文路由到该包应用包私有 HiveToast 激活处理程序注册含ActivatableClassId无直接等价项传统 Win32 使用 Shell 通知区域Shell_NotifyIcon 自定义消息回调uap10:Extension Categorywindows.installedLocationVirtualization将应用安装目录中的文件写入重定向到 AppData 中的位置并指定应用更新时对已修改/添加/删除文件的处理策略包私有 Hive重定向映射元数据 文件系统合并过滤器无等价项传统 Win32 应用可直接写入安装目录参考资料微软文档-Windows 10的包清单架构参考 - Windows UWP applications | Microsoft Learn微软文档-元素层次结构Windows 10包架构 - Windows UWP applications | Microsoft Learn微软文档-