ProvisionedAppxPackage VS AppxPackage
正文
先来说说问题的由来。
在 Preinstall 的 component 中,有一支 component 叫做 MS_StartApp,这个 component 的行为是在预安装时为目标机器装入一些 Modern APP。所遇到的问题是,旧版的 MS_StartApp 在安装 Modern App 时,有部分 App 没有安装成功,新版的 MS_StartApp 没有这个问题。但是另外一个部门的同事,手里的机器是使用旧版本的 MS_StartApp 安装出来了,就会导致部分 App 没有安装,直观的反映就是在 Start Menu 中有一些 Tile 丢失了。
一个比较好的解决方案是,由我来开发一个单独运行的 component,来帮助安装上丢失的 App。
于是我做了一些前期调研。首先以 MS_StartApp 作为 Sample Script 来学习,发现 Modern App 的源文件是.appx 或者 .appxbundle 文件,通过 DISM 的如下命令来安装:
DISM Command-Line Script:
DISM /Online /Add-ProvisionedAppxPackage
研究发现,通过 PowerShell 的 DISM Cmdlets 也可以达到 DISM 安装相同的效果,DISM 安装所具有的参数,DISM Cmdlets 同样有。PowerShell 的 DISM Cmdlets 安装命令示例如下:
PowerShell DISM Cmdlets Script:
PS > Add-AppxProvisionedPackage -Online
以下 ProvisionedAppxPackage 的安装方法,都会采用 PowerShell DISM Cmdlets Script 的方式给出。
安装完成之后,发现其实这个 App 可以是一个 ProvisionedAppxPackage,也可以是一个 AppxPackage。那么就会产生一个问题,如果我要卸载这个应用,那么我应该卸载 ProvisionedAppxPackage 还是 AppxPackage?
有关 AppxPackage,已有的知识告诉我可以通过 PowerShell 的方式安装:
PowerShell Appx Module Cmdlets Script:
PS > Add-AppxPackage
那么,这两种安装方式有什么不同呢?
总结以上两个问题,其核心问题是:ProvisionedAppxPackage 和 AppxPackage 的区别是什么?
为了回答这个核心问题,做了如下的研究,最终通过实践,初步理解了 ProvisionedAppxPackage 和 AppxPackage 的区别!
在 PowerShell 的 DISM Cmdlets 中,有关 Add-AppxProvisionedPackage 命令,有如下重要的说明:
The Add-AppxProvisionedPackage cmdlet adds an app package (.appx) that will install for each new user to a Windows image.
Use the Online parameter to specify the running operating system on your local computer, or use the Path parameter to specify the location of a mounted Windows image.
To add an app package (.appx) for a particular user, or to test a package while developing your app, use the Add-AppxPackage cmdlet instead.
在 PowerShell 的 Appx Module Cmdlets 中,有关 Add-AppxPackage 命令,有重要的说明如下:
Adds a signed app package to a user account.
所以,猜测 ProvisionedAppxPackage 和 AppxPackage 的区别应该和账户有关。
首先,在 CDC 账户下,通过如下 PowerShell DISM Cmdlets 命令,取出一份 ProvisionedAppxPackage 列表:
PowerShell DISM Cmdlets Script:
PS > Get-AppxProvisionedPackage -Online
实践发现,无论在任何一个账户中取出 ProvisionedAppxPackage List,其内容都一样,这就验证了 ProvisionedAppxPackage 是 for each new user 的。
所以,下面的研究中就不会在其他账户中取出重复的 ProvisionedAppxPackage List。
然后,在 CDC 账户下,通过如下 PowerShell 命令,取出一份 AppxPackage 列表:
PowerShell Appx Module Cmdlets Script:
PS > Get-AppxPackage
筛选出 PackageFullName 和 PackageName,对比结果如下:

可以看到 ProvisionedAppxPackage 是 AppxPackage 的子集。在 AppxPackage 中列出的额外的项目,属于 Base OS 自带的 App。
新建账户 CDC_Temp,发现在进入 CDC_Temp 账户时会有 OOBE。OOBE 过后,取出一份 AppxPackage 列表,然后对比 CDC 和 CDC_Temp 的 AppxPackage 列表,筛选出 PackageFullName,对比结果如下:

可以看到,两者的 AppxPackage 是完全相同的。
因为观察到进入 新账户 时有 OOBE 的过程,因此猜测,新账户 OOBE 时会把系统中的 ProvisionedAppxPackage 安装成为 AppxPackage。
为了验证这一猜测,使用如下命令移除 BingFinance 这个 ProvisionedAppxPackage,然后新建账户 CDC_Julius,静待 OOBE。
筛选出 PackageFullName 后,CDC 和 CDC_Julius 的 AppxPackage 对比结果如下:

可以看到,CDC 有 BingFinance,而 CDC_Julius 没有 BingFinance。
由此证明,新账户 OOBE 时会把系统中的 ProvisionedAppxPackage 安装成为 AppxPackage。
番外
有关 Get-AppxPackage -AllUsers
PowerShell 的 Appx Cmdlets 中的 Get-AppxPackage 命令,有一个参数是 -AllUsers,可以取出所有账户下的 AppxPackage 列表。
PowerShell Appx Module Cmdlets Script: PS > Get-AppxPackage -AllUsers
在系统中只有 CDC 和 CDC_Temp 两个账户时,摘取 BingFinance 相关信息,如下所示:
Name : Microsoft.BingFinance
Publisher : CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
Architecture : X86
ResourceId :
Version : 4.8.239.0
PackageFullName : Microsoft.BingFinance_4.8.239.0_x86__8wekyb3d8bbwe
InstallLocation : C:\Program Files\WindowsApps\Microsoft.BingFinance_4.8.239.0_x86__8wekyb3d8bbwe
IsFramework : False
PackageFamilyName : Microsoft.BingFinance_8wekyb3d8bbwe
PublisherId : 8wekyb3d8bbwe
PackageUserInformation : {S-1-5-21-3858193888-3433337990-3667270340-1001 [CDC]: Installed,
S-1-5-21-3858193888-3433337990-3667270340-1002 [CDC_Temp]: Installed}
IsResourcePackage : False
IsBundle : False
IsDevelopmentMode : False
注意,PackageUserInformation 显示了该 AppxPackage 为哪些用户安装了。
有关 Remove-AppxPackage
PowerShell 的 Appx Cmdlets 中的 Remove-AppxPackage 命令,只可以为当前用户移除 AppxPackage。
PowerShell Appx Module Cmdlets Script:
PS > Remove-AppxPackage <string>
小结
有些 AppxPackage,可以把它的安装包(.appx or .appxbundle)以 ProvisionedAppxPackage 的方式安装(例如 Windows.Photos 等。我估计可能所有的 .appx or .appxbundle 都可以用这种方式安装,因为这么做的好处是,所有的新增用户都可以在 OOBE 的时候安装这个 APP)
安装完之后,发现通过 MS_StartApp 这个 component 安装的 APP,都保留了一份 ProvisionedAppxPackage,这样,在 新增用户 之后,新用户 会从 ProvisionedAppxPackage 里面,安装一个 APP 出来(已验证)
有些 APP 不会保留一份 ProvisionedAppxPackage,例如 MicrosoftEdge 浏览器(这个是 Win10 OS 自带的) 就没有保留一份 ProvisionedAppxPackage,他们只是以 AppxPackage 的方式呈现给每一个用户。当 新用户 创建以后,还是会有这个 APP,这肯定是由另外一种机制控制的,可能是 SystemApps 机制。
关于 AppxPackage 和 ProvisionedAppxPackage 的区别,总结如下:
如果你开发了一款 Modern APP,想安装在用户的机器上,如果你是以 ProvisionedAppxPackage 的方式安装,那么任何新增的用户,都可以在 OOBE 时安装这款 APP,如果你用 AppxPackage 的方式安装,那么只是为当前用户安装,新增用户无法在 OOBE 时安装这款 APP。
查到了另一份资料(见参考资料第4条),是 Provisioned Apps 的官方描述:
Apps that are installed in the Windows image are called provisioned apps. Provisioned apps are staged in the image and are scheduled to be installed for every user of the Windows image at first logon or at the next logon, if the user account is already created.
和我本人的总结相类似,说明我的研究和总结是正确的!
参考资料
- DISM App Package (.appx or .appxbundle) Servicing Command-Line Options (通过 DISM 安装 ProvisionedAppxPackage,这是知识点的引入)
- DISM Cmdlets (PowerShell 的 DISM Cmdlets)
- Appx Module Cmdlets (PowerShell 的 Appx Module Cmdlets)
- Sideload Apps with DISM (有关 Apps Sideload 的文章,内容广泛)
创作日期:8/12/2016 3:06:42 PM
ProvisionedAppxPackage VS AppxPackage的更多相关文章
- WindowsApps目录占用大量空间
WindowsApps目录占用大量空间今天遇到一个客户端的问题.Windows 10的电脑100G的C盘空间几乎耗尽.但是选取所有文件后总大小只有不到40G.按常规,肯定是有一些没有权限的文件夹的体积 ...
- 使用PowerShell管理Windows8应用
引子(?): 我从消费者预览版开始使用的win8,大概是因为我年龄不大的缘故,我很快熟悉了这个操作系统并习惯了使用windows8的Modern App.我之前使用过一个叫Windows8 Moder ...
- DevExpress.Build.v14.2
DevExpress.Build.v14.2 using Microsoft.Build.AppxPackage; using Microsoft.Build.Framework; using Sys ...
- DevExpress.Build
using System.Collections.Generic; using Microsoft.Build.AppxPackage; using Microsoft.Build.Framework ...
- 解决在 WP8/ WP8.1 项目中 引用 C++ 组件时出现的 System.TypeLoadException 错误
本文为个人博客备份文章,原文地址: http://validvoid.net/wp-cpp-typeloadexception/ 使用 Visual Studio 2013 update 4 在 WP ...
随机推荐
- 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU特性那些事(5)- 划时代新品RT1170
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列MCU的划时代新品i.MXRT1170. 自2017年开始,每年的6月25日恩智浦都会在北京举行微控制 ...
- CSS3自定义浏览器滚动条样式
一个完整滚动条右以下部分组成: ::-webkit-scrollbar 滚动条整体部分,常用属性:width,height,background,border: ::-webkit-scrollbar ...
- Kotlin编译时注解,简单实现ButterKnife
ButterKnife在之前的Android开发中还是比较热门的工具,帮助Android开发者减少代码编写,而且看起来更加的舒适,于是简单实现一下ButterKnife,相信把下面的代码都搞懂,看Bu ...
- Python爬虫零基础入门(系列)
一.前言上一篇演示了如何使用requests模块向网站发送http请求,获取到网页的HTML数据.这篇来演示如何使用BeautifulSoup模块来从HTML文本中提取我们想要的数据. update ...
- 程序员修神之路--设计一套RPC框架并非易事
菜菜哥,我最近终于把Socket通信调通了 这么底层的东西你现在都会了,恭喜你离涨薪又进一步呀 http协议不也是利用的Socket吗 可以这么说,http协议是基于TCP协议的,底层的数据传输可以说 ...
- kali系统
打开终端分别输入下面两条命令: update-alternatives --install /usr/bin/python python /usr/bin/python2 100 update-alt ...
- Vijos 1067守望者的烦恼
背景 守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条行的,守望者warden拥有一个技能名叫“闪烁”,这个技能可以把她传送到后面的监狱内查看,她比较懒,一般不查看 ...
- 单元测试实践(SpringCloud+Junit5+Mockito+DataMocker)
网上看过一句话,单元测试就像早睡早起,每个人都说好,但是很少有人做到.从这么多年的项目经历亲身证明,是真的. 这次借着项目内实施单元测试的机会,记录实施的过程和一些总结经验. 项目情况 首先是背景,项 ...
- 从.NET CORE2.2升级到3.0过程及遇到的一些问题
RoadFlow工作流引擎从.NET Core2.2升级到3.0遇到了一些问题及解决方式这里记录一下. 1.DLL项目框架从2.2选择到3.0,这个没什么好说的,没有问题.重点的WEB层的一些变化. ...
- is_enable()、is_displayed()、isSelected()
1.以上三个为布尔类型的函数 2.is_enable()用于存储input.select等元素的可编辑状态,可以编辑返回true,否则返回false 3.is_displayed()本身这个函数用于判 ...