UE-V (Windows 10) 的应用程序模板架构参考

用户体验虚拟化 (UE-V) 使用 XML 设置位置模板来定义 UE-V 捕获和应用的桌面应用程序设置和 Windows 设置。 UE-V 包括一组默认设置位置模板。 还可以使用 UE-V 模板生成器创建自定义设置位置模板。

高级用户可以自定义设置位置模板的 XML 文件。 本主题详细介绍了 UE-V 设置位置模板的 XML 结构,并提供编辑这些文件的指导。

UE-V 应用程序模板架构参考

本部分详细介绍 UE-V 设置位置模板的 XML 结构,并提供编辑此文件的指南。

本部分内容

XML 声明和编码属性

必需:True类型:字符串

XML 声明必须指定 xml 版本 1.0 属性 (<?xml version=“1.0”>) 。 UE-V 模板生成器创建的设置位置模板保存在 UTF-8 编码中,但未显式指定编码。 建议在此元素中包含 encoding=“UTF-8”属性作为最佳做法。 产品附带的所有模板都指定了此标记, (查看 %ProgramFiles%\Microsoft 用户体验虚拟化\Templates 中的文档以供参考) 。 例如:

<?xml version="1.0" encoding="UTF-8"?>

命名空间和根元素

必需:True类型:字符串

UE-V 对所有应用程序使用 https://schemas.microsoft.com/UserExperienceVirtualization/2012/SettingsLocationTemplate 命名空间。 SettingsLocationTemplate 是根元素,包含所有其他元素。 使用以下标记引用所有模板中的 SettingsLocationTemplate:

<SettingsLocationTemplate xmlns='https://schemas.microsoft.com/UserExperienceVirtualization/2012/SettingsLocationTemplate'>

数据类型

这些数据类型是 UE-V 应用程序模板架构的数据类型。

GuidGUID 描述格式为“\{a-fA-F0-9]-[a-fA-F0-9]{8}{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]-[a-fA-F0-9]{4}{12}\}”格式的标准全局唯一标识符正则表达式。 此 GUID 在 Filesetting\Root\KnownFolder 元素中用于验证已知文件夹的格式设置。

FilenameString FilenameString 是指要监视的进程的文件名。 其值受正则表达式的限制 [^\\\?\*\|<>/:]+, (即,它们不能包含反斜杠字符、星号或问号野生卡字符、管道字符、大于或小于符号、正斜杠或冒号字符) 。

IDString IDString 是指 Application 元素、SettingsLocationTemplate 和 Common 元素的 ID 值, (用于描述) 共享公共设置的应用程序套件。 它受 FilenameString ([^\\\?\\\|<> 相同的正则表达式的限制/:]+) 。

TemplateVersion TemplateVersion 是一个整数值,用于描述设置位置模板的修订。 其值的范围可以是 0 到 2147483647。

空表示 null 值。 此数据类型在 Process\ShellProcess 中用于指示没有要监视的进程。 不应在任何应用程序模板中使用此值。

作者 Author 数据类型是标识模板作者的复杂类型。 它包含两个子元素:NameEmail。 在 Author 数据类型中,Name 元素是必需的,而 Email 元素是可选的。 SettingsLocationTemplate 元素下更详细地描述了此类型。

范围 Range 定义由两个子元素组成的整数类: MinimumMaximum。 此数据类型在 ProcessVersion 数据类型中实现。 如果指定,则必须同时包含最小值和最大值。

ProcessVersion ProcessVersion 定义了具有四个子元素的类型: MajorMinorBuildPatch。 Process 元素使用此数据类型来填充其 ProductVersion 和 FileVersion 值。 此类型的数据是 Range 值。 Major 子元素是必需的,其他子元素是可选的。

建筑 体系结构枚举两个可能的值: Win32Win64。 这些值用于指定进程体系结构。

过程 Process 数据类型是用于描述要由 UE-V 监视的进程的容器。 它包含六个子元素: FilenameArchitectureProductNameFileDescriptionProductVersionFileVersion。 下表详细介绍了每个元素各自的数据类型:

元素 数据类型 Mandatory
文件名 FilenameString True
体系结构 体系结构 False
ProductName 字符串 False
FileDescription 字符串 False
ProductVersion ProcessVersion False
FileVersion ProcessVersion False

过程 Process 数据类型表示一个或多个 Process 元素集合的容器。 Process 序列类型支持两个子元素: ProcessShellProcess。 Process 是 Process 类型的元素,ShellProcess 的数据类型为 Empty。 序列中必须至少标识一项。

路径 RegistrySetting 和 FileSetting 使用路径来引用注册表和文件路径。 此元素支持两个可选属性: RecursiveDeleteIfNotFound。 这两个值都设置为 default=“False”。

递归指示文件设置包含路径和所有子文件夹,或者注册表设置包含所有子注册表项。 在这两种情况下,当前级别的所有项都包含在捕获的数据中。 对于 FileSettings 对象,指定文件夹中的所有文件都包含在 UE-V 捕获的数据中,但不包括文件夹。 对于注册表路径,将捕获当前路径中的所有值,但不会捕获子注册表项。 在这两种情况下,都应小心避免捕获大型数据集或大量项。

DeleteIfNotFound 属性从用户的设置存储路径数据中删除设置。 如果从包中删除这些设置将节省设置存储路径文件服务器上的大量磁盘空间,则此删除可能是可取的。

FileMask FileMask 仅为 Path 定义的文件夹指定某些文件类型。 例如,“路径”可以是 C:\users\username\files ,FileMask 可能 *.txt 仅包含文本文件。

RegistrySetting RegistrySetting 表示 UE-V 服务部分的注册表项和值以及关联的所需行为的容器。 此类型中定义了四个子元素: PathNameExclude 以及值 PathName 的序列。

FileSetting FileSetting 包含与文件和文件路径关联的参数。 定义了四个子元素: RootPathFileMaskExclude。 根是必需的,其他根是可选的。

设置 设置是应用于特定模板的所有设置的容器。 它包含前面所述的注册表、文件、SystemParameter 和 CustomAction 设置的实例。 此外,它还可以包含以下子元素,其行为描述如下:

元素 说明
异步 在不阻止应用程序启动的情况下应用异步设置包,以便应用程序在仍应用设置的同时继续启动。 此元素可用于可异步应用的设置,例如通过 API 获取/设置的设置,例如 SystemParameterSetting。
PreventOverlappingSynchronization 默认情况下,仅当使用模板的应用程序的最后一个实例关闭时,UE-V 才会保存应用程序的设置。 当此元素设置为“false”时,即使应用程序的其他实例正在运行,UE-V 也会导出设置。 适合的模板( 包含 UE-V 附带的 Common 元素部分的模板)使用此标志使共享设置在应用程序关闭时始终导出,同时阻止应用程序特定的设置在最后一个实例关闭之前导出。
AlwaysApplySettings 此参数强制应用导入的设置包,即使包与应用程序的当前状态之间没有差异也是如此。 此参数应仅在特殊情况下使用,因为它可能会减慢设置导入的速度。

Name 元素

必需:True类型:字符串

名称指定设置位置模板的唯一名称。 在 WMI、PowerShell、事件查看器和调试日志中引用模板时,此名称用于显示。 通常,请避免引用版本信息,因为此引用可以从 ProductVersion 元素进行对象。 例如,指定 <Name>My Application</Name> 而不是 <Name>My Application 1.1</Name>

注意

UE-V 不引用外部 DTD,因此无法在设置位置模板中使用命名实体。 例如, 不要使用 ® 来引用已注册的商标符号 ® 。 请改用规范编号引用来包括这些类型的特殊字符,例如,® 作为®字符。 此规则适用于本文档中的所有字符串值。

有关字符实体的完整列表,请参阅 http://www.w3.org/TR/xhtml1/dtds.html 。 UTF-8 编码的文档可以直接包含 Unicode 字符。 通过 UE-V 模板生成器保存模板会自动将字符实体转换为其 Unicode 表示形式。

ID 元素

必需:True类型:字符串

ID 填充特定模板的唯一标识符。 此标记将成为 UE-V 服务用于在运行时引用模板的主要标识符 (例如,请参阅 Get-UevTemplate 的输出和 Get-UevTemplateProgram PowerShell cmdlet) 。 按照约定,此标记不应包含任何空格,这简化了脚本编写。 应在此元素中指定应用程序的版本号,以便轻松识别模板,例如 <ID>MicrosoftOffice2016Win64</ID>

Version 元素

必需: True类型: 整数最小值: 0最大值: 2147483647

版本标识用于管理跟踪更改的设置位置模板的版本。 每次保存模板时,UE-V 模板生成器会自动递增此数字。 请注意,此字段必须是整数;不允许使用小数值,例如 <Version>2.5</Version>

提示

可以使用 XML 注释标记 <!-- -->保存有关版本更改的注释,例如:

<!--
   Version History

   Version 1 Jul 05, 2012 Initial template created by Generator - Denise@Contoso.com
   Version 2 Jul 31, 2012 Added support for app.exe v2.1.3 - Mark@Contoso.com
   Version 3 Jan 01, 2013 Added font settings support - Mark@Contoso.com
   Version 4 Jan 31, 2013 Added support for plugin settings - Tony@Contoso.com
 -->
<Version>4</Version>

重要提示

查询此值以确定是否应将新版本的模板应用于以下实例中的现有模板:

  • 计划的模板自动更新任务何时执行
  • 执行 Update-UevTemplate PowerShell cmdlet 时
  • 通过 WMI 调用 microsoft\uev:SettingsLocationTemplate Update 方法时

Author 元素

必需:False类型:字符串

作者标识设置位置模板的创建者。 支持两个可选的子元素:名称和Email。 这两个属性都是可选的,但如果指定了Email子元素,则必须附带 Name 元素。 作者是指设置位置模板的联系人全名,电子邮件应引用作者的电子邮件地址。 建议在公开发布的模板中包含此信息。

Process 和 Process 元素

必需:True类型:元素

进程包含至少一个 <Process> 元素,后者又包含以下子元素: FilenameArchitectureProductNameFileDescriptionProductVersionFileVersion。 Filename 子元素是必需的,其他元素是可选的。 完全填充的元素包含类似于以下示例的标记:

<Process>
  <Filename>MyApplication.exe</Filename>
  <Architecture>Win64</Architecture>
  <ProductName> MyApplication </ProductName>
  <FileDescription>MyApplication.exe</FileDescription>
  <ProductVersion>
    <Major Minimum="2" Maximum="2" />
    <Minor Minimum="0" Maximum="0" />
    <Build Minimum="0" Maximum="0" />
    <Patch Minimum="5" Maximum="5" />
  </ProductVersion>
  <FileVersion>
    <Major Minimum="2" Maximum="2" />
    <Minor Minimum="0" Maximum="0" />
    <Build Minimum="0" Maximum="0" />
    <Patch Minimum="5" Maximum="5" />
  </FileVersion>
</Process>

文件名

必需:True类型:字符串

文件名是指可执行文件在文件系统中显示的实际文件名。 此元素指定 UE-V 用于评估模板是否应用于进程的主要条件。 必须在设置位置模板 XML 中指定此元素。

有效文件名必须与正则表达式 [^\?\*\|<> 不匹配/:]+,也就是说,它们不能包含反斜杠字符、星号或问号 wild-卡 字符、管道字符、大于或小于符号、正斜杠或冒号 (\ ? * | <> / 或 : characters.) 。

提示

若要针对此正则表达式测试字符串,请使用 PowerShell 命令窗口,并将可执行文件的名称替换为 YourFileName

"YourFileName.exe" -match "[\\\?\*\|<>/:]+"

值为 True 表示字符串包含非法字符。 下面是非法值的一些示例:

  • \\server\share\program.exe
  • Program*.exe
  • Pro?ram.exe
  • 计划<1>.exe

注意

UE-V 模板生成器将大于和小于字符分别编码为 > 和 < 。

在极少数情况下,FileName 值不一定包括 .exe 扩展名,但应将其指定为值的一部分。 例如, <Filename>MyApplication.exe</Filename> 应指定 而不是 <Filename>MyApplication</Filename>。 如果可执行文件的实际名称为“MyApplication.exe”,则第二个示例不会将模板应用于进程。

体系结构

必需:False类型:体系结构 (字符串)

体系结构是指为其编译目标可执行文件的处理器体系结构。 有效值为 32 位应用程序的 Win32 或 64 位应用程序的 Win64。 如果存在,则此标记将设置位置模板的适用性限制为特定的应用程序体系结构。 有关此适用性限制的示例,请比较 UE-V 中包含的 %ProgramFiles%\Microsoft 用户体验虚拟化\templates\ MicrosoftOffice2016Win32.xml 和 MicrosoftOffice2016Win64.xml 文件。 当可执行文件的不同版本之间的相对路径发生更改时,或者在从一个处理器体系结构移动到另一个处理器体系结构时,如果已添加或删除设置,则此适用性限制非常有用。

如果不存在此元素,设置位置模板将忽略进程的体系结构,如果文件名和其他属性适用,则同时应用于 32 位和 64 位进程。

注意

UE-V 在此版本中不支持 ARM 处理器。

ProductName

必需:False类型:字符串

ProductName 是一个可选元素,用于标识用于管理目的或报告的产品。 ProductName 与 Filename 的不同之处在于,其值没有正则表达式限制。 这种灵活性允许更轻松地理解可执行名称可能不明显的进程的说明。 例如:

<Process>
  <Filename>MyApplication.exe</Filename>
  <ProductName>My Application 6.x by Contoso.com</ProductName>
  <ProductVersion>
    <Major Minimum="6" Maximum="6" />
  </ProductVersion>
</Process>

FileDescription

必需:False类型:字符串

FileDescription 是一个可选标记,允许对可执行文件进行管理说明。 此标记是一个自由文本字段,可用于区分软件包中的多个可执行文件,其中需要标识可执行文件的功能。

例如,在合适的应用程序中,提供两个可执行文件 (MyApplication.exe 和 MyApplicationHelper.exe) 的功能提醒可能很有用,如下所示:

<Processes>

   <Process>
      <Filename>MyApplication.exe</Filename>
      <FileDescription>My Application Main Engine</ FileDescription>
      <ProductVersion>
        <Major Minimum="6" Maximum="6" />
      </ProductVersion>
    </Process>
    <Process>
      <Filename>MyApplicationHelper.exe</Filename>
      <FileDescription>My Application Background Process Executable</FileDescription>
      <ProductVersion>
        <Major Minimum="6" Maximum="6" />
      </ProductVersion>
    </Process>
</Processes>

ProductVersion

必需:False类型:字符串

ProductVersion 是指文件的主要和次要产品版本,以及内部版本和修补程序级别。 ProductVersion 是可选元素,但如果指定,它必须至少包含 Major 子元素。 该值必须以 Minimum=“X” Maximum=“Y”的形式表示一个范围,其中 X 和 Y 是整数。 最小值和最大值可以相同。

产品和文件版本元素可能未指定。 这样做会使模板“与版本无关”,这意味着模板将应用于指定可执行文件的所有版本。

示例 1:

产品版本:UE-V 模板生成器中指定的 1.0 生成以下 XML:

<ProductVersion>
  <Major Minimum="1" Maximum="1" />
  <Minor Minimum="0" Maximum="0" />
</ProductVersion>

示例 2:

文件版本:UE-V 模板生成器中指定的 5.0.2.1000 生成以下 XML:

<FileVersion>
  <Major Minimum="5" Maximum="5" />
  <Minor Minimum="0" Maximum="0" />
  <Build Minimum="2" Maximum="2" />
  <Patch Minimum="1000" Maximum="1000" />
</FileVersion>

示例 1 不正确 - 不完整的范围:

仅存在 Minimum 属性。 范围中也必须包含最大值。

<ProductVersion>
  <Major Minimum="2" />
</ProductVersion>

示例 2 不正确 - 指定了不带 Major 元素的次要元素:

只有 Minor 元素存在。 还必须包括专业。

<ProductVersion>
  <Minor Minimum="0" Maximum="0" />
</ProductVersion>

FileVersion

必需:False类型:字符串

FileVersion 区分已发布应用程序的发布版本和组件可执行文件的内部生成详细信息。 对于大多数商业应用程序,这些数字是相同的。 如果它们有所不同,则文件的产品版本指示文件的通用版本标识,而文件版本指示文件的特定内部版本 (如修补程序或更新) 示例所示。 此文件版本唯一标识文件,而不会中断检测逻辑。

若要确定特定可执行文件的产品版本和文件版本,请在 Windows 资源管理器中右键单击该文件,选择“属性”,然后单击“详细信息”选项卡。

为应用程序添加 FileVersion 元素可实现更精细的微调检测逻辑,但对于大多数应用程序来说都不需要。 首先检查 ProductVersion 元素设置,然后选中 FileVersion。 将应用限制性更高的设置。

FileVersion 的子元素和语法规则与 ProductVersion 的这些元素和规则相同。

<Process>
  <Filename>MSACCESS.EXE</Filename>
  <Architecture>Win32</Architecture>
  <ProductVersion>
    <Major Minimum="14" Maximum="14" />
    <Minor Minimum="0" Maximum="0" />
  </ProductVersion>
  <FileVersion>
    <Major Minimum="14" Maximum="14" />
    <Minor Minimum="0" Maximum="0" />
  </FileVersion>
</Process>

Application 元素

应用程序是适用于特定应用程序的设置的容器。 它是以下字段/类型的集合。

字段/类型 说明
名称 指定设置位置模板的唯一名称。 在 WMI、PowerShell、事件查看器和调试日志中引用模板时,此名称用于显示。 有关详细信息,请参阅 名称
ID 填充特定模板的唯一标识符。 此标记将成为 UE-V 服务用于在运行时引用模板的主要标识符。 有关详细信息,请参阅 ID
说明 模板的可选说明。
LocalizedNames UI 中显示的可选名称,由语言区域设置本地化。
LocalizedDescriptions 由语言区域设置本地化的可选模板说明。
版本 标识用于管理跟踪更改的设置位置模板的版本。 有关详细信息,请参阅 版本
DeferToMSAccount 控制是否与 Microsoft 帐户一起启用此模板。 如果在计算机上为用户启用了 MSA 同步,则会自动禁用此模板。
DeferToOffice365 与 MSA 类似,此类型控制是否与 Office361 一起启用此模板。 如果正在使用Office 365同步设置,则会自动禁用此模板。
FixedProfile 指定此模板只能与此元素中指定的配置文件相关联,不能通过 WMI 或 PowerShell 进行更改。
进程 一个或多个 Process 元素集合的容器。 有关详细信息,请参阅 进程
“设置” 适用于特定模板的所有设置的容器。 它包含注册表、文件、SystemParameter 和 CustomAction 设置的实例。 有关详细信息,请参阅数据类型中的设置”。

Common 元素

Common 类似于 Application 元素,但它始终与两个或多个 Application 元素相关联。 Common 部分表示这些应用程序实例之间共享的设置集。 它是以下字段/类型的集合。

字段/类型 说明
名称 指定设置位置模板的唯一名称。 在 WMI、PowerShell、事件查看器和调试日志中引用模板时,此名称用于显示。 有关详细信息,请参阅 名称
ID 填充特定模板的唯一标识符。 此标记将成为 UE-V 服务用于在运行时引用模板的主要标识符。 有关详细信息,请参阅 ID
说明 模板的可选说明。
LocalizedNames UI 中显示的可选名称,由语言区域设置本地化。
LocalizedDescriptions 由语言区域设置本地化的可选模板说明。
版本 标识用于管理跟踪更改的设置位置模板的版本。 有关详细信息,请参阅 版本
DeferToMSAccount 控制是否与 Microsoft 帐户一起启用此模板。 如果在计算机上为用户启用了 MSA 同步,则会自动禁用此模板。
DeferToOffice365 与 MSA 类似,此类型控制是否与 Office361 一起启用此模板。 如果正在使用Office 365同步设置,则会自动禁用此模板。
FixedProfile 指定此模板只能与此元素中指定的配置文件相关联,不能通过 WMI 或 PowerShell 进行更改。
“设置” 适用于特定模板的所有设置的容器。 它包含注册表、文件、SystemParameter 和 CustomAction 设置的实例。 有关详细信息,请参阅数据类型中的设置

SettingsLocationTemplate 元素

此元素定义单个应用程序或应用程序套件的设置。

字段/类型 说明
名称 指定设置位置模板的唯一名称。 在 WMI、PowerShell、事件查看器和调试日志中引用模板时,此类型用于显示。 有关详细信息,请参阅 名称
ID 填充特定模板的唯一标识符。 此标记将成为 UE-V 服务用于在运行时引用模板的主要标识符。 有关详细信息,请参阅 ID
说明 模板的可选说明。
LocalizedNames UI 中显示的可选名称,由语言区域设置本地化。
LocalizedDescriptions 由语言区域设置本地化的可选模板说明。

附录:SettingsLocationTemplate.xsd

下面是显示其元素、子元素、属性和参数的 SettingsLocationTemplate.xsd 文件:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="UevSettingsLocationTemplate"
  targetNamespace="https://schemas.microsoft.com/UserExperienceVirtualization/2013A/SettingsLocationTemplate"
  elementFormDefault="qualified"
  xmlns="https://schemas.microsoft.com/UserExperienceVirtualization/2013A/SettingsLocationTemplate"
  xmlns:mstns="https://schemas.microsoft.com/UserExperienceVirtualization/2013A/SettingsLocationTemplate"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:simpleType name="Guid">
        <xs:restriction base="xs:string">
            <xs:pattern value="\{[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}\}" />
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="FilenameString">
        <xs:restriction base="xs:string">
            <xs:pattern value="[^\\\?\*\|&lt;&gt;/:]+" />
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="IDString">
        <xs:restriction base="xs:string">
            <xs:pattern value="[^\\\?\*\|&lt;&gt;/:.]+" />
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="CompositeIDString">
        <xs:restriction base="xs:string">
            <xs:pattern value="[^\\\?\*\|&lt;&gt;/:.]+([.][^\\\?\*\|&lt;&gt;/:.]+)?" />
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="TemplateVersion">
        <xs:restriction base="xs:integer">
            <xs:minInclusive value="0" />
            <xs:maxInclusive value="2147483647" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="Empty">
        <xs:sequence/>
    </xs:complexType>

    <xs:complexType name="LocalizedString">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="Locale" type="xs:string" use="required"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="LocalizedName">
        <xs:sequence>
            <xs:element name="Name" type="LocalizedString" minOccurs="1" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="LocalizedDescription">
        <xs:sequence>
            <xs:element name="Description" type="LocalizedString" minOccurs="1" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="ReplacedTemplates">
      <xs:sequence>
        <xs:element name="ID" type="CompositeIDString" minOccurs="1" maxOccurs="unbounded" />
    </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Author">
        <xs:all>
            <xs:element name="Name" type="xs:string" minOccurs="1" />
            <xs:element name="Email" type="xs:string" minOccurs="0" />
        </xs:all>
    </xs:complexType>

    <xs:complexType name="Range">
        <xs:attribute name="Minimum" type="xs:integer" use="required"/>
        <xs:attribute name="Maximum" type="xs:integer" use="required"/>
    </xs:complexType>

    <xs:complexType name="ProcessVersion">
        <xs:sequence>
            <xs:element name="Major" type="Range" minOccurs="1" />
            <xs:element name="Minor" type="Range" minOccurs="0" />
            <xs:element name="Build" type="Range" minOccurs="0" />
            <xs:element name="Patch" type="Range" minOccurs="0" />
        </xs:sequence>
    </xs:complexType>

    <xs:simpleType name="Architecture">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Win32"/>
            <xs:enumeration value="Win64"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="Process">
        <xs:sequence>
            <xs:element name="Filename" type="FilenameString" minOccurs="1" />
            <xs:element name="Architecture" type="Architecture" minOccurs="0" />
            <xs:element name="ProductName" type="xs:string" minOccurs="0" />
            <xs:element name="FileDescription" type="xs:string" minOccurs="0" />
            <xs:element name="ProductVersion" type="ProcessVersion" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="FileVersion" type="ProcessVersion" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Processes">
        <xs:sequence>
            <xs:choice minOccurs="1">
                <xs:element name="Process" type="Process" />
                <xs:element name="ShellProcess" type="Empty" />
            </xs:choice>
            <xs:element name="Process" type="Process" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Path">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="Recursive" type="xs:boolean" default="false"/>
                <xs:attribute name="DeleteIfNotFound" type="xs:boolean" default="false"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="RegistrySetting">
        <xs:sequence>
            <xs:element name="Path" type="Path" />
            <xs:element name="Name" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="Exclude" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="Path" type="Path" minOccurs="0" />
                        <xs:element name="Name" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="FileSetting">
        <xs:sequence>

            <xs:element name="Root">
                <xs:complexType>
                    <xs:choice>
                        <xs:element name="KnownFolder" type="Guid" />
                        <xs:element name="RegistryEntry" type="xs:string" />
                        <xs:element name="EnvironmentVariable" type="xs:string" />
                    </xs:choice>
                </xs:complexType>
            </xs:element>

            <xs:element name="Path" minOccurs="0" type="Path" />
            <xs:element name="FileMask" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>

            <xs:element name="Exclude" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="Path" type="Path" minOccurs="0" />
                        <xs:element name="FileMask" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
                    </xs:sequence>
                </xs:complexType>
            </xs:element>

        </xs:sequence>
    </xs:complexType>

    <xs:simpleType name="CustomActionSetting">
        <xs:restriction base="xs:anyURI"/>
    </xs:simpleType>

    <xs:simpleType name="SystemParameterSetting">
        <xs:restriction base="xs:string">

            <!-- Accessibility parameters -->
            <xs:enumeration value="AccessTimeout"/>
            <xs:enumeration value="AudioDescription"/>
            <xs:enumeration value="ClientAreaAnimation"/>
            <xs:enumeration value="DisableOverlappedContent"/>
            <xs:enumeration value="FilterKeys"/>
            <xs:enumeration value="FocusBorderHeight"/>
            <xs:enumeration value="FocusBorderWidth"/>
            <xs:enumeration value="HighContrast"/>
            <xs:enumeration value="MessageDuration"/>
            <xs:enumeration value="MouseClickLock"/>
            <xs:enumeration value="MouseClickLockTime"/>
            <xs:enumeration value="MouseKeys"/>
            <xs:enumeration value="MouseSonar"/>
            <xs:enumeration value="MouseVanish"/>
            <xs:enumeration value="ScreenReader"/>
            <xs:enumeration value="ShowSounds"/>
            <xs:enumeration value="SoundSentry"/>
            <xs:enumeration value="StickyKeys"/>
            <xs:enumeration value="ToggleKeys"/>

            <!-- Input parameters -->
            <xs:enumeration value="Beep"/>
            <xs:enumeration value="BlockSendInputResets"/>
            <xs:enumeration value="DefaultInputLang"/>
            <xs:enumeration value="DoubleClickTime"/>
            <xs:enumeration value="DoubleClkHeight"/>
            <xs:enumeration value="DoubleClkWidth"/>
            <xs:enumeration value="KeyboardCues"/>
            <xs:enumeration value="KeyboardDelay"/>
            <xs:enumeration value="KeyboardPref"/>
            <xs:enumeration value="KeyboardSpeed"/>
            <xs:enumeration value="Mouse"/>
            <xs:enumeration value="MouseButtonSwap"/>
            <xs:enumeration value="MouseHoverHeight"/>
            <xs:enumeration value="MouseHoverTime"/>
            <xs:enumeration value="MouseHoverWidth"/>
            <xs:enumeration value="MouseSpeed"/>
            <xs:enumeration value="MouseTrails"/>
            <xs:enumeration value="SnapToDefButton"/>
            <xs:enumeration value="WheelScrollChars"/>
            <xs:enumeration value="WheelScrollLines"/>

            <!-- Desktop parameters (limited subset) -->
            <xs:enumeration value="DeskWallpaper"/>
            <xs:enumeration value="DesktopColor"/>

        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="Settings">
        <xs:sequence>
            <xs:element name="Asynchronous" type="xs:boolean" minOccurs="0" />
            <xs:element name="PreventOverlappingSynchronization" type="xs:boolean" minOccurs="0" />
            <xs:element name="AlwaysApplySettings" type="xs:boolean" minOccurs="0" />
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element name="Registry" type="RegistrySetting" />
                <xs:element name="File" type="FileSetting" />
                <xs:element name="SystemParameter" type="SystemParameterSetting" />
                <xs:element name="CustomAction" type="CustomActionSetting" />
            </xs:choice>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Common">
        <xs:sequence>
            <xs:element name="Name" type="xs:string" />
            <xs:element name="ID" type="IDString" />
            <xs:element name="ReplacedTemplates" type="ReplacedTemplates" minOccurs="0" />
            <xs:element name="Description" type="xs:string" minOccurs="0" />
            <xs:element name="LocalizedNames" type="LocalizedName" minOccurs="0" />
            <xs:element name="LocalizedDescriptions" type="LocalizedDescription" minOccurs="0" />
            <xs:element name="Version" type="xs:integer" />
            <xs:element name="DeferToMSAccount" type="Empty"  minOccurs="0" />
            <xs:element name="DeferToOffice365" type="Empty" minOccurs="0" />
            <xs:element name="Settings" type="Settings" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Application">
        <xs:sequence>
            <xs:element name="Name" type="xs:string" />
            <xs:element name="ID" type="IDString" />
            <xs:element name="ReplacedTemplates" type="ReplacedTemplates" minOccurs="0" />
            <xs:element name="Description" type="xs:string" minOccurs="0" />
            <xs:element name="LocalizedNames" type="LocalizedName" minOccurs="0" />
            <xs:element name="LocalizedDescriptions" type="LocalizedDescription" minOccurs="0" />
            <xs:element name="Version" type="xs:integer" />
            <xs:element name="DeferToMSAccount" type="Empty"  minOccurs="0" />
            <xs:element name="DeferToOffice365" type="Empty" minOccurs="0" />
            <xs:element name="Processes" type="Processes" />
            <xs:element name="Settings" type="Settings" />
        </xs:sequence>
    </xs:complexType>

    <xs:element name="SettingsLocationTemplate">
        <xs:complexType>
            <xs:sequence>

                <xs:element name="Name" type="xs:string" />
                <xs:element name="ID" type="IDString" />
                <xs:element name="Description" type="xs:string" minOccurs="0" />
                <xs:element name="LocalizedNames" type="LocalizedName" minOccurs="0" />
                <xs:element name="LocalizedDescriptions" type="LocalizedDescription" minOccurs="0" />

                <xs:choice>

                    <!-- Single application -->
                    <xs:sequence>
                        <xs:element name="ReplacedTemplates" type="ReplacedTemplates" minOccurs="0" />
                        <xs:element name="Version" type="TemplateVersion" />
                        <xs:element name="Author" type="Author" minOccurs="0" />
                        <xs:element name="FixedProfile" type="xs:string"  minOccurs="0" />
                        <xs:element name="DeferToMSAccount" type="Empty"  minOccurs="0" />
                        <xs:element name="DeferToOffice365" type="Empty" minOccurs="0" />
                        <xs:element name="Processes" type="Processes" />
                        <xs:element name="Settings" type="Settings" />
                    </xs:sequence>

                    <!-- Suite of applications -->
                    <xs:sequence>
                        <xs:element name="ManageSuiteOnly" type="xs:boolean" minOccurs="0" />
                        <xs:element name="Author" type="Author" minOccurs="0" />
                        <xs:element name="FixedProfile" type="xs:string"  minOccurs="0" />
                        <xs:element name="Common" type="Common" />
                        <xs:element name="Application" type="Application" minOccurs="2" maxOccurs="unbounded" />
                    </xs:sequence>

                </xs:choice>

            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <!-- SettingsLocationTemplate -->

</xs:schema>

使用自定义 UE-V 模板和 UE-V 模板生成器技术参考