企业应用管理

本文讨论 Windows 移动版设备管理 (MDM) 功能的主要功能之一:能够管理所有 Windows 设备上的应用生命周期。 这包括应用商店和非应用商店应用,这些应用可以通过 MDM 进行本机管理。

通过使用 Windows MDM 管理应用生命周期,管理员可以部署和管理更新、删除过时或未使用的应用,并确保所有设备都安装了必要的应用以满足组织的需求。 此功能可简化应用管理过程,并为 IT 专业人员节省时间和精力。

应用程序管理目标

Windows 使管理服务器能够:

  • 部署脱机应用商店应用和许可证
  • ) 非应用商店应用 (部署业务线 (LOB) 应用
  • 列出用户 (应用商店和非应用商店应用的所有应用)
  • 清点设备 (应用商店和非应用商店应用的所有应用)
  • 卸载用户的所有应用 (应用商店和非应用商店应用)
  • 预配应用,以便为运行 Windows 桌面版的设备的所有用户安装应用, (家庭版、专业版、企业版和教育版)
  • 删除运行 Windows 桌面版的设备上的预配应用

清单应用

Windows 允许你清点部署到用户的所有应用,并清点 Windows 设备所有用户的所有应用。 EnterpriseModernAppManagement 配置服务提供商 (CSP) 清单打包的应用,不包括通过 MSI 或可执行文件安装的传统 Win32 应用。 列出应用清单时,会根据以下应用分类来分隔这些应用:

  • 应用商店:从 Microsoft 应用商店获取的应用。
  • nonStore:未从 Microsoft Store 获取的应用。
  • 系统:属于操作系统且无法卸载的应用。 此分类是只读的,只能列出清单。

每个应用由一个包系列名称和一个或多个包全名标识,并且应用根据其来源进行分组。 EnterpriseModernAppManagement CSP 将这些分类显示为节点。

可以通过包全名在 AppManagement 节点的任何级别递归运行清单。 还可以选择仅列出特定属性的清单。 清单特定于包全名,并在包系列名称下列出捆绑包和资源包(如果适用)。

有关每个节点的详细信息,请参阅 EnterpriseModernAppManagement CSP 中提供的详细说明。

应用清单

可以使用 EnterpriseModernAppManagement CSP 查询为用户或设备安装的所有应用。 查询返回所有应用,即使它们是使用 MDM 或其他方法安装的。 清单可以在用户或设备级别运行。 设备级别的清单返回设备上的所有用户的信息。

根据硬件和已安装的应用数量,对设备执行完整清单可能会占用大量资源。 返回的数据也可能很大。 你可能希望对这些请求进行分块,以减少对客户端和网络流量的影响。

  • 设备上所有应用的示例查询。

    <!-- Get all apps under AppManagement -->
    <Get>
       <CmdID>1</CmdID>
       <Item>
          <Target>
             <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement?list=StructData</LocURI>
          </Target>
       </Item>
    </Get>
    
  • 针对用户的特定应用的示例查询。

    <!-- Get all information of a specific app for a user -->
    <Get>
       <CmdID>1</CmdID>
       <Item>
          <Target>
             <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement/AppStore/{PackageFamilyName}?list=StructData</LocURI>
          </Target>
       </Item>
    </Get>
    

应用商店许可证清单

可以使用 EnterpriseModernAppManagement CSP 查询为用户或设备安装的所有应用许可证。 查询返回所有应用许可证,如果它们是通过 MDM 或其他方法安装的,则返回事件。 清单可以在用户或设备级别运行。 设备级别的清单返回设备上的所有用户的信息。

有关每个节点的详细说明,请参阅 EnterpriseModernAppManagement CSP

注意

CSP 中的 LicenseID 是许可证的内容 ID。

  • 下面是设备上所有应用许可证的查询示例。

    <!-- Get all app licenses for the device -->
    <Get>
       <CmdID>1</CmdID>
       <Item>
          <Target>
             <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppLicenses/StoreLicenses?list=StructData</LocURI>
          </Target>
       </Item>
    </Get>
    
  • 下面是针对用户的所有应用许可证的查询示例。

    <!-- Get a specific app license for a user -->
    <Get>
       <CmdID>1</CmdID>
       <Item>
          <Target>
             <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppLicenses/StoreLicenses/{license id}?list=StructData</LocURI>
          </Target>
       </Item>
    </Get>
    

启用设备以安装非应用商店应用

可以部署两种基本类型的应用:

  • 应用商店应用。
  • 企业签名的应用。

若要部署企业签名的应用,必须在设备上启用设置以允许受信任的应用。 应用可由Microsoft批准的根 ((例如 Symantec) 、企业部署的根或自签名的应用)进行签名。 本部分介绍为非存储应用部署配置设备的步骤。

解锁非应用商店应用的设备

若要部署非Microsoft应用商店中的应用,必须配置 ApplicationManagement/AllowAllTrustedApps 策略。 如果设备上存在证书链,则此策略允许在设备上安装非应用商店应用。 可以使用设备上的根证书对应用进行签名, (例如 Symantec Enterprise) 、企业拥有的根证书或设备上部署的对等信任证书。 有关部署用户许可证的详细信息,请参阅 将脱机许可证部署到用户

AllowAllTrustedApps 策略允许在设备上的受信任人员中安装证书信任的应用,或者在设备的受信任根目录中安装根证书。 默认情况下未配置策略,这意味着只能安装Microsoft应用商店中的应用。 如果管理服务器隐式将值设置为 off,则会在设备上的设置面板中禁用该设置。

下面是一个示例:

<!-- Get policy (Default)-->
<Get>
<CmdID>1</CmdID>
<Item>
   <Target>
      <LocURI>./Vendor/MSFT/Policy/Result/ApplicationManagement/AllowAllTrustedApps?list=StructData</LocURI>
   </Target>
   </Item>
</Get>
<!-- Update policy -->
<Replace>
<CmdID>2</CmdID>
<Item>
   <Target>
      <LocURI>./Vendor/MSFT/Policy/Config/ApplicationManagement/AllowAllTrustedApps</LocURI>
   </Target>
   <Meta>
      <Format>int</Format>
      <Type>text/plain</Type>
   </Meta>
   <Data>1</Data>
</Item>
</Replace>

解锁设备以使用开发人员模式

在 Windows 设备上开发应用不再需要特殊许可证。 可以在策略 CSP 中使用 ApplicationManagement/AllowDeveloperUnlock 策略启用非打包应用的调试和部署。

AllowDeveloperUnlock 策略在设备上启用开发模式。 默认情况下,未配置 AllowDeveloperUnlock,这意味着只能安装Microsoft应用商店应用。 如果管理服务器将值显式设置为 off,则会在设备上的设置面板中禁用该设置。

将应用部署到 Windows 设备要求设备上有证书链。 可以使用设备上的根证书对应用进行签名, (例如 Symantec Enterprise) 、企业拥有的根证书或设备上部署的对等信任证书。

下面提供了一个示例。

<!-- Get policy (Default)-->
<Get>
  <CmdID>1</CmdID>
  <Item>
    <Target>
      <LocURI>./Vendor/MSFT/Policy/Result/ApplicationManagement/AllowDeveloperUnlock?list=StructData</LocURI>
    </Target>
  </Item>
</Get>
<!-- Update policy -->
<Replace>
  <CmdID>2</CmdID>
  <Item>
    <Target>
      <LocURI>./Vendor/MSFT/Policy/Config/ApplicationManagement/AllowDeveloperUnlock</LocURI>
    </Target>
    <Meta>
      <Format>int</Format>
      <Type>text/plain</Type>
    </Meta>
    <Data>1</Data>
  </Item>
</Replace>

安装应用

可以将应用安装到特定用户或设备的所有用户。 应用直接从 Microsoft 应用商店安装。 或者,它们是从主机位置(例如本地磁盘、UNC 路径或 HTTPS 位置)安装的。 使用 EnterpriseModernAppManagement CSP 的 AppInstallation 节点安装应用。

从应用商店将应用部署到用户

若要直接从 Microsoft Store 将应用部署到用户,管理服务器在 EnterpriseModernAppManagement CSP 的 AppInstallation 节点上运行 Add and Exec 命令。 此功能仅在用户上下文中受支持,在设备上下文中不受支持。

如果你从适用于企业的应用商店购买了应用,并且该应用是为在线许可证指定的,则必须直接从 Microsoft Store 获取该应用和许可证。

注意

适用于企业的 Microsoft Store和适用于教育的 Microsoft Store已停用。 有关详细信息,请参阅 2023 年 3 月 31 日停用适用于企业的 Microsoft Store和教育版。

下面是此方案的要求:

  • 应用将分配给适用于企业的应用商店中的Microsoft Entra标识的用户。 可以直接在适用于企业的应用商店中或通过管理服务器进行分配。
  • 设备需要连接到 Microsoft 存储。
  • Microsoft必须在设备上启用应用商店服务。 Microsoft应用商店的 UI 可由企业管理员禁用。
  • 用户必须使用其Microsoft Entra标识登录。

下面是一个示例:

<Exec>
  <CmdID>1</CmdID>
  <Item>
    <Target>
      <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName}/StoreInstall</LocURI>
    </Target>
    <Meta>
      <Format xmlns="syncml:metinf">xml</Format>
    </Meta>
    <Data>
      <Application id="{ProductID}" flags="0" skuid=" " />
    </Data>
  </Item>
</Exec>

下面是上一版本的更改:

  1. 引用 {CatID} 应更新为 {ProductID}。 此值作为适用于企业的应用商店管理工具的一部分获取。
  2. 标志的值可以是 0 或 1。
    • 0:管理工具回调到适用于企业的应用商店同步,以向用户分配应用程序的席位。
    • 1:管理工具不会回调到适用于企业的应用商店同步,以向用户分配应用程序的席位。 CSP 会认领一个席位(如果可用)。
  3. skuid是所需的新参数。 此值作为适用于企业的应用商店管理工具同步的一部分获取。

向用户部署脱机许可证

如果你从适用于企业的应用商店购买了应用,则必须将应用许可证部署到设备。 只需在应用初始安装过程中部署应用许可证。 在更新期间,仅将应用部署到用户。

在 SyncML 中,需要在 命令中 Exec 指定以下信息:

  • 许可证 ID - 此 ID 在 LocURI 中指定。 脱机许可证的许可证 ID 在许可证文件中称为“内容 ID”。 可以从适用于企业的 Store 下载 Base 64 编码许可证中检索此信息。
  • 许可证内容 - 此内容在数据部分中指定。 许可证内容是许可证的 Base 64 编码 Blob。

下面是脱机许可证安装的示例。

<Exec>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppLicenses/StoreLicenses/{LicenseID}/AddLicense</LocURI>
      </Target>
      <Meta>
         <Format xmlns="syncml:metinf">xml</Format>
      </Meta>
      <Data><License Content="{LicenseBlob}"></Data>
   </Item>
</Exec>

从托管位置将应用部署到用户

如果你从适用于企业的应用商店购买了应用,并且该应用是为脱机许可证指定的,或者该应用是非应用商店应用,则必须从托管位置部署该应用。

下面是此方案的要求:

  • 应用的位置可以是本地文件系统 (C:\StagedApps\app1.appx) 、UNC 路径 (\\server\share\app1.apx) ,也可以是 HTTPS 位置 (https://contoso.com/app1.appx) 。
  • 用户必须具有访问内容位置的权限。 对于 HTTP,可以使用服务器身份验证,或使用与注册关联的证书进行证书身份验证。 HTTP 位置受支持,但不建议这样做,因为缺少身份验证要求。
  • 设备无需连接到Microsoft应用商店、存储服务或启用Microsoft应用商店 UI。
  • 用户必须登录,但不需要与Microsoft Entra标识关联。

注意

必须解锁设备才能部署非应用商店应用,或者必须在部署脱机应用之前部署应用许可证。 有关详细信息,请参阅 将脱机许可证部署到用户

需要包系列名称的 Add 命令,以确保在取消注册时正确删除应用。

  • 下面是业务线应用安装的示例。

    <!-- Add PackageFamilyName -->
    <Add>
       <CmdID>0</CmdID>
       <Item>
          <Target>
             <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName}</LocURI>
          </Target>
       </Item>
    </Add>
    <!-- Install appx -->
    <Exec>
       <CmdID>1</CmdID>
       <Item>
          <Target>
             <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName}/HostedInstall</LocURI>
          </Target>
          <Meta>
             <Format xmlns="syncml:metinf">xml</Format>
          </Meta>
          <Data><Application PackageUri="\\server\share\HelloWorld10.appx" /></Data>
       </Item>
    </Exec>
    
  • 下面是具有依赖项的应用安装示例。

    <!-- Add PackageFamilyName -->
    <Add>
       <CmdID>0</CmdID>
       <Item>
          <Target>
             <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName</LocURI>
          </Target>
       </Item>
    </Add>
    <!-- Install appx with deployment options and framework dependencies-->
    <Exec>
       <CmdID>1</CmdID>
       <Item>
          <Target>
             <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName}/HostedInstall</LocURI>
          </Target>
          <Meta>
             <Format xmlns="syncml:metinf">xml</Format>
          </Meta>
          <Data>
             <Application PackageUri="\\server\share\HelloWorld10.appx" DeploymentOptions="0" >
                <Dependencies>
                          <Dependency PackageUri="\\server\share\HelloWorldFramework.appx" />
                    <Dependency PackageUri="\\server2\share\HelloMarsFramework.appx" />
                </Dependencies>
            </Application>
          </Data>
       </Item>
    </Exec>
    
  • 下面是包含依赖项和可选包的应用安装示例。

    <!-- Add PackageFamilyName -->
    <Add>
       <CmdID>0</CmdID>
       <Item>
          <Target>
             <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName</LocURI>
          </Target>
       </Item>
    </Add>
    <!-- Install appx with deployment options and framework dependencies-->
    <Exec>
       <CmdID>1</CmdID>
       <Item>
          <Target>
             <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName}/HostedInstall</LocURI>
          </Target>
          <Meta>
             <Format xmlns="syncml:metinf">xml</Format>
          </Meta>
          <Data>
             <Application PackageUri="\\server\share\HelloWorld10.appx" DeploymentOptions="0" >
                <Dependencies>
                    <Dependency PackageUri="\\server\share\HelloWorldFramework.appx" />
                    <Dependency PackageUri="\\server2\share\HelloMarsFramework.appx" />
                </Dependencies>
                <OptionalPackages>
                    <Package PackageUri="\\server\share\OptionalPackage1.appx"
                             PackageFamilyName="/{PackageFamilyName}" />
                    <Package PackageUri="\\server2\share\OptionalPackage2.appx"
                             PackageFamilyName="/{PackageFamilyName}" />
                </OptionalPackages>
            </Application>
          </Data>
       </Item>
    </Exec>
    

为设备的所有用户预配应用

预配允许你将应用暂存到设备,并且设备的所有用户都可以在下次登录时注册该应用。 此功能仅支持从适用于企业的应用商店购买的应用,并且该应用是为脱机许可证指定的,或者该应用是非应用商店应用。 必须从托管位置提供应用。 应用作为本地系统安装。 若要安装到本地文件共享,设备的“本地系统”必须有权访问共享。

下面是此方案的要求:

  • 应用的位置可以是本地文件系统 (C:\StagedApps\app1.appx) 、UNC 路径 (\\server\share\app1.apx) 或 HTTPS 位置 (https://contoso.com/app1.appx\)
  • 用户必须具有访问内容位置的权限。 对于 HTTP,可以使用服务器身份验证,或使用与注册关联的证书进行证书身份验证。 HTTP 位置受支持,但不建议这样做,因为缺少身份验证要求。
  • 设备无需连接到 Microsoft Store,也不需要启用存储服务。
  • 设备不需要任何Microsoft Entra标识或域成员身份。
  • 对于 nonStore 应用,设备必须解锁。
  • 对于 Microsoft Store 脱机应用,必须在部署应用之前部署所需的许可证。

若要从托管位置为设备的所有用户预配应用,管理服务器在设备上下文中的 AppInstallation 节点上运行 Add and Exec 命令。 需要包系列名称的 Add 命令,以确保在取消注册时正确删除应用。

注意

删除预配的应用时,不会从已安装该应用的用户中删除该应用。

  • 下面是应用安装的示例:

    <!-- Add PackageFamilyName -->
    <Add>
        <CmdID>0</CmdID>
        <Item>
           <Target>
              <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName</LocURI>
           </Target>
        </Item>
    </Add>
    <!-- Provision appx to device -->
    <Exec>
        <CmdID>1</CmdID>
        <Item>
           <Target>
              <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName}/HostedInstall</LocURI>
           </Target>
           <Meta>
              <Format xmlns="syncml:metinf">xml</Format>
           </Meta>
           <Data><Application PackageUri="\\server\share\HelloWorld10.appx" /></Data>
        </Item>
    </Exec>
    

    HostedInstall Exec 命令包含需要嵌入 XML 的数据节点。 下面是数据 XML 的要求:

    • 应用程序节点具有必需的参数 PackageURI,可以是本地文件位置、UNC 或 HTTPS 位置。
    • 如果需要,可以指定依赖项,以便随包一起安装。 此操作可选。

    DeploymentOptions 参数仅在用户上下文中可用。

  • 下面是使用依赖项安装应用的示例。

    <!-- Add PackageFamilyName -->
    <Add>
        <CmdID>0</CmdID>
        <Item>
           <Target>
              <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName</LocURI>
           </Target>
        </Item>
    </Add>
    <!-- Provision appx with framework dependencies-->
    <Exec>
        <CmdID>1</CmdID>
        <Item>
           <Target>
              <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName}/HostedInstall</LocURI>
           </Target>
           <Meta>
              <Format xmlns="syncml:metinf">xml</Format>
           </Meta>
           <Data>
              <Application PackageUri="\\server\share\HelloWorld10.appx" />
                 <Dependencies>
                          <Dependency PackageUri="\\server\share\HelloWorldFramework.appx" />
                    <Dependency PackageUri="\\server2\share\HelloMarsFramework.appx"/>
                 </Dependencies>
              </Application>
           </Data>
        </Item>
    </Exec>
    

获取应用安装的状态

应用安装完成后,将发送 Windows 通知。 还可以使用 AppInstallation 节点查询 的状态。 下面是可在查询中返回的信息列表:

  • 状态 - 指示应用安装的状态。
    • NOT_INSTALLED (0) - 已添加节点,但未完成执行。
    • 安装 (1) - 执行已开始,但部署尚未完成。 如果部署完成而不考虑成功,则此值将更新。
    • 失败 (2) - 安装失败。 错误的详细信息可以在 LastError 和 LastErrorDescription 下找到。
    • 安装 (3) - 安装成功后,将清理此节点。 如果清理操作尚未完成,则此状态可能会短暂出现。
  • LastError - 应用部署服务器报告的最后一个错误。
  • LastErrorDescription - 描述应用部署服务器报告的最后一个错误。
  • 状态 - 指示应用安装进度的整数。 对于 HTTPS 位置,此状态会显示估计的下载进度。 状态不可用于预配,仅用于基于用户的安装。 对于预配,该值始终为 0。

成功安装应用后,节点将被清理且不再存在。 可以在 AppManagement 节点下报告应用的状态。

  • 下面是特定应用安装的查询示例。

    <!-- Get all app status under AppInstallation for a specific app-->
    <Get>
        <CmdID>2</CmdID>
        <Item>
           <Target>
              <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName}?list=StructData</LocURI>
           </Target>
        </Item>
    </Get>
    
  • 下面是所有应用安装的查询示例。

    <!-- Get all app status under AppInstallation-->
    <Get>
        <CmdID>2</CmdID>
        <Item>
           <Target>
              <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation?list=StructData</LocURI>
           </Target>
        </Item>
    </Get>
    

安装完成警报

应用程序安装可能需要一些时间才能完成。 因此,它们是异步完成的。 Exec 命令完成后,客户端会向管理服务器发送一条通知,其中包含状态,无论它是失败还是成功。

下面是警报的示例。

<Alert>
    <CmdID>4</CmdID>
    <Data>1226</Data>
        <Item>
            <Source>
                <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppInstallation/{PackageFamilyName}/HostedInstall</LocURI>
            </Source>
            <Meta>
                <Type xmlns="syncml:metinf">Reversed-Domain-Name:com.microsoft.mdm.EnterpriseHostedAppInstall.result</Type>
                <Format xmlns="syncml:metinf">int</Format>
            </Meta>
            <Data>0</Data>
        </Item>
</Alert>

对于基于用户的安装,请使用 ./User 路径;对于预配应用,请使用 ./Device 路径。

“数据”字段值为 0 (零) 表示成功。 否则为错误代码。 如果出现故障,可以从 AppInstallation 节点获取更多详细信息。

注意

目前,应用商店应用安装警报不可用。

卸载应用

你可以从 Windows 设备中卸载用户的应用。 若要卸载应用,请从 CSP 的 AppManagement 节点将其删除。 在 AppManagement 节点中,包根据其源根据以下节点进行组织:

  • AppStore - 这些应用适用于 Microsoft 应用商店。 应用可以直接从应用商店安装,也可以从适用于企业的应用商店交付到企业。
  • nonStore - 这些应用不是从 Microsoft Store 获取的。
  • 系统 - 这些应用是操作系统的一部分。 无法卸载这些应用。

若要卸载应用,请在源节点、包系列名称和包全名下将其删除。 若要卸载 XAP,请使用产品 ID 代替包系列名称和包全名。

下面是为用户卸载应用的所有版本的示例。

<!-- Uninstall App for a Package Family-->
<Delete>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement/AppStore/{PackageFamilyName}</LocURI>
      </Target>
   </Item>
</Delete>

-下面是一个为用户卸载特定版本的应用的示例。

<!-- Uninstall App for a specific package full name-->
<Delete>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement/AppStore/{PackageFamilyName}/{PackageFullName}</LocURI>
      </Target>
   </Item>
</Delete>

从设备中删除了预配的应用

可以从设备中删除特定版本或包系列的所有版本的预配应用。 删除预配的应用后,该设备的未来用户无法使用该应用。 已注册应用的已登录用户继续有权访问该应用。 如果要删除这些用户的应用,则必须显式卸载这些用户的应用。

注意

只能删除清单值为 IsProvisioned = 1 的应用。

删除预配的应用发生在设备上下文中。

  • 下面是从设备中删除预配应用的示例。

    <!- Remove Provisioned App for a Package Family-->
    <Delete>
        <CmdID>1</CmdID>
        <Item>
           <Target>
              <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement/AppStore/{PackageFamilyName}</LocURI>
           </Target>
        </Item>
    </Delete>
    
  • 下面是从设备中删除预配应用的特定版本的示例:

    <!-- Remove Provisioned App for a specific package full name-->
    <Delete>
        <CmdID>1</CmdID>
        <Item>
           <Target>
              <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement/AppStore/{PackageFamilyName}/{PackageFullName}</LocURI>
           </Target>
        </Item>
    </Delete>
    

删除应用商店应用许可证

可以根据内容 ID 从每个应用的设备中删除应用许可证。

  • 下面是删除用户应用许可证的示例。

    <!-- Remove App License for a User-->
    <Delete>
        <CmdID>1</CmdID>
        <Item>
           <Target>
              <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppLicenses/StoreLicenses/{license id}</LocURI>
           </Target>
        </Item>
    </Delete>
    
  • 下面是删除预配包的应用许可证的示例, (设备上下文) 。

    <!-- Remove App License for a provisioned package (device) -->
    <Delete>
        <CmdID>1</CmdID>
        <Item>
           <Target>
              <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppLicenses/StoreLicenses/{license id}</LocURI>
           </Target>
        </Item>
    </Delete>
    

应用卸载警报

卸载应用可能需要一段时间才能完成。 因此,卸载以异步方式运行。 Exec 命令完成后,客户端会向管理服务器发送一条通知,其中包含状态,无论它是失败还是成功。

对于基于用户的卸载,请在 LocURI 中使用 ./User;对于预配,请在 LocURI 中使用 ./Device。

下面提供了一个示例。 托管和存储应用只有一次卸载。

<Alert>
    <Data>1226</Data>
    <Item>
        <Source>
            <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement/{PackageFamilyName}</LocURI>
        </Source>
        <Meta>
            <Type xmlns="syncml:metinf">Reversed-Domain-Name:com.microsoft.mdm.EnterpriseAppUninstall.result</Type>
            <Format xmlns="syncml:metinf">int</Format>
        </Meta>
        <Data>0</Data>
    </Item>
</Alert>

更新应用

可以使用管理服务器更新设备上安装的应用。 可以直接从应用商店更新应用,也可以从托管位置安装应用。

直接从应用商店更新应用

若要从 Microsoft 应用商店更新应用,设备需要与应用商店服务联系。

  • 下面是更新扫描的示例。

    <!- Initiate a update scan for a user-->
    <Exec>
        <CmdID>1</CmdID>
        <Item>
           <Target>
              <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement/UpdateScan</LocURI>
           </Target>
        </Item>
    </Exec>
    
  • 下面是状态检查的示例。

    <!- Get last error related to the update scan-->
    <Get>
        <CmdID>1</CmdID>
        <Item>
           <Target>
              <LocURI>./User/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement/LastScanError</LocURI>
           </Target>
        </Item>
    </Get>
    

从托管位置更新应用

更新现有应用的过程与初始安装过程相同。 有关详细信息,请参阅 从托管位置将应用部署到用户

更新预配的应用

将应用更新发送给用户时,预配的应用会自动更新。 还可以使用与初始预配相同的过程更新预配的应用。 有关初始预配的详细信息,请参阅 为设备的所有用户预配应用

阻止应用自动更新

可以阻止特定应用自动更新。 此功能允许你为应用启用自动更新,其中排除了 IT 管理员定义的特定应用。

关闭更新仅适用于设备级别的 Microsoft Store 中的更新。 此功能在用户级别不可用。 如果从托管安装位置推送脱机包,你仍然可以更新应用。

下面提供了一个示例。

<!- Prevent app from being automatically updated-->
<Replace>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./Device/Vendor/MSFT/EnterpriseModernAppManagement/AppManagement/AppStore/{PackageFamilyName}/DoNotUpdate</LocURI>
         </Target>
      <Meta>
         <Format xmlns="syncml:metinf">int</Format>
         <Type xmlns="syncml:metinf">text/plain</Type>
      </Meta>
      <Data>1</Data></Item>
</Replace>

更多应用管理方案

以下小节提供了有关更多设置配置的信息。

启用共享用户应用数据

通用 Windows 应用可以在设备的用户之间共享应用程序数据。 可以在包系列级别或每个设备设置共享数据的功能。

注意

这仅适用于多用户设备。

ApplicationManagement/AllowSharedUserAppData 策略启用或禁用应用包,以便在有多个用户时在应用包之间共享数据。 如果启用此策略,应用程序可以在其包系列中的包之间共享数据。 可以通过该包系列和本地计算机的 ShareLocal 文件夹共享数据。 此文件夹可通过 Windows.Storage API 使用。

如果禁用此策略,应用程序无法在多个用户之间共享用户应用程序数据。 但是,预写共享数据仍然存在。 若要清理预写共享数据,请使用 DISM (/Get-ProvisionedAppxPackage 检测是否存在任何共享数据,并 /Remove-SharedAppxData) 将其删除。

有效值为 0 (off、默认值) 和 1 () 。

下面提供了一个示例。

<!-- Get policy (Default)-->
<Get>
   <CmdID>1</CmdID>
   <Item>
      <Target>
         <LocURI>./Vendor/MSFT/Policy/Result/ApplicationManagement/AllowSharedUserAppData?list=StructData</LocURI>
      </Target>
   </Item>
</Get>
<!-- Update policy -->
<Replace>
   <CmdID>2</CmdID>
   <Item>
      <Target>
         <LocURI>./Vendor/MSFT/Policy/Config/ApplicationManagement/AllowSharedUserAppData</LocURI>
      </Target>
   <Meta>
      <Format>int</Format>
      <Type>text/plain</Type>
   </Meta>
   <Data>1</Data>
   </Item>
</Replace>