了解 ADMX 策略

由于设备更加简单且易于成为目标,企业企业发现将其电脑管理迁移到基于云的设备管理解决方案越来越有利。 遗憾的是,新式 Windows 电脑设备管理解决方案缺少传统电脑管理解决方案中支持的关键策略和应用设置配置功能。

移动设备管理 (MDM) 策略配置支持已扩展,允许通过策略配置服务提供商 (CSP) 访问所选的一组组策略管理模板 (适用于 Windows 电脑的 ADMX 策略) 。 这种扩展的访问权限可确保企业能够使其设备符合要求,并防止其通过云管理的设备的安全风险。

Background

除了标准 MDM 策略,策略 CSP 还可以处理所选的 ADMX 策略集。 在 ADMX 策略中,管理模板包含 Windows 组策略的元数据,可以在电脑上的本地组策略 编辑器中编辑。 每个管理模板指定与组策略关联的注册表项 (及其值) ,并定义可以管理的策略设置。 管理模板将组策略组织在层次结构中,其中分层路径中的每个段都定义为一个类别。 组策略管理模板中的每个设置都对应于特定的注册表值。 这些组策略设置以基于标准的 XML 文件格式定义,称为 ADMX 文件。 有关详细信息,请参阅 组策略 ADMX 语法参考指南

ADMX 文件可以描述 Windows 附带的操作系统 (操作系统) 组策略,也可以描述应用程序设置,这些设置与操作系统分开,通常可在电脑上下载和安装。 根据他们控制 (OS 或应用程序) 设置的特定类别,可在本地组策略 编辑器的以下两个位置找到管理模板设置:

  • OS 设置:计算机配置/管理模板
  • 应用程序设置:用户配置/管理模板

在域控制器/组策略生态系统中,每当客户端计算机处理组策略时,管理模板客户端扩展 (CSE) 会自动将组策略添加到客户端计算机或用户配置文件的注册表。 相反,在 MDM 管理的客户端中,应用 ADMX 文件来定义独立于组策略的策略。 因此,在 MDM 托管的客户端中,不需要组策略基础结构,包括组策略服务 (gpsvc.exe) 。

ADMX 文件可以随位于 %SystemRoot%\policydefinitions) 的 Windows (一起提供,也可以通过策略 CSP URI (./Vendor/MSFT/Policy/ConfigOperations/ADMXInstall) 引入设备。 收件箱 ADMX 文件在 OS 生成时处理到 MDM 策略中。 引入的 ADMX 文件在 OS 发送后通过策略 CSP 处理到 MDM 策略中。 由于策略 CSP 不依赖于组策略客户端堆栈的任何方面(包括电脑的组策略服务 (GPSvc) ),因此引入设备的策略处理程序能够对 MDM 设置的策略做出反应。

Windows 通过分析关联的 ADMX 文件、查找指定的组策略,并将定义 (元数据) 存储在 MDM 策略 CSP 客户端存储中,将组策略的名称和类别路径映射到 MDM 策略区域和策略名称。 当 MDM 策略包含 SyncML 命令和策略 CSP URI 时, .\[device|user]\vendor\msft\policy\[config|result]\<area>\<policy>将引用此元数据,并确定设置或删除哪些注册表项。 有关 MDM 支持的 ADMX 策略列表,请参阅 策略 CSP - ADMX 策略

ADMX 文件和组策略 编辑器

若要捕获 ADMX 组策略的端到端 MDM 处理,IT 管理员必须使用 UI(如 组策略 编辑器 (gpedit.msc) )来收集必要的数据。 MDM ISV 控制台 UI 确定如何从 IT 管理员收集所需的组策略数据。 ADMX 组策略在层次结构中组织,可以具有计算机和/或用户的范围。 下一部分中组策略示例使用名为“发布服务器 2 设置”的计算机范围的组策略。选中此组策略后,其可用状态为“未配置”、“已启用”“已禁用”。

MDM ISV 用于确定向 IT 管理员显示的 UI 的 ADMX 文件与客户端用于策略定义的 ADMX 文件相同。 ADMX 文件由操作系统在生成时处理,或由客户端在 OS 运行时设置。 在任一情况下,客户端和 MDM ISV 都必须与 ADMX 策略定义同步。 每个 ADMX 文件对应于组策略类别,通常包含多个策略定义,其中每个定义表示单个组策略。 例如,“发布服务器 2 设置”的策略定义包含在 appv.admx 文件中,该文件包含 Microsoft Application Virtualization (App-V) 组策略 类别的策略定义。

组策略选项按钮设置:

  • 如果选择 “启用” ,则会在 UI 中为用户显示必要的数据输入控件。 当 IT 管理员输入数据并选择“ 应用”时,会发生以下事件:

    • MDM ISV 服务器使用包含用户输入的数据的有效负载设置 Replace SyncML 命令。
    • MDM 客户端堆栈接收此数据,这会导致策略 CSP 根据 ADMX 策略定义更新设备的注册表。
  • 如果选择 “禁用 ”并选择“ 应用”,则会发生以下事件:

    • MDM ISV 服务器设置一个 Replace SyncML 命令,并将有效负载设置为 <disabled\>
    • MDM 客户端堆栈接收此命令,这会导致策略 CSP 根据 ADMX 策略定义指示的状态更改删除设备的注册表设置和/或设置注册表项。
  • 如果选择了 “未配置” 并选择“ 应用”,则会发生以下事件:

    • MDM ISV 服务器设置 Delete SyncML 命令。
    • MDM 客户端堆栈接收此命令,这会导致策略 CSP 根据 ADMX 策略定义删除设备的注册表设置。

下图显示了组策略 编辑器的main显示。

组策略编辑器。

下图显示了组策略 编辑器中“发布服务器 2 设置”组策略的设置。

组策略发布服务器 2 设置。

大多数组策略都是简单的布尔类型。 对于布尔组策略,如果选择“已启用”,则选项面板不包含任何数据输入字段,并且 SyncML 的有效负载只是 <enabled/>。 但是,如果选项面板中存在数据输入字段,则 MDM 服务器必须提供此数据。 以下启用组策略示例说明了这种复杂性。 在此示例中,有效负载中的标记描述了 <data /> 10 个名称值对,这些标记对应于“发布服务器 2 设置”组策略组策略 编辑器选项面板中的 10 个数据输入字段。 定义组策略的 ADMX 文件由 MDM 服务器使用,类似于组策略 编辑器使用它的方式。 组策略 编辑器显示一个 UI 来接收完整的组策略实例数据,MDM 服务器的 IT 管理员控制台也必须执行此操作。 对于 ADMX 策略定义中的每个 <text> 元素和 ID 属性,有效负载中必须有相应的 <data /> 元素和 ID 属性。 ADMX 文件驱动策略定义,并且是 MDM 服务器通过 SyncML 协议所必需的。

重要提示

必须在 SyncML 有效负载的编码 XML 中提供组策略 编辑器组策略页中显示的任何数据输入字段。 SyncML 数据有效负载等效于用户通过 GPEdit.msc 提供的组策略数据。

有关组策略说明格式的详细信息,请参阅管理模板文件 (ADMX) 格式。 元素可以是 Text、MultiText、Boolean、Enum、Decimal 或 List (,有关详细信息,请参阅 策略元素) 。

例如,如果在 appv.admx 文件中的 “启用策略 ”示例及其相应的 ADMX 策略定义中搜索字符串“Publishing_Server2_Name_Prompt”,则会发现以下情况:

启用策略示例:

`<data id="Publishing_Server2_Name_Prompt" value="name"/>`

Appv.admx 文件:

      <elements>
        <text id="Publishing_Server2_Name_Prompt" valueName="Name" required="true"/>

ADMX 策略示例

以下 SyncML 示例介绍如何设置由 ADMX 模板定义的 MDM 策略,特别是应用程序虚拟化 ADMX 文件 appv.admx 中的Publishing_Server2_Policy 组策略说明。 此组策略管理的功能并不重要;它仅用于说明 MDM ISV 如何设置 ADMX 策略。 这些 SyncML 示例演示了常见选项和可用于测试策略的相应 SyncML 代码。 SyncML 的有效负载必须是 XML 编码的;对于此 XML 编码,可以使用收藏的联机工具。 若要避免对有效负载进行编码,可以使用 CData(如果 MDM 支持)。 有关详细信息,请参阅 CDATA 节

启用策略

有效负载

<enabled/>
<data id="Publishing_Server2_Name_Prompt" value="Name"/>
<data id="Publishing_Server_URL_Prompt" value="http://someuri"/>
<data id="Global_Publishing_Refresh_Options" value="1"/>
<data id="Global_Refresh_OnLogon_Options" value="0"/>
<data id="Global_Refresh_Interval_Prompt" value="15"/>
<data id="Global_Refresh_Unit_Options" value="0"/>
<data id="User_Publishing_Refresh_Options" value="0"/>
<data id="User_Refresh_OnLogon_Options" value="0"/>
<data id="User_Refresh_Interval_Prompt" value="15"/>
<data id="User_Refresh_Unit_Options" value="1"/>

请求 SyncML

<?xml version="1.0" encoding="utf-8"?>
<SyncML xmlns="SYNCML:SYNCML1.2">
  <SyncBody>
    <Replace>
      <CmdID>2</CmdID>
      <Item>
        <Meta>
          <Format>chr</Format>
          <Type>text/plain</Type>
        </Meta>
        <Target>
          <LocURI>./Device/Vendor/MSFT/Policy/Config/AppVirtualization/PublishingAllowServer2</LocURI>
        </Target>
        <Data>
        <![CDATA[<enabled/><data id="Publishing_Server2_Name_Prompt" value="name prompt"/><data
          id="Publishing_Server_URL_Prompt" value="URL prompt"/><data
          id="Global_Publishing_Refresh_Options" value="1"/><data
          id="Global_Refresh_OnLogon_Options" value="0"/><data
          id="Global_Refresh_Interval_Prompt" value="15"/><data
          id="Global_Refresh_Unit_Options" value="0"/><data
          id="User_Publishing_Refresh_Options" value="0"/><data
          id="User_Refresh_OnLogon_Options" value="0"/><data
          id="User_Refresh_Interval_Prompt" value="15"/><data
          id="User_Refresh_Unit_Options" value="1"/>]]>
        </Data>
      </Item>
    </Replace>
    <Final/>
  </SyncBody>
</SyncML>

响应 SyncML

<Status>
  <CmdID>2</CmdID>
  <MsgRef>1</MsgRef>
  <CmdRef>2</CmdRef>
  <Cmd>Replace</Cmd>
  <Data>200</Data>
</Status>

禁用策略

有效负载

<disabled/>

请求 SyncML

<?xml version="1.0" encoding="utf-8"?>
<SyncML xmlns="SYNCML:SYNCML1.2">
  <SyncBody>
    <Replace>
      <CmdID>2</CmdID>
      <Item>
        <Meta>
          <Format>chr</Format>
          <Type>text/plain</Type>
        </Meta>
        <Target>
          <LocURI>./Device/Vendor/MSFT/Policy/Config/AppVirtualization/PublishingAllowServer2</LocURI>
        </Target>
        <Data><![CDATA[<disabled/>]]></Data>
      </Item>
    </Replace>
    <Final/>
  </SyncBody>
</SyncML>

响应 SyncML

<Status>
  <CmdID>2</CmdID>
  <MsgRef>1</MsgRef>
  <CmdRef>2</CmdRef>
  <Cmd>Replace</Cmd>
  <Data>200</Data>
</Status>

将策略设置为未配置

有效负载

(无)

请求 SyncML

<?xml version="1.0" encoding="utf-8"?>
<SyncML xmlns="SYNCML:SYNCML1.2">
  <SyncBody>
    <Delete>
      <CmdID>1</CmdID>
      <Item>
        <Target>
          <LocURI>./Device/Vendor/MSFT/Policy/Config/AppVirtualization/PublishingAllowServer2</LocURI>
        </Target>
      </Item>
    </Delete>
    <Final/>
  </SyncBody>
</SyncML>

响应 SyncML

<Status>
  <CmdID>2</CmdID>
  <MsgRef>1</MsgRef>
  <CmdRef>1</CmdRef>
  <Cmd>Delete</Cmd>
  <Data>200</Data>
</Status>

各种 ADMX 元素的示例 SyncML

本部分介绍各种 ADMX 元素(如 Text、Multi-Text、Decimal、Boolean 和 List)的示例 SyncML。

如何将组策略策略类别路径和名称映射到 MDM 区域和策略名称

下面是组策略到 MDM 区域和名称的内部 OS 映射。 此映射是一组 Windows 清单的一部分,当编译时,该清单会分析关联的 ADMX 文件,找到指定的组策略策略,并将该定义 (元数据) 存储在 MDM Policy CSP 客户端存储中。 ADMX 支持的策略按层次结构进行组织。 其范围可以是 计算机用户,也可以同时具有 两者的作用域。 通过 SyncML 命令和策略 CSP URI 引用 MDM 策略时,将引用此元数据,并确定设置或删除的注册表项。 计算机范围策略通过 .\Device 引用,用户范围策略通过 .\User 引用。

./[Device|User]/Vendor/MSFT/Policy/Config/[config|result]/<area>/<policy>

需要对 SyncML 的数据有效负载进行编码,以便它不会与样板 SyncML XML 标记冲突。 使用此联机工具对策略数据 编码器的工具箱进行编码和解码。

AppVirtualization 区域的清单代码片段

<identity xmlns="urn:Microsoft.CompPlat/ManifestSchema.v1.00"  xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" owner="Microsoft" namespace="Windows-DeviceManagement-PolicyDefinition" name="AppVirtualization">
  <policyDefinitions>
    <area name="AppVirtualization">
      <policies>
         ...
         <stringPolicy name="PublishingAllowServer2" notSupportedOnPlatform="phone" admxbacked="appv.admx" scope="machine">
            <ADMXPolicy area="appv~AT~System~CAT_AppV~CAT_Publishing" name="Publishing_Server2_Policy" scope="machine" />
           <registryKeyRedirect path="SOFTWARE\Policies\Microsoft\AppV\Client\Publishing\Servers\2" />
         </stringPolicy >
         ...

上述 GP 策略的 LocURI 为:

./Device/Vendor/MSFT/Policy/Config/AppVirtualization/PublishingAllowServer2

若要使用以下示例为区域/策略构造 SyncML,需要更新 SyncML 部分中的数据 ID<Data>。 以“&”字符为前缀的项是所需的转义字符,可以保留,如下所示。

Text 元素

元素 text 仅对应于字符串,对应于 gpedit.msc 显示的策略面板中的编辑框。 字符串存储在 REG_SZ 类型的注册表中。

ADMX 文件:inetres.admx

<policy name="RestrictHomePage" class="User" displayName="$(string.RestrictHomePage)" explainText="$(string.IE_ExplainRestrictHomePage)" presentation="$(presentation.RestrictHomePage)" key="Software\Policies\Microsoft\Internet Explorer\Control Panel" valueName="HomePage">
  <parentCategory ref="InternetExplorer" />
  <supportedOn ref="SUPPORTED_IE5" />
  <elements>
    <text id="EnterHomePagePrompt" key="Software\Policies\Microsoft\Internet Explorer\Main" valueName="Start Page" required="true" />
  </elements>
</policy>

相应的 SyncML

<?xml version="1.0" encoding="utf-8"?>
<SyncML xmlns="SYNCML:SYNCML1.2">
  <SyncBody>
    <Replace>
      <CmdID>$CmdId$</CmdID>
      <Item>
        <Meta>
          <Format>chr</Format>
          <Type>text/plain</Type>
        </Meta>
        <Target>
          <LocURI>./User/Vendor/MSFT/Policy/Config/InternetExplorer/DisableHomePageChange</LocURI>
        </Target>
        <Data><![CDATA[<enabled/><data id="EnterHomePagePrompt" value="mystartpage"/>]]></Data>
      </Item>
    </Replace>
    <Final/>
  </SyncBody>
</SyncML>

MultiText 元素

元素 multiText 仅对应于REG_MULTISZ注册表字符串,对应于在 gpedit.msc 显示的策略面板中输入多个字符串的网格。 SyncML 中的每个字符串都应由 Unicode 字符分隔0xF000 (编码版本: &#xF000;)

<policy name="Virtualization_JITVAllowList" class="Machine" displayName="$(string.Virtualization_JITVAllowList)"
        explainText="$(string.Virtualization_JITVAllowList_Help)" presentation="$(presentation.Virtualization_JITVAllowList)"
          key="SOFTWARE\Policies\Microsoft\AppV\Client\Virtualization"
          valueName="ProcessesUsingVirtualComponents">
    <parentCategory ref="CAT_Virtualization" />
    <supportedOn ref="windows:SUPPORTED_Windows7" />
    <elements>
    <multiText id="Virtualization_JITVAllowList_Prompt" valueName="ProcessesUsingVirtualComponents" />
    </elements>
</policy>

相应的 SyncML

<?xml version="1.0" encoding="utf-8"?>
<SyncML xmlns="SYNCML:SYNCML1.2">
  <SyncBody>
    <Replace>
      <CmdID>2</CmdID>
      <Item>
        <Meta>
          <Format>chr</Format>
          <Type>text/plain</Type>
        </Meta>
        <Target>
          <LocURI>./Device/Vendor/MSFT/Policy/Config/AppVirtualization/VirtualComponentsAllowList</LocURI>
        </Target>
        <Data><![CDATA[<enabled/><data id="Virtualization_JITVAllowList_Prompt" value="C:\QuickPatch\TEST\snot.exe&#xF000;C:\QuickPatch\TEST\foo.exe&#xF000;C:\QuickPatch\TEST\bar.exe"/>]]></Data>
      </Item>
    </Replace>
    <Final/>
  </SyncBody>
</SyncML>

List 元素 (及其变体)

元素 list 仅对应于REG_SZ注册表字符串的 hive,对应于在 gpedit.msc 显示的策略面板中输入多个字符串的网格。 此元素在 SyncML 中如何表示为包含字符串对的字符串。 每对都是REG_SZ名称/值键。 最好通过 gpedit.msc 应用策略, (以管理员) 身份运行,然后转到注册表配置单元位置并查看列表值的存储方式。 此位置可让你了解名称/值对的存储方式,以便通过 SyncML 来表达它。

注意

SyncML 中的每个字符串都应由 Unicode 字符分隔0xF000 (编码版本: &#xF000;) 。

元素的 list 变体由属性决定。 策略管理器运行时会忽略这些属性。 预计 MDM 服务器管理名称/值对。 下面是组策略列表的一些示例。

ADMX 文件:inetres.admx

<policy name="SecondaryHomePages" class="Both" displayName="$(string.SecondaryHomePages)" explainText="$(string.IE_ExplainSecondaryHomePages)" presentation="$(presentation.SecondaryHomePages)" key="Software\Policies\Microsoft\Internet Explorer\Main\SecondaryStartPages">
  <parentCategory ref="InternetExplorer" />
  <supportedOn ref="SUPPORTED_IE8" />
  <elements>
    <list id="SecondaryHomePagesList" additive="true" />
  </elements>
</policy>

相应的 SyncML

<SyncML xmlns="SYNCML:SYNCML1.2">
  <SyncBody>
    <Replace>
      <CmdID>2</CmdID>
      <Item>
        <Meta>
          <Format>chr</Format>
          <Type>text/plain</Type>
        </Meta>
        <Target>
          <LocURI>./User/Vendor/MSFT/Policy/Config/InternetExplorer/DisableSecondaryHomePageChange</LocURI>
        </Target>
        <Data><![CDATA[<Enabled/><Data id="SecondaryHomePagesList" value="http://name1&#xF000;http://name1&#xF000;http://name2&#xF000;http://name2"/>]]></Data>
      </Item>
    </Replace>
    <Final/>
  </SyncBody>
</SyncML>

无元素

<policy name="NoUpdateCheck" class="Machine" displayName="$(string.NoUpdateCheck)" explainText="$(string.IE_ExplainNoUpdateCheck)" key="Software\Policies\Microsoft\Internet Explorer\Infodelivery\Restrictions" valueName="NoUpdateCheck">
  <parentCategory ref="InternetExplorer" />
  <supportedOn ref="SUPPORTED_IE5_6" />
</policy>

相应的 SyncML

<SyncML xmlns="SYNCML:SYNCML1.2">
  <SyncBody>
    <Replace>
      <CmdID>2</CmdID>
      <Item>
        <Meta>
          <Format>chr</Format>
          <Type>text/plain</Type>
        </Meta>
        <Target>
          <LocURI>./Device/Vendor/MSFT/Policy/Config/InternetExplorer/DisableUpdateCheck</LocURI>
        </Target>
        <Data><![CDATA[<Enabled/>]]></Data>
      </Item>
    </Replace>
    <Final/>
  </SyncBody>
</SyncML>

枚举

<policy name="EncryptionMethodWithXts_Name" class="Machine" displayName="$(string.EncryptionMethodWithXts_Name)" explainText="$(string.EncryptionMethodWithXts_Help)" presentation="$(presentation.EncryptionMethodWithXts_Name)" key="SOFTWARE\Policies\Microsoft\FVE">
    <parentCategory ref="FVECategory" />
    <!--Bug OS:4242178 -->
    <supportedOn ref="windows:SUPPORTED_Windows_10_0" />
    <elements>
        <enum id="EncryptionMethodWithXtsOsDropDown_Name" valueName="EncryptionMethodWithXtsOs" required="true">
            <item displayName="$(string.EncryptionMethodDropDown_AES128_Name2)">
                <value>
                    <decimal value="3" />
                </value>
            </item>
            <item displayName="$(string.EncryptionMethodDropDown_AES256_Name2)">
                <value>
                    <decimal value="4" />
                </value>
            </item>
            <item displayName="$(string.EncryptionMethodDropDown_XTS_AES128_Name)">
                <value>
                    <decimal value="6" />
                </value>
            </item>
            <item displayName="$(string.EncryptionMethodDropDown_XTS_AES256_Name)">
                <value>
                    <decimal value="7" />
                </value>
            </item>
        </enum>
   </elements>
</policy>

相应的 SyncML

<SyncML xmlns="SYNCML:SYNCML1.2">
  <SyncBody>
    <Replace>
      <CmdID>2</CmdID>
      <Item>
        <Target>
          <LocURI>./Device/Vendor/MSFT/Policy/Config/BitLocker/EncryptionMethodByDriveType</LocURI>
        </Target>
        <Data>
          <![CDATA[<enabled/>
          <data id="EncryptionMethodWithXtsOsDropDown_Name" value="4"/>]]>
        </Data>
      </Item>
    </Replace>
    <Final/>
  </SyncBody>
</SyncML>

Decimal 元素

<policy name="Streaming_Reestablishment_Interval" class="Machine" displayName="$(string.Streaming_Reestablishment_Interval)"
            explainText="$(string.Streaming_Reestablishment_Interval_Help)"
            presentation="$(presentation.Streaming_Reestablishment_Interval)"
            key="SOFTWARE\Policies\Microsoft\AppV\Client\Streaming">
    <parentCategory ref="CAT_Streaming" />
    <supportedOn ref="windows:SUPPORTED_Windows7" />
    <elements>
        <decimal id="Streaming_Reestablishment_Interval_Prompt" valueName="ReestablishmentInterval" minValue="0" maxValue="3600"/>
    </elements>
</policy>

相应的 SyncML

<SyncML xmlns="SYNCML:SYNCML1.2">
  <SyncBody>
    <Replace>
      <CmdID>2</CmdID>
      <Item>
        <Target>
          <LocURI>./Device/Vendor/MSFT/Policy/Config/AppVirtualization/StreamingAllowReestablishmentInterval</LocURI>
        </Target>
        <Data>
          <![CDATA[<enabled/>
          <data id="Streaming_Reestablishment_Interval_Prompt" value="4"/>]]>
        </Data>
      </Item>
    </Replace>
    <Final/>
  </SyncBody>
</SyncML>

布尔元素

<policy name="DeviceInstall_Classes_Deny" class="Machine" displayName="$(string.DeviceInstall_Classes_Deny)" explainText="$(string.DeviceInstall_Classes_Deny_Help)" presentation="$(presentation.DeviceInstall_Classes_Deny)" key="Software\Policies\Microsoft\Windows\DeviceInstall\Restrictions" valueName="DenyDeviceClasses">
    <parentCategory ref="DeviceInstall_Restrictions_Category" />
    <supportedOn ref="windows:SUPPORTED_WindowsVista" />
    <enabledValue>
    <decimal value="1" />
    </enabledValue>
    <disabledValue>
    <decimal value="0" />
    </disabledValue>
    <elements>
        <list id="DeviceInstall_Classes_Deny_List" key="Software\Policies\Microsoft\Windows\DeviceInstall\Restrictions\DenyDeviceClasses" valuePrefix="" />
        <boolean id="DeviceInstall_Classes_Deny_Retroactive" valueName="DenyDeviceClassesRetroactive" >
            <trueValue>
                <decimal value="1" />
            </trueValue>
            <falseValue>
                <decimal value="0" />
            </falseValue>
        </boolean>
    </elements>
</policy>

相应的 SyncML

<?xml version="1.0" encoding="utf-8"?>
<SyncML xmlns="SYNCML:SYNCML1.2">
  <SyncBody>
    <Replace>
      <CmdID>2</CmdID>
      <Item>
        <Meta>
          <Format>chr</Format>
          <Type>text/plain</Type>
        </Meta>
        <Target>
          <LocURI>./Device/Vendor/MSFT/Policy/Config/DeviceInstallation/PreventInstallationOfMatchingDeviceSetupClasses</LocURI>
        </Target>
        <Data>
          <![CDATA[<enabled/><data id="DeviceInstall_Classes_Deny_Retroactive" value="true"/>
          <Data id="DeviceInstall_Classes_Deny_List" value="1&#xF000;deviceId1&#xF000;2&#xF000;deviceId2"/>]]>
        </Data>
      </Item>
    </Replace>
    <Final/>
  </SyncBody>
</SyncML>