使用修改包自定义企业应用

自定义应用程序体验的能力非常重要,尤其是对于企业而言。 我们已经与 IT 专业人员进行了交谈,我们知道,自定义应用程序来满足用户的需求对于迁移到 Windows 10 至关重要。 在自定义使用 MSI 打包的应用程序时,众所周知,IT 专业人员必须从开发人员处获取该包,并使用自定义项重新打包安装程序以满足需求。 对于企业来说,这是一项代价高昂的工作。 展望未来,我们希望将自定义项和主应用程序解耦,以便不再需要重新打包。 这可确保企业从开发人员处获取最新更新,同时仍保持对自定义项的控制。

在 Windows 10 版本 1809 中,我们引入了一种称为修改包的全新类型的 MSIX 包。 修改包是存储自定义项的 MSIX 包。 修改包也有可能是没有激活点的插件/加载项。 IT 专业人员可以使用此功能灵活地更改 MSIX 容器,以便应用程序由其企业的自定义项覆盖。

工作原理

修改包专为不拥有应用程序代码且只有安装程序的企业设计。 可以使用最新版本的 MSIX 打包工具(适用于 Windows 10 版本 1809 或更高版本)创建修改包。 如果有应用程序的代码,也可以创建应用扩展

如果要创建与主应用严格绑定的修改包,可以在修改包的清单中将主应用声明为依赖项。

<Dependencies>
    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.15063.0"/>
    <uap4:MainPackageDependency Name="Main.App"/>
</Dependencies>

以下示例演示了如何指定其他证书或发布者。

<Dependencies>
    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.15063.0"/>
    <uap4:MainPackageDependency Name="Main.App" Publisher="CN=Contoso, C=US" />
</Dependencies>

如果修改包与主包之间的关系是一对一,则这是一个简单的配置。 典型自定义通常需要 HKEY_CURRENT_USER 或 HKEY_CURRENT_USERCLASS 下的注册表项。 在 MSIX 包内部,我们有 User.dat 和 Userclass.dat 文件来捕获注册表项。 如果需要 HKCU\Software* 下的注册表项,则需要创建 User.dat(就像 Registry.dat 用于 HKLM\Software* 一样)。 如果需要 HKCU\Sofware\Classes* 下的密钥,请使用 Userclass.dat。

以下是创建 .dat 文件的典型方法:

  • 使用 Regedit 创建文件。 在 Regedit 中创建配置单元并插入必要的密钥。 然后,右键单击、导出和另存配置单元文件。 请确保将文件命名为 User.dat 或 Userclass.dat

  • 使用 API 创建必要的文件。 可以使用 ORSaveHive 函数保存 .dat 文件。 请确保将文件命名为 User.dat 或 Userclass.dat

进行必要的更改后,可以像创建任何其他 MSIX 包一样创建修改包。 然后,可以使用当前部署设置部署包。 重新启动主应用时,可以看到修改包所做的更改。 如果选择删除修改包,主应用将在没有修改包的情况下还原状态。

了解设备上安装了哪些修改包

使用 PowerShell,可以通过以下命令查看已安装的修改包。

Get-AppPackage -PackageTypeFilter Optional

基于 Windows 10 版本 1809 的修改包

在 Windows 10 版本 1809 上,修改包可以包含需要在注册表中设置的配置,以便主包按预期运行。 这意味着,主应用程序将利用注册表来查看某个插件是否存在。 部署主包和修改包时,应用程序会在运行时查看主包和修改包的虚拟注册表 (VREG)。

请注意,主包可能会使用 VREG 来执行以下操作:

  • 查看插件的文件 (DLL) 的加载位置。 如果存在这种情况,请确保该文件是包的一部分。 这样,主包便可以在运行时访问该文件。
  • 查看 VREG 项值的显示位置。 主包可能会检查某个值是否在 VREG 中存在。 手动或者使用此工具创建修改包时,请确保该值正确。

基于 Windows 10 版本 1903 和更高版本的修改包

Windows 10 版本 1903 中添加了以下功能。

清单更新

我们在 MSIX 修改包的清单中添加了对以下元素的支持。

<Properties>
   <rescap6:ModificationPackage>true</rescap6:ModificationPackage>
</Properties>

为了确保修改包可在 1903 或更高版本中正常运行,修改包的清单必须包含此元素。 如果使用 MSIX 打包工具一月版打包 MSIX 修改包,则系统会自动包含此元素。 如果使用更低版本的工具转换了某个包,可以在工具中编辑现有的包以添加此新元素。 此外,当用户安装修改包时,系统将发出警报,指出该包可能会修改主应用程序。

如果使用的修改包是由低于 1903 的版本创建的,则需要编辑包清单,以将 MaxVersionTested 属性更新为 10.0.18362.0。

<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17701.0" MaxVersionTested="10.0.18362.0" />

使用 MSIX 打包工具创建修改包

可以使用 MSIX 打包工具创建修改包:

  • 指定主包。 请确保主包的 MSIX 版本在转换的计算机上可用。 如果不可用,我们将要求你手动提供发布者和主应用程序信息。 此外,某些自定义内容要求在计算机上安装主应用程序。 Modification Package MPT

  • 使用包编辑器完成转换后,请修改包。 可能存在这样一种情况:主包要求修改包在其 VREG 中包含特定的值。 在此情况下,需要相应地编辑该包。

使用 MakeAppx.exe 创建修改包

可以使用 Windows 10 SDK 中包含的 MakeAppX.exe 工具手动创建修改包。

  • 在清单中指定主包。 包含发布者和主包名称。

    <Dependencies>
      <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17701.0" MaxVersionTested="12.0.0.0"/>
      <uap4:MainPackageDependency Name="HeadTrax" Publisher="CN=Contoso Software, O=Contoso Corporation, C=US" />
    </Dependencies>
    
  • 创建 Registry.dat、User.dat 和 Userclass.dat,以创建加载修改包所需的任何注册表项。 仅当需要主应用程序查看自定义注册表项时,才需要执行此操作。 请记住,由于所有程序都在容器中运行,因此,在运行时,主包和修改包虚拟注册表将会合并,使主包可以查看修改包的虚拟注册表。

此过程还支持文件系统插件和自定义,只要主应用程序的可执行文件不在虚拟文件系统 (VFS) 中即可。 这是为了确保主包可以获得主包和修改包的所有 VFS。

在计算机上安装修改包

在计算机上安装修改包遵循其他安装约定。 值得注意的是,在安装包时可能需要使用 -OptionalPackagePath 参数。

冲突解决

如果多个修改包尝试更改相同值,则通过考虑修改包名称的字母顺序来解决冲突。