使用 Service Manager 创作自定义和创作类
类是用于表示 Service Manager 中使用的对象的主要元素。 类可以表示计算机、用户、事件或表单。
表示较大元素(如 Service Manager 功能)的类定义通常组合在一起。 类定义存储在必须导入 Service Manager 以启用 Service Manager 功能的管理包中。
类的关键概念
Service Manager 中的对象是 特定基类的 实例。 基类的所有实例均具有一组公共属性和公共行为。
与所有管理包元素类似,类具有 ID 和 显示名称 属性。 在此文档中,ID 是指仅在创作工具中看到的类的唯一名称,而名称和显示名称是指 Service Manager 控制台中显示的特定于语言的名称。
注意
创建类时,始终确保类名在管理包中是唯一的。 如果可能,请在你的环境中使用有意义的类名。 可以使用 Service Manager 创作工具的“类浏览器”窗口中的搜索功能来确定类名是否已存在。
属性
特定类的所有实例共享一组 通用属性。 这些属性的值由用户采用各种方法提供,并且会因不同的实例而异。 属性用于表示实际对象的详细信息,如唯一的名称、位置以及用户可能感兴趣或管理方案所需的其他详细信息。
关键属性
键属性 唯一标识了特定类的各个实例。 如果属性被标记为键属性,则类的每个实例必须具有该属性的唯一值,并且该值不能为 null。 对于 托管类,对于具有相同宿主父级的类的所有实例,该值必须是唯一的。 对于 非托管类,它对于管理组中的类的所有实例必须是唯一的。 本部分稍后将进一步描述宿主关系。
类并不总是需要键属性。 只有当单个父类需要一个类的多个实例时才需要键属性。 如果仅需要单个实例,则不需要键属性,但仍可能定义密钥属性。
例如, SQL 数据库引擎 具有键属性 Instance Name ,因为一台计算机可以安装 Microsoft SQL Server 的多个实例。 当存在 SQL 数据库引擎的多个实例时,各个实例对于 Instance Name 均必须具有不同的值,才可明确区分不同的对象。 相比之下,IIS Web Server 类不定义键属性,因为在任何计算机上安装一个实例。
所有对象都具有一个 Path Name 属性,该属性根据对象的键属性或属性及其承载父级或父属性计算得出。 对于非寄宿对象, Path Name 将是类本身的键属性。 Path Name 可用于唯一标识管理组中类的任何实例。
基类和继承
每个类均必须指定一个 基类 用以标识该新类将 特别指明的现有类。 Service Manager 附带的管理包库包含多个类,这些类可用作管理包中自定义类的基类。 管理包通常至少有一个继承自库类的类,同时可能有继承自相同管理包中的类的其他类。
基类的概念可以用 Windows Server 操作系统管理包进行说明。 此管理包包括表示计算机上安装的逻辑磁盘的类。 下图显示 Windows Server 2003 逻辑磁盘 类和 Windows Server 2008 逻辑磁盘类。 这两个类均基于在 Microsoft.Windows.Server.Library 管理包文件中定义的 逻辑磁盘(服务器) 。 逻辑磁盘(服务器)又基于逻辑磁盘,逻辑磁盘本身基于逻辑设备,等等,通过逻辑硬件、逻辑实体和最终实体。 所有类均可跟踪类似的继承路径并将始终以作为类结构的根的 实体结束。 这是唯一没有基类的类,所有其他类最终都继承自该类。
类之间的属性继承
实体具有名为“显示名称”的单个属性。 此属性由继承自 Entity 的所有类继承。 所有类最终都继承自 Entity。 这就是为什么所有类都具有 显示名称 属性的原因。 此示例中其他类都没有属性,除了 逻辑设备,用于定义 Name、 Description和 DeviceID。 DeviceID 指定为键属性。 这些属性全部都被 逻辑磁盘 和 逻辑磁盘(服务器)继承。 逻辑磁盘(服务器) 随后会添加 Size、 Drive Type和 File System等其他属性。 特定于操作系统版本的最低级别的类继承了继承树中在其之上的那些类所提供的整个属性集。
类类型
大多数类具有一个或多个实际的实例,这些类称为 具体类。 抽象类 和 Singleton 类 是特殊类型的类,它们所起的作用有所不同并可用于特定情形。
抽象类
抽象类不具有任何实例,它的存在仅仅是为了用作其他类的基类。 在抽象类级别定义的所有属性和关系都由子类继承,无需再次定义。 管理包库中定义的大多数类都是抽象类,因为它们仅用于充当自定义管理包中定义的类的基类。
抽象类用于一组常见的属性、关系或分组,可在类的所有进一步专用化中定义。 在前面的示例中,上面显示的 Windows Server 2003 逻辑磁盘和 Windows Server 2008 逻辑磁盘上显示的所有类都是抽象的。 它们的存在仅仅是为了供较低级别的类继承。
单一实例类
当有一个类且只有一个实例时,将使用单一实例 。 该类就是实例,并且它始终存在。 安装管理包时将创建单一实例。 同样,单一实例类不需要键属性,因为它只会有一个实例。 单一实例类的常见用途是“ 组” 类,因为整个管理组中只需要此类的单个实例。
类扩展
若要自定义类,可以通过向现有的类定义中添加新属性来扩展该类。 新属性现在将包含在已存在的该类的所有实例以及将创建的任何新实例中。 无法扩展抽象类。
关系
关系 是在两个类之间进行定义的,用以指明一个类的特定实例与另一个类的该特定实例之间的关联。 有三种类型的关系,这些关系在以下部分中进行了详细介绍:
托管关系
包含关系
引用关系
类关系会以下列方式影响对象。
关系类型 | 键属性和存在 | 可用属性 |
---|---|---|
承载 | 键属性的值对于管理组中的类的所有实例必须是唯一的。 但是,对于托管类,键属性值必须仅对具有相同宿主父级的所有对象是唯一的。 若要唯一标识托管对象,需要对象和对象的父对象的键属性,托管类的键将是宿主类键属性和托管类键属性的组合。 寄宿类的存在取决于宿主类的存在。 |
除任何托管父级的属性外,针对某个类的任何工作流都有权访问该类的属性。 例如,使用 SQL 2008 数据库引擎 类作为目标的工作流中的脚本可能需要安装 SQL Server 2008 实例的计算机的名称。 由于对象只能有一个托管父级,因此我们知道托管 SQL 2008 数据库引擎类的任何特定实例的计算机。 工作流脚本可以访问目标对象的属性以及该目标的托管父级的属性。 |
遏制 | 键属性和存在不依赖于容器对象。 | 除任何容器父级的属性外,针对某个类的任何工作流都有权访问该类的属性。 例如,面向事件类的工作流中的脚本可以访问容器队列类的属性。 |
参考 | 键属性和存在不依赖于引用的对象。 | 针对某个类的任何工作流仅有权访问该类的属性。 |
引用关系
引用关系 是最常用的关系类型。 当父类和子类不相互依赖时,将使用引用关系;例如,数据库可以引用它正在复制的另一个数据库。 一个数据库不依赖于另一个数据库,并且对象单独存在。
包含关系
包含关系 类型没有托管关系那么严格。 它声明一个类与另一个类相关,尽管另一个类不需要另一个类。 不像托管关系,包含关系为多对多关系。 这意味着一个对象可以包含多个对象,单个对象可被多个其他对象包含。 例如,一个组可以包含多个对象,单个对象可以是多个组的成员。
包含关系通常适用于满足以下条件的组成员:通过组与成员对象之间的包含关系将多个对象包含在该组中。
托管关系
两个类之间最严格的关系是 托管 关系。 由另一个类托管的类称为 寄宿类,该类的实例称为 寄宿对象。 如果某个类不是由另一 个类托管的,则它称为非托管类,该类的实例称为 非托管对象。
当一个对象由另一个对象托管时,该对象本身的存在与否依赖于其宿主父对象。 如果删除了宿主父对象,则寄宿子对象也将被删除。 例如,没有安装逻辑磁盘的计算机,逻辑磁盘就不存在。
一个寄宿对象只可以有一个宿主父对象,但一个父对象可以承载多个子对象。 例如,一个特定磁盘只可以安装在一台计算机上,但一台计算机可以安装有多个磁盘。
SQL Server 管理包提供了托管关系的另一个示例。 Windows 计算机类、SQL 2008 数据库引擎类和 SQL 2008 DB 类之间的托管关系如下所示。
托管 SQL Server 2008 类的关系
SQL 2008 数据库引擎类表示在特定计算机上安装的 SQL Server 2008 实例。 由于数据库只能安装在单个数据库引擎上, 因此 SQL 2008 数据库引擎 类托管 SQL 2008 DB 类。 管理组中可以有多个具有相同名称的数据库,但在 SQL Server 类的特定实例上安装的任何数据库都必须具有唯一的名称。 数据库引擎反过来又由 Windows 计算机 类托管。 管理组中可以 有多个同名的 SQL Server 实例。 特定计算机上的每个实例均必须具有唯一的名称。
由于有两种托管关系,因此每个数据库的路径名称都是计算机名加上实例名称再加上数据库名称。 下图显示了一个示例。
示例数据库托管关系
类的一般准则和最佳做法
在 Service Manager 创作工具中自定义类时,请使用以下准则和最佳做法。
类型定义的命名约定
Service Manager 架构模型命名约定基于 .NET 命名空间命名约定。
基本命名约定
基本的命名约定为 CompanyName.TechnologyArea.ProductName.FunctionalityArea.Name,其中:
ProductName 为可选;当定义独立于任何特定产品时使用它。
FunctionalityArea 为可选;当定义可应用于不同区域时使用它。
Name 反映类而不是继承层次结构的含义。
例如: Microsoft.AD.Printer、 Microsoft.Windows.Computer、 System.Knowledge.Article、 System.WorkItem.Incident和 System.StarRating.Average。
系统命名空间
System 命名空间指独立于 Microsoft 和 Windows 的定义。 这通常适用于 Windows 应用程序或 Unix 应用程序所依赖的基本定义。 这些基本定义应独立于公司。
对于 System 前缀,请使用下列准则:
System.Computer 表示任何类型的计算机,它不特定于供应商。
如果你希望用其他信息来定义该命名空间顶部的架构,请使用 System 前缀。
请注意,Microsoft.Windows.Computer 不以系统开头,尽管大多数 Windows 应用程序(无论定义它的供应商)都依赖于此定义。
命名类的最佳做法
命名类时,请使用以下最佳做法:
不要创建两个单独的类(即使它们位于两个不同的管理包中),这将导致为两个类的不同对象存储相同的键值。
扩展类时,始终确保类扩展名称在管理包中是唯一的。 如果可能,请使用有意义的类扩展名。
扩展类时,不要使用已在该类中使用的 ID 定义属性。
不要在自定义类的属性名称中使用句点。
如果在创作多维数据集时添加自定义命名的计算,则命名的计算的名称请以 NC_ 开头。 这将减少使用已经存在的属性名称的可能性。
不要创建过多的类
使用最小值创建过多的类可能会导致不必要的复杂性。 一种好的做法就是使用最少个数的类达到预期的效果。 除了抽象类之外,如果类不会成为任何工作流的目标或用于存储数据,则可能不应创建它。 此外,如果两个类相似,请考虑对这两个类使用单个类,可能通过使用可保存任何差异值的属性。
不要使用频繁更新的属性
属性值在首次填充后很少更改。 频繁更改属性值的可能原因是自定义连接器或任何其他以编程方式更新 Service Manager 数据库的自定义。 这些情况都可能会导致属性值的更新过于频繁,比如说更新频率为 10 至 15 分钟或者有大量对象时更新频率更短。
对属性值进行如此频繁的更改可能会对工作流的性能略有影响,而且可能会对性能产生其他影响。 这是因为系统会将对这些更改的跟踪保存在历史记录中。 此外,根据要更改的属性,这些更改可能会增加大量的数据由数据仓库进行处理和存储。
不要扩展抽象类
在 Service Manager 中,无法扩展抽象类。 如果需要扩展抽象类,可以执行下列任一操作:
创建含有要添加的属性的新类,然后创建该新类与抽象类之间的关系。
扩展派生自抽象类的每个相关具体类。
改进工作项类的简单搜索
定义派生自“System.WorkItem”类的自定义类时,建议使用以下格式存储该类的 DisplayName 属性:WorkItem.ID<SPACE>WorkItem.Title。
这改进了简单搜索。 简单搜索仅搜索 DisplayName 属性,并通过将 标题 属性值和 ID 属性值明确包含在 DisplayName 属性值中,改进了简单搜索的结果。 这是因为用户可按标题中的字词或按 ID 进行搜索。
在创作工具中浏览类
可以使用 Service Manager 创作工具中的“类浏览器 ”窗格浏览类及其属性。 浏览类时,可以通过将属性从 “类浏览器 ”窗格拖动到正在创作的窗体,将控件添加到窗体。
“ 类浏览器 ”窗格可以显示来自库文件夹中的任何管理包和已在创作工具中打开的任何管理包中的类。 选择类时, “类浏览器 ”窗格将显示专门为该类定义的属性以及系统生成的内部属性。 默认情况下,Library 文件夹位于以下位置:C:\Program Files (x86)\Microsoft System Center\Service Manager <版本> Authoring\Library。
在 “类浏览器 ”窗格中选择管理包时,将显示所选管理包中的所有类,并且可以展开要查看其属性的类。 选择“所有管理包”时,将显示库文件夹中所有管理包中的所有类。 每当更改管理包的选择时,都必须刷新 “类浏览器 ”窗格。
浏览类
如果“类浏览器”窗格在创作工具中不可见,请选择“视图”,然后选择“类浏览器”。
在 “类浏览器 ”窗格中的管理包列表中,选择包含要浏览的类的管理包。 例如,选择 系统库 管理包。
找到要查看的类,例如 计算机 类,然后执行以下操作:
若要查看类的详细信息,例如 “说明 ”和 “内部名称”,请右键单击该类,然后选择“ 详细信息”。
若要查看类属性的列表(如显示名称和资产状态),请展开“类浏览器”窗格中的类。 若要进一步查看属性的详细信息,请右键单击该属性,然后选择“ 详细信息”。
若要打开包含类定义的管理包,请右键单击该类,然后选择“ 视图”。
在创作工具中编辑类的详细信息
可以使用 Service Manager 创作工具查看类的属性,以及编辑类的名称或说明等详细信息。
在管理包资源管理器中,可以选择一个类并在“详细信息”窗格中查看其详细信息。 如果选择在未密封的管理包中定义的类,则可以更改该类的名称和说明。
更改类的名称或说明
在桌面上,选择“ 开始”。
选择 Service Manager 创作工具,等待创作工具打开。
确保 “管理包资源管理器” 和 “详细信息 ”窗格都处于打开状态。
选择“文件”,然后选择“打开”。
在 “打开文件 ”对话框中,选择包含要更改的类的未密封管理包,然后选择“ 打开”。 例如,打开 创作工具安装文件夹 \Samples\Woodgrove.AutomatedActivity.AddComputerToGroupMP.xml示例管理包。
在 管理包资源管理器中,展开包含要更改的类的管理包。
展开 “类”,然后找到并选择要更改的类。
选择 Name 或 Description 属性的值,然后输入新值。 无法更改的值不可用。
在管理包资源管理器中,右键单击包含已更改类的管理包,然后选择“保存”。
在创作工具中使用继承创建类
在 Service Manager 创作工具中,可以创建从现有基类继承属性和关系的类。 然后,可以修改或向新类添加属性和关系。
作为定义类继承的第一步,请选择从中继承属性和关系的基类。 在创作工具中,可以使用下列方法之一选择基类:
使用快捷方式从基本配置项类继承属性和关系。
使用快捷方式从基工作项类继承属性和关系。
首先选择基类,然后开始定义继承。
开始定义继承而不选择特定的基类。
以下过程描述了在创作工具中定义类继承的所有方法。
从配置项类或工作项类作为基类开始
如果在创作工具中看不到管理包资源管理器,请选择“视图”,然后选择“管理包资源管理器”。
在 管理包资源管理器中,选择并展开任何管理包。
右键单击“类”,然后选择“创建配置项类”或“创建工作项类”。
如果要从密封管理包创建类,请在 “目标管理包 ”对话框中,选择一个未密封的管理包来存储类自定义项,然后选择“ 确定”。
注意
如果要从未密封的管理包创建类,则此类自定义项将保存在该选定的管理包中。
在 “创建类 ”对话框中,指定新类的内部名称,然后选择“ 创建”。
在创作窗格中,现在可以查看新类的属性列表。 如果要创建配置项类,将列出配置项目类的所有属性。 如果要创建工作项类,将显示工作项类的所有属性。
选择“ 创建属性 ”或 “创建关系 ”以定义类的新属性和新关系。
从所选基类开始
如果在创作工具中看不到管理包资源管理器,请选择“视图”,然后选择“管理包资源管理器”。
在管理包资源管理器中,找到并右键单击新类将从中继承属性和关系的基类。 选择“ 继承自此类”。
在“ 继承新类 ”对话框中,输入类的内部名称。
在创作窗格中, 类属性和关系 列表显示基类的属性。
现在可以选择“创建属性”或“创建关系”,以向新类添加属性或关系。
在没有所选基类的情况下启动
如果在创作工具中看不到管理包资源管理器,请选择“视图”,然后选择“管理包资源管理器”。
在 管理包资源管理器中,选择并展开任何管理包。
右键单击“ 类”,然后选择“ 创建其他类”。
在 “基类 ”对话框中,选择要从中继承属性和关系的基类。
(可选)如果你知道要使用的基类在哪个管理包中定义,则可以根据相应的管理包进行筛选,然后选择此自定义的基类。
选择“确定”。
如果选择继承属性和关系的基类位于密封的管理包中,请在 “目标管理包 ”对话框中,选择未密封的管理包来存储类自定义项,然后选择“ 确定”。
如果选择从中继承属性和关系的基类位于未密封的管理包中,则此类自定义项将保存在该选定的管理包中。
在 “创建类 ”对话框中,指定此类的内部名称,然后选择“ 创建”。
在创作窗格中,现在可以查看新类的属性列表。 此列表包括所选基类的所有属性。
在创作工具中扩展类
可以通过将属性和关系添加到类的定义来扩展 Service Manager 创作工具中的类。 扩展类会影响该类的所有现有实例:将更新该类的所有实例以包括新的属性和关系。
扩展类
如果“管理包资源管理器”窗格在创作工具中不可见,请选择“视图”,然后选择“管理包资源管理器”。
在 “管理包资源管理器” 窗格中,找到并右键单击要扩展的类,然后选择“ 扩展类”。
在 “目标管理包 ”对话框中,选择一个未密封的管理包来存储类扩展,然后选择“ 确定”。
创作窗格中“类的扩展”选项卡上的“类属性和关系”列表显示类的属性和关系。 创建新的属性和关系,如下所示:
选择“创建属性”;在“创建属性”对话框中,输入新属性的内部名称;然后选择“创建”。
选择“创建关系”;在“创建关系”对话框中,在新关系的内部名称中输入名称;然后选择“创建”。
注意
扩展类时,不要使用已在该类中使用的 ID 定义属性。
在“类属性和关系”列表中找到并选择新属性或关系,并根据需要在“详细信息”窗格中修改其属性。
后续步骤
- 若要查看和编辑对象的属性,请参阅 “自定义”和“创作表单”。