【MICROSOFT】MSIX:按用户与面向所有用户安装差异
本文详解 MSIX 中“按用户(Per-User)”与“面向所有用户(Provisioned/All Users)”的概念、安装与卸载流程,并给出在登录时如何为用户注册/更新包的关键逻辑与示例 API 用法。文章还说明了分发、暂存(stage)、注册(register)、配置(provision)和去配置(deprovision)之间的区别与实践要点。
本文详解 MSIX 中“按用户(Per-User)”与“面向所有用户(Provisioned/All Users)”的概念、安装与卸载流程,并给出在登录时如何为用户注册/更新包的关键逻辑与示例 API 用法。文章还说明了分发、暂存(stage)、注册(register)、配置(provision)和去配置(deprovision)之间的区别与实践要点。
概述
– MSIX 不使用传统“per-machine”术语,而是通过“provisioning”(配置/预置包族)来实现面向所有用户的安装体验。
– “注册”(register)是将包关联到单个用户;“配置”(provision)是把包族加入系统层面的“已配置包族”列表,确保所有用户在登录时获得该包。
用户体验与登录时行为
– 在用户登录前,Deployment 会比较该用户已注册的包与机器上暂存的包:
– 若机器上有更新版本则为该用户注册新版本(自动更新)。
– 若该用户没有属于某已配置包族的包,则为其注册该包族的最新版本(自动加入)。
– 结果:对用户而言,已配置的应用会在登录时自动注册并保持为最新版本。
核心逻辑(伪代码说明)
– 关键步骤:
1. 找到用户当前注册的包(current)。
2. 对每个已注册包,检查机器上同一包族是否存在更新,若存在则列入待处理(todo)。
3. 检查已配置包族列表,若用户没有某包族的注册则将该包族的最高版本加入 todo。
4. 对 todo 列表中的包逐一调用 RegisterPackage 完成注册(或更新)。
如何安装(HowTO)
– 按用户(Per-User):
– 操作是“暂存 + 注册(Stage + Register)”,可用 AddPackageByUriAsync 简化为对当前用户的添加操作。
– 示例:PackageDeploymentManager.AddPackageByUriAsync(…)
– 面向所有用户(All Users / Provisioning):
– 需先在系统层暂存包(StagePackageByUriAsync),再通过 ProvisionPackageAsync(packageFamilyName) 将包族加入已配置列表。
– ProvisionPackageAsync 会:将包族加入已配置列表,并在当前用户(非 LocalSystem)中注册该包;其它用户将在下一次登录时获得注册。
如何卸载(HowTO Uninstall)
– 按用户:
– 使用 RemovePackageAsync(packageFamilyName, options) 从当前用户移除,操作会隐式包含强制关闭目标应用以便注销。
– 面向所有用户:
– 先调用 DeprovisionPackageAsync(packageFamilyName) 将包族从已配置列表移除,随后使用带 RemoveForAllUsers 的移除选项使其在所有用户中反注册。
实践要点与注意事项
– MSIX 管理的是包族(package family),而非单一包版本;文中多处简写为“已配置包”。
– 注册/去注册以包族为单位更可靠,直接按 PackageFullName 移除可能因版本差异失败。
– Provisioning 操作与用户登录绑定,理解登录前的同步流程对大规模部署很重要。
参考 API
– Microsoft.Windows.Management.Deployment.PackageDeploymentManager
– StagePackageByUriAsync / ProvisionPackageAsync / AddPackageByUriAsync / RemovePackageAsync / DeprovisionPackageAsync
MSIX 的“配置=面向所有用户”设计让大规模部署更可控,但要注意包族与版本管理细节。
不错过任何一条 AI 大事
订阅 AIFlux 早报,每天 3 分钟看懂产业动态。

