使用 DISM 管理 Windows 应用

前言

  • 相关阅读:使用 PowerShell 管理 Windows 应用

  • 如果你的应用程序包名、或者文件路径中含有空格,请将空格改为连接符(-)或下划线(_

  • DISM 需要以管理员身份运行

  • Windows PE 4.0Windows Server 2012 服务器核心安装选项或任何低于 Windows 8Windows Server 2012 的 Windows 版本的 Windows 系统都不支持

  • DISM 支持使用长路径(UNC 路径)表示(详情请参阅:Windows 系统中的文件路径格式 | Microsoft Learn),例如:

    1
    Dism.exe /Image:\\?\C:\ /?
关于参数
  • 如果仅有 /Image:<系统盘盘符>:/Online 参数,则代表另一个参数不可用
  • [/<参数 1> | /<参数 2>] 中括号代表多选一的必选参数,例如:
    1
    [/Image:<系统盘盘符>: | /Online]
    代表这两个参数只能二选一,如果我选择前面的的参数,则为 /Image:<系统盘盘符>:
  • {</参数 1>[</参数 1>] | </参数 2>[</参数 2>]} 花括号代表可以多选的可选参数,花括号内的中括号代表多选一的必选参数花括号外的中括号为可选,例如:
    1
    /Add-ProvisionedAppxPackage {/FolderPath:<app_folder_path> [/SkipLicense] [/CustomDataPath:<custom_file_path>]} /PackagePath:<main_package_path> {/DependencyPackagePath:<dependency_package_path>} {[/LicensePath:<license_file_path>] [/SkipLicense]} {[/CustomDataPath:<custom_file_path>]} {[/Region:<region>]}
    沟槽的微软,文档越写越乱,这还得自己改一遍
  • 如果你是为挂载的映像添加,请将<系统盘盘符>:替换为挂载路径,如 C:\Temp\Mount(相当于要挂载的镜像的系统盘根目录,即 Windows 文件夹的上层目录)
  • /Image: 参数仅允许在 PE 下使用,或对挂载的镜像使用;/Online 参数仅允许对当前正在运行的系统(联机映像)使用

所有的操作都需要管理员身份,执行前请二选一执行以下操作:

  • 按下 WIN + X 以打开“高级菜单”,选择“终端管理员”,“Windows PowerShell (管理员)”或“命令提示符(管理员)”
  • 按下 WIN + QWIN + S 以打开“Windows 搜索”,输入 wt.exe(终端)、cmd.exe(命令提示符)或 powershell.exe(Windows PowerShell),选择最佳匹配结果并点击“以管理员身份运行”

/Get-Help /?

获取帮助
语法:

1
Dism.exe /Image:<系统盘盘符>: /?
1
Dism.exe /Image:<系统盘盘符>: /Get-Help
1
Dism.exe /Online /?
1
Dism.exe /Online /Get-Help

/Get-Help /?

/Get-ProvisionedAppxPackages

获取映像中为每个用户安装的应用程序包的相关信息
语法:

1
Dism.exe /Image:<系统盘盘符>: /Get-ProvisionedAppxPackages
1
Dism.exe /Online /Get-ProvisionedAppxPackages

/Get-ProvisionedAppxPackages

/Add-ProvisionedAppxPackage

将一个或多个应用程序包添加到映像
若应用到未进入 OOBE 的系统或挂载的映像,每个现有的或新的用户配置文件都将注册该应用;如果将应用添加到联机映像,则在当前用户下次登录之前,将不会为此用户注册应用

若系统不联网,则需要使用 /LicensePath 参数来指定许可证,否则会无法打开应用程序;如果为 UUP 集成的,可以在 UUP 的 UUPs\Apps 文件夹下找到 License.xml(每个应用都有对应的许可证,不可混用)

语法:

1
Dism.exe /Add-ProvisionedAppxPackage {/FolderPath:<已解包的应用程序包路径> [/SkipLicense] | /PackagePath:<应用程序包路径> [/DependencyPackagePath:<应用程序包运行时路径>] [/LicensePath:<许可证路径> | /SkipLicense]}
其他参数及注解
  1. /CustomDataPath:<自定义数据文件路径> 可跟在 /FolderPath/PackagePath/SkipLicense/LicensePath 的参数后
  2. [/Region:"<区域>"] 可跟在 /FolderPath/PackagePath 的命令最末尾处
    • 使用 /Region 指定必须在其中预配应用包( .appx 或 .appxbundle)的区域。 区域参数可以是:
      · All,指示应为所有区域预配应用
      · 以分号分隔的区域列表, 区域将采用 ISO 3166-1 Alpha-2 或 ISO 3166-1 Alpha-3 代码形式; 例如,可以将美国指定为“US”或“USA”(不区分大小写),如果未指定区域列表,则只有在将包固定到“开始”菜单布局时,才会对其进行预配
  3. /DependencyPackagePath:<应用程序包运行时路径> 只能跟在 /PackagePath 的参数后,指定该应用程序包需要的应用程序包运行时,所需运行时在应用程序包内的 AppxManifest.xml 中列出,参数可叠加
  4. /LicensePath:<许可证路径> 可跟在 /FolderPath/PackagePath 的参数后,所需的许可证应为 .xml/SkipLicense 可跟在 /FolderPath/PackagePath 的参数后,在其他方案中使用可能会损坏映像

假如,我的系统盘盘符为 C,应用程序包放在 D:\Appx 下,应用程序包名为 Microsoft.UI.Xaml.2.7_7.2208.15002.0_x64__8wekyb3d8bbwe.Appx,没有许可证文件,则我的命令如下

1
Dism.exe /Image:C: /Add-ProvisionedAppxPackage /PackagePath:D:\Appx\Microsoft.UI.Xaml.2.7_7.2208.15002.0_x64__8wekyb3d8bbwe.Appx /SkipLicense

抑或是

1
Dism.exe /Online /Add-ProvisionedAppxPackage /PackagePath:D:\Appx\Microsoft.UI.Xaml.2.7_7.2208.15002.0_x64__8wekyb3d8bbwe.Appx /SkipLicense

/Add-ProvisionedAppxPackage

其他示例

完整示例:

1
Dism.exe /Add-ProvisionedAppxPackage /FolderPath:D:\Appx\UnpackedAppx /CustomDataPath:D:\Appx\CustomData\CustomData.xml /LicensePath:D:\Appx\License\License.xml /Region:"All"
1
Dism.exe /Add-ProvisionedAppxPackage /PackagePath:D:\Appx\Appx.appx /DependencyPackagePath:D:\Appx\Runtime\Framework-1.appx /DependencyPackagePath:D:\Appx\Runtime\Framework-2.appx /SkipLicense /Region:"US;GB"

/FolderPath:

1
Dism.exe /Image:C: /Add-ProvisionedAppxPackage /FolderPath:D:\Appx\UnpackedAppx /CustomDataPath:D:\Appx\CustomData\CustomData.xml /LicensePath:D:\Appx\License\License.xml
1
Dism.exe /Online /Add-ProvisionedAppxPackage /FolderPath:D:\Appx\UnpackedAppx /SkipLicense

/PackagePath:

1
Dism.exe /Image:C: /Add-ProvisionedAppxPackage /PackagePath:D:\Appx\Appx.appx /DependencyPackagePath:D:\Appx\Runtime\Framework-1.appx /DependencyPackagePath:D:\Appx\Runtime\Framework-2.appx /LicensePath:D:\Appx\License\License.xml
1
Dism.exe /Image:C: /Add-ProvisionedAppxPackage /PackagePath:D:\Appx\Appx.appx /SkipLicense
1
Dism.exe /Online /Add-ProvisionedAppxPackage /PackagePath:D:\Appx\Appx.appx /Region:"All" /SkipLicense
1
Dism.exe /Online /Add-ProvisionedAppxPackage /PackagePath:D:\Appx\Appx.appx /LicensePath:D:\Appx\License\License.xml /Region:"US;GB"

/Remove-ProvisionedAppxPackage

从映像中删除应用程序包的预配,并不会注册到创建的新用户帐户
语法:

1
/Remove-ProvisionedAppxPackage /PackageName:<应用程序包全名称>

若我的应用程序包全名称为 Microsoft.UI.Xaml.2.7_7.2208.15002.0_x64__8wekyb3d8bbewe,则命令如下

1
Dism.exe /Image:C: /Remove-ProvisionedAppxPackage /PackageName:Microsoft.UI.Xaml.2.7_7.2208.15002.0_x64__8wekyb3d8bbwe

抑或是

1
Dism.exe /Online /Remove-ProvisionedAppxPackage /PackageName:Microsoft.UI.Xaml.2.7_7.2208.15002.0_x64__8wekyb3d8bbwe

/Remove-ProvisionedAppxPackage

  1. 在 PowerShell 中使用 Remove-AppxPackage 命令,为已注册应用程序包的每个用户删除应用程序,以便从映像中完全删除该应用程序
  2. 若尚未将应用程序包注册到任何用户配置文件,则 /Remove-ProvisionedAppxPackage 选项将完全删除应用程序包,而非仅删除预配

疑难解答

如果遇到 错误: 0xc1570118 的报错,则可能是由于目标应用程序包已安装导致

0xc1570118

后记

  1. DISM 应用包(.appx 或 .appxbundle)服务命令行选项 | Microsoft Learn