ProvisionedAppxPackage VS AppxPackage

正文

先来讲说问题的由来。php

在 Preinstall 的 component 中,有一支 component 叫作 MS_StartApp,这个 component 的行为是在预安装时为目标机器装入一些 Modern APP。所遇到的问题是,旧版的 MS_StartApp 在安装 Modern App 时,有部分 App 没有安装成功,新版的 MS_StartApp 没有这个问题。可是另一个部门的同事,手里的机器是使用旧版本的 MS_StartApp 安装出来了,就会致使部分 App 没有安装,直观的反映就是在 Start Menu 中有一些 Tile 丢失了。css

一个比较好的解决方案是,由我来开发一个单独运行的 component,来帮助安装上丢失的 App。windows

因而我作了一些前期调研。首先以 MS_StartApp 做为 Sample Script 来学习,发现 Modern App 的源文件是.appx 或者 .appxbundle 文件,经过 DISM 的以下命令来安装:浏览器

DISM Command-Line Script:app

DISM /Online /Add-ProvisionedAppxPackageide


研究发现,经过 PowerShell 的 DISM Cmdlets 也能够达到 DISM 安装相同的效果,DISM 安装所具备的参数,DISM Cmdlets 一样有。PowerShell 的 DISM Cmdlets 安装命令示例以下:学习

PowerShell DISM Cmdlets Script:ui

PS > Add-AppxProvisionedPackage -Onlinespa

 

如下 ProvisionedAppxPackage 的安装方法,都会采用 PowerShell DISM Cmdlets Script 的方式给出。3d

安装完成以后,发现其实这个 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.

和我本人的总结相相似,说明个人研究和总结是正确的!

参考资料

  1. DISM App Package (.appx or .appxbundle) Servicing Command-Line Options (经过 DISM 安装 ProvisionedAppxPackage,这是知识点的引入)
  2. DISM Cmdlets (PowerShell 的 DISM Cmdlets)
  3. Appx Module Cmdlets (PowerShell 的 Appx Module Cmdlets)
  4. Sideload Apps with DISM (有关 Apps Sideload 的文章,内容普遍)

 

创做日期:8/12/2016 3:06:42 PM

相关文章
相关标签/搜索