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

相關文章
相關標籤/搜索