Работа с XML-файлами пакета управления Service ManagerWork with Service Manager management pack XML files

Важно!

Эта версия Service Manager достигла конца поддержки, рекомендуется выполнить обновление до Service Manager 2019.This version of Service Manager has reached the end of support, we recommend you to upgrade to Service Manager 2019.

Для сложных настроек пакетов управления Service Manager консоль и Service Manager Authoring Tool могут быть недостаточно, и вам может потребоваться создать или изменить файлы пакета управления напрямую.For elaborate customizations of management packs, the Service Manager console and the Service Manager Authoring Tool might not be sufficient, and you might need to author or modify management pack files directly. Для работы непосредственно с файлами пакетов управления необходим - подробный набор знаний в нескольких областях, таких как общая схема System Center и структура пакетов управления.Working directly with management pack files requires in-depth knowledge in several areas, such as the System Center Common Schema and the structure of management packs.

В этом разделе содержатся общие сведения и рекомендации, которые могут помочь при создании и изменении пакетов управления для настройки Service Manager.This section provides background information and guidelines that can help you author and modify management packs to customize Service Manager.

Изменения в общей схеме System CenterChanges to the System Center Common Schema

Service Manager включает обновленную версию схемы пакета управления System Center.Service Manager includes an updated version of the System Center Management Pack Schema. Эта схема теперь называется общей схемой System Center и включает ряд усовершенствований и дополнений, предназначенных для улучшения существующих функций и включения Service Manager функций.This schema is now called the System Center Common Schema, and it includes a number of improvements and additions that are intended to enhance existing functionality and enable Service Manager features. В этой статье описываются изменения общей схемы System Center.This topic describes the changes to the System Center Common Schema.

Свойства и ограничения свойствProperties and property restrictions

Общая схема расширяет классы за счет ряда новых типов свойств.The common schema extends classes through several new property types. Эти типы свойств включают двоичные типы, а также типы перечислителя и автоинкремента.These property types include the binary, enumerator, and autoincrement types.

Кроме того, можно определить ограничения для определенных значений свойств.In addition, you can define restrictions on certain property values. Например, можно определить ограничение в виде регулярного выражения для значения свойства строкового типа.For example, you can define a regular expression restriction on a string property value. В следующем примере для свойства BuildingName ограничение в виде регулярного выражения определено таким образом, чтобы допустимым считалось только значение, содержащее слово "Building", за которым следует пробел и число.In the following example, the BuildingName property has a regular expression restriction that is defined so that only a value that contains the word "Building" followed by a space and a number is considered valid.


<ClassType ID="Lobby" Accessibility="Public" Base="System!System.Entity">  
   <Property ID="Id" Type="int" Key="true" />  
   <Property ID="BuildingName" Type="string" RegEx="Building [0-9]+" />  
</ClassType>  

ОбразыImages

Изображения не хранятся внутри пакета управления.Images are not stored inside a management pack. В связи с этим раздел <PresentationTypes> пакета управления больше не содержит тегов <Images>, <Image> и <ImageData>.Therefore, the <PresentationTypes> section of the management pack no longer contains the <Images>, <Image>, or <ImageData> tags. Вместо этого используется ресурс изображения.Instead, use an image resource.

<Resources>  
   <Image ID="TestLibrary.Resources.Image1" Accessibility="Public" FileName="image.png"/>  
</Resources>  

ПеречисленияEnumerations

Общая схема поддерживает перечисления.The common schema supports enumerations. Перечисление — это дерево значений, с помощью которого можно ограничить значение свойства или атрибута.Enumerations are a tree of values that you can use to restrict the value of a property or attribute.

Каждое перечисление имеет обязательный уникальный атрибут ID и необязательный атрибут Parent .Each enumeration has a required unique ID attribute and an optional Parent attribute.

В следующем примере перечисление XBoxState определено с помощью трех возможных значений: Running, Stopped и Error.In the following example, the XBoxState enumeration is defined with three possible values: Running, Stopped, and Error.


<EnumerationTypes>  
   <EnumerationValue ID="XBoxState" Accessibility="Public"/>  
   <EnumerationValue ID="XBoxState.Running" Parent="XBoxState" Accessibility="Public"/>  
  <EnumerationValue ID="XBoxState.Stopped" Parent="XBoxState" Accessibility="Public"/>  
   <EnumerationValue ID="XBoxState.Error" Parent="XBoxState" Accessibility="Public" />  
   <EnumerationValue ID="XBoxState.Error.RROD" Parent="XBoxState.Error" Accessibility="Public" />  
</EnumerationTypes>  

В следующем примере класс Xbox определяет свойство enum типа XBoxState.In the following example, the Xbox class defines an enum property of type XBoxState.


<ClassType ID="XBox" Accessibility="Public" Base="System!System.ConfigItem" Hosted="true">  
   <Property ID="Id" Type="int" Key="true" />  
   <Property ID="Name" Type="string" />  
   <Property ID="State" Type="enum" EnumType="XBoxState" />  
</ClassType>  

ОтношенияRelationships

В общей схеме расширена функциональность определений отношений.The functionality of relationship definitions has been enhanced in the common schema. Тип RelationshipType теперь содержит дочерние элементы Source и Target со свойствами ID , которые могут использоваться в качестве отображаемых имен.The RelationshipType type now has Source and Target subelements with ID properties that can be used as display names. Кроме того, можно определить минимальное и максимальное количество элементов как для источника, так и для целевого объекта ( , например от 1 - до - 1 или от 0 - до - многих связей ) .In addition, you can define minimum and maximum cardinality for both the source and target (for example, 1-to-1 or 0-to-many relationships).

Кратность не обеспечивается процессом проверки пакета управления, однако она предназначена для определения пользовательских интерфейсов для пакета управления.Cardinality is not enforced by the management pack validation process, but it is intended to help define user interfaces for the management pack. Например, кратность может проверяться для того, чтобы определить, каким элементом управления может быть представлено поле в форме: текстовым полем или списком.For example, cardinality can be checked to determine whether a field can be represented in a form by a text box or by a list.

Важно!

Любое значение свойства MaxCardinality , которое больше 1, обрабатывается как бесконечное.Any MaxCardinality value that is defined as greater than 1 is processed as unlimited.

Если добавить новый тип отношения из собственного пакета управления, у пользователей должно быть достаточно прав для обновления всех свойств экземпляров исходного и целевого класса данного типа отношения, чтобы создать экземпляр нового типа отношения.If you add a new relationship type from your own management pack, users must have sufficient privileges to update all properties of the source and target class instances of the relationship type in order to create an instance of the new relationship type.

В следующем примере определяется отношение размещения с ( именем HasXboxes ) между типом " зал ожидания " и типом Xbox .In the following example, a hosting relationship (called HasXboxes) between the Lobby type and the Xbox type is defined. В этом определении отношения каждый тип Lobby может иметь несколько типов Xbox .In this relationship definition, each Lobby type can have multiple Xbox types.


<RelationshipType ID="HasXBboxes" Accessibility="Public" Base="System!System.Hosting">  
   <Source ID="Source" Type="Lobby" />  
   <Target ID="Target" Type="Xbox" MinCardinality="0" MaxCardinality="9999" />  
</RelationshipType>  

Комбинированные классыCombination classes

Комбинированные классы представляют собой агрегаты нескольких связанных типов в пакете управления, аналогичные представлениям, определенным в базе данных Microsoft SQL   Server, которые могут возвращать данные из нескольких таблиц.Combination classes represent an aggregation of multiple related types in the management pack, similar to views that are defined in a Microsoft SQL Server database that can return data from multiple tables. Комбинированные классы сохраняют и извлекают все агрегированные данные за одну операцию с базой данных и могут упростить определение пользовательских интерфейсов для пакета управления.Combination classes store and retrieve all the aggregated data in one operation to the database, and they can make it easier to define user interfaces for a management pack.

В следующем примере определена проекция для представления управления инцидентами.In the following example, a projection is defined for an incident management view. Эта проекция объединяет несколько различных компонентов, связанных с инцидентом, в один блок, который проще использовать для форм и операций с базой данных.This projection combines several different components that are related to an incident into one unit that can be used more easily for forms and for database operations.


<TypeProjections>  
   <TypeProjection ID="System.WorkItem.Incident.View.ProjectionType"  
      Accessibility="Public" Type="Incident!System.WorkItem.Incident">  
      <Component Alias="AffectedUser"  
Path="$Target/Path[Relationship='SMCore!System.WorkItemCreatedForUser']$"/>  
      <Component Alias="AssignedUser" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>  
   </TypeProjection>  
   <TypeProjection ID="System.WorkItem.Incident.View.DCMProjectionType" Accessibility="Public" Type="Incident!System.WorkItem.Incident.DCMIncident">  
      <Component Alias="AffectedUser" Path="$Target/Path[Relationship='SMCore!System.WorkItemCreatedForUser']$"/>  
      <Component Alias="AssignedUser" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>  
      <!--Baseline and Configuration Item Information-->  
      <Component Alias="AffectedComputer" Path="$Target/Path[Relationship='Incident!System.WorkItem.Incident.DCMIncident.Refers.NonComplianceComputer']$"/>  
   </TypeProjection>  
   <TypeProjection ID="System.WorkItem.ChangeRequestViewProjection" Accessibility="Public" Type="System.WorkItem.ChangeRequest">  
      <Component Alias="AssignedTo" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>  
   </TypeProjection>  
   <TypeProjection ID="System.WorkItem.ChangeRequestProjection" Accessibility="Public" Type="System.WorkItem.ChangeRequest">  
      <Component Alias="Activity" Path="$Target/Path[Relationship='SMActivity!System.WorkItemContainsActivity']$">  
         <Component Alias="ActivityAssignedTo" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>  
         <Component Alias="ActivityRelatedWorkItem" Path="$Target/Path[Relationship='SMCore!System.WorkItemRelatesToWorkItem']$">  
            <Component Alias="ActivityRelatedWorkItemAssignedTo" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>  
         </Component>  
         <Component Alias="ActivityRelatedConfigItem" Path="$Target/Path[Relationship='SMCore!System.WorkItemRelatesToConfigItem']$"/>  
         <Component Alias="ActivityAboutConfigItem" Path="$Target/Path[Relationship='System!System.WorkItemAboutConfigItem']$"/>  
         <Component Alias="ActivityFileAttachment" Path="$Target/Path[Relationship='System!System.WorkItemHasFileAttachment']$">  
            <Component Alias="ActivityFileAttachmentAddedBy" Path="$Target/Path[Relationship='System!System.FileAttachmentAddedByUser']$"/>  
         </Component>  
         <Component Alias="Reviewer" Path="$Target/Path[Relationship='SMActivity!System.ReviewActivityHasReviewer']$">  
            <Component Alias="User" Path="$Target/Path[Relationship='SMActivity!System.ReviewerIsUser']$"/>  
            <Component Alias="VotedBy" Path="$Target/Path[Relationship='SMActivity!System.ReviewerVotedByUser']$"/>  
         </Component>  
      </Component>  
      <Component Alias="CreatedBy" Path="$Target/Path[Relationship='SMCore!System.WorkItemCreatedByUser']$"/>  
      <Component Alias="AssignedTo" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>  
      <Component Alias="CreatedFor" Path="$Target/Path[Relationship='SMCore!System.WorkItemCreatedForUser']$"/>  
      <Component Alias="RelatedWorkItem" Path="$Target/Path[Relationship='SMCore!System.WorkItemRelatesToWorkItem']$">  
         <Component Alias="RelatedWorkItemAssignedTo" Path="$Target/Path[Relationship='SMCore!System.WorkItemAssignedToUser']$"/>  
      </Component>  
      <Component Alias="RelatedConfigItem" Path="$Target/Path[Relationship='SMCore!System.WorkItemRelatesToConfigItem']$"/>  
      <Component Alias="AboutConfigItem" Path="$Target/Path[Relationship='System!System.WorkItemAboutConfigItem']$"/>  
      <Component Alias="FileAttachment" Path="$Target/Path[Relationship='System!System.WorkItemHasFileAttachment']$">  
         <Component Alias="FileAttachmentAddedBy" Path="$Target/Path[Relationship='System!System.FileAttachmentAddedByUser']$"/>  
      </Component>  
   </TypeProjection>  
   <TypeProjection ID="System.FileAttachmentProjection" Accessibility="Public" Type="System!System.FileAttachment">  
      <Component Alias="FileAttachmentAddedBy" Path="$Target/Path[Relationship='System!System.FileAttachmentAddedByUser']$"/>  
   </TypeProjection>  
</TypeProjections>  

Задачи консолиConsole tasks

В общей схеме расширены задачи консоли.Console tasks are extended in the common schema. Раньше задачи консоли были простыми указателями на каталог приложения и имя исполняемого файла.Previously, console tasks were simple pointers to an application directory and executable file name. Задачи консоли теперь реализуются в виде кода обработчика в   сборке Microsoft .NET Framework.Console tasks are now implemented as handler code in a Microsoft .NET Framework assembly. Код обработчика ссылается на сборку, которая содержит код, имя обработчика и список именованных значений, которые могут быть переданы в обработчик в качестве аргументов.The handler code references the assembly that houses the code, the handler name, and a list of named values that can be passed as arguments to the handler.

В следующем примере обработчик Some.Handler.Name определен в сборке MyLibrary.Resources.Assembly .In the following example, the Some.Handler.Name handler is defined in the MyLibrary.Resources.Assembly assembly. Также определен список параметров обработчика и их значений.A list of handler parameters and their values is also defined.

<ConsoleTask ID="MyLibrary.ConsoleTasks.T1"  
    Accessibility="Public"  
     Target="System!System.Entity"  
     Enabled="true"  
     RequireOutput="true">  
   <Assembly>MyLibrary.Resources.Assembly1</Assembly>  
   <Handler>Some.Handler.Name</Handler>  
   <Parameters>  
      <Argument Name="Application">cmd.exe</Argument>  
      <Argument Name="WorkingDirectory">%TEMP%</Argument>  
      <Argument>test1</Argument>  
      <Argument>test2</Argument>  
   </Parameters>  
</ConsoleTask>  

РесурсыResources

Двоичные данные не хранятся непосредственно в пакете управления.Binary data is not stored directly in a management pack. Вместо этого в пакете управления хранятся метаданные о двоичном ресурсе, а сами двоичные данные хранятся во внешнем файле ресурсов.Instead, metadata about the binary resource is stored in the management pack, and the actual binary data is stored externally in a resource file. Метаданные включают уникальный идентификатор, имя файла, дату создания, дату изменения и сведения о доступности.The metadata includes a unique identifier, the file name, the creation data, the modified date, and accessibility information.

Двоичные данные могут включать универсальные ресурсы, изображения, сборки, определения отчетов и формы.Binary data can include generic resources, images, assemblies, report definitions, and forms. В следующем примере показан универсальный XML-ресурс, ресурс сборки и ресурс отчета.The following example shows a generic XML resource, an assembly resource, and a report resource.


<Resources>  
   <Resource ID="TestLibrary.Resources.Test1" Accessibility="Public" FileName="res1.xml"/>  
   <Resource ID="TestLibrary.Resources.Test2" Accessibility="Public" FileName="res2.xml"/>  
   <Assembly ID="TestLibrary.Resources.Assembly1" Accessibility="Public" QualifiedName="Baz, Version=1.0.0.0" FileName="baz.dll"/>  
   <Assembly ID="TestLibrary.Resources.Assembly2" Accessibility="Public" QualifiedName="Yoyo, Version=1.0.0.0" FileName="yoyo.dll">  
      <Dependency ID="TestLibrary.Resources.Assembly1"/>  
   </Assembly>  
   <ReportResource ID="TestLibrary.Resources.Report1" Accessibility="Public" MIMEType="text/xml" FileName="res1.xml"/>  
   <Image ID="TestLibrary.Resources.Image1" Accessibility="Public" FileName="image.png"/>  
</Resources>  

ФормыForms

Формы определяются в пакете управления.Forms are defined in a management pack. Формы можно использовать для просмотра и изменения одного экземпляра типа или комбинированного класса.You can use forms to view and modify a single instance of a type or combination class.

Формы основаны на WPF Windows Presentation Framework ( ) и определяются в сборках.Forms are based on the Windows Presentation Framework (WPF), and they are defined in assemblies. Сборка и класс, которые содержат реализации формы для пакета управления, включаются в раздел ресурсов пакета управления.The assembly and class that contain the form implementations for a management pack are included in the resources section of the management pack. Как и для любого двоичного ресурса в пакете управления, использующем новую общую схему, сам пакет управления не содержит двоичные данные для формы.As with any binary resource in a management pack that uses the new common schema, the management pack itself does not contain the binary data for the form. В пакете управления указывается только манифест ресурса.Only the resource manifest is specified in the management pack.

В пакете управления можно указать собственные данные конфигурации для формы.You can specify your own configuration information for the form in the management pack. В следующем примере раздел Configuration содержит свойство ShowXboxes .In the following example, the Configuration section contains a ShowXboxes property. Данные конфигурации не оцениваются процессом проверки пакета управления; они интерпретируются только реализацией формы.This configuration information is not evaluated by the management pack verification process; it is only interpreted by the form implementation.


    <Forms>  
   <Form ID="LobbyForm" Target="Projection" Assembly="FormAssembly" TypeName="MyFormClass">  
   <Configuration>  
      <ShowXboxes>yes</ShowXboxes>  
   </Configuration>  
   </Form>  
</Forms>  

Создание файла пакета управления для управления проекторамиAuthor a management pack file to manage projectors

Пакеты управления используются для направления и расширения функциональных возможностей Service Manager.Management packs are used to direct and extend the functionality of Service Manager. В данной статье используются проекторы для описания различных разделов пакета управления, а также создания различных объектов, необходимых для управления проекторами в рамках организации.This topic uses projectors as an example for describing the various sections of a management pack and for defining the various objects that are needed for managing projectors in an organization.

В статье приводится полноценный образец пакета управления с необходимыми расширениями для управления проекторами организации.This topic includes a complete management pack sample with the necessary extensions to manage projectors in an organization. Кроме того, в нем описано, как импортировать пакет управления с помощью   командлета Windows PowerShell.Also, it describes how to import a management pack using a Windows PowerShell cmdlet.

В этой статье описываются следующие разделы пакета управления:This topic describes the following sections of a management pack:

  • ManifestThe Manifest

  • TypeDefinitions (определения типов) для создания перечислений классов и отношений между классамиTypeDefinitions to create class enumerations and relationships

  • ФормыForms

В этом разделе также описаны следующие разделы пакета управления, содержащие объявления и определения для ( пользовательского интерфейса ) и элементов локализации.This topic also describes the following sections of a management pack that contain declarations and definitions for user interface (UI) and localization elements:

  • КатегорииCategories

  • Уровень представленияPresentation

  • Расширения классовClass Extensions

Раздел манифестаManifest section

Первый раздел пакета управления содержит манифест.The first section of a management pack contains the manifest. Манифест идентифицирует пакет управления и объявляет все ссылки на другие пакеты управления.The manifest identifies the management pack and declares any references to other management packs.

В примере ниже показан раздел Manifest из пакета управления, созданного для слежения за корпоративными проекторами.The following example shows the Manifest section of a management pack that was designed to track projectors in an organization.


<Manifest>  
  <Identity>  
    <ID>ServiceManager.Projector_Authoring</ID>  
    <Version>7.0.3707.0</Version>  
  </Identity>  
  <Name>Projector Library</Name>  
  <References>  
    <Reference Alias="System">  
      <ID>System.Library</ID>  
      <Version>7.0.3707.0</Version>  
      <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
    </Reference>  
    <Reference Alias="SMConsole">  
      <ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Console</ID>  
      <Version>7.0.3707.0</Version>  
      <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
    </Reference>  
    <Reference Alias="Authoring">  
      <ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring</ID>  
      <Version>7.0.3707.0</Version>  
      <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
    </Reference>  
    <Reference Alias="SMConfig">  
      <ID>ServiceManager.ConfigurationManagement.Library</ID>  
      <Version>7.0.3707.0</Version>  
      <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
    </Reference>  
  </References>  
</Manifest>  

Важно!

В разделе References не используйте небуквенно-цифровые значения, например ".", в псевдониме для ссылки.In the References section, do not use nonalphanumeric values, such as a '.', in the Alias for a reference.

Создание классов в разделе TypeDefinitionsCreate classes in the TypeDefinitions section

В этом разделе пакета управления содержатся определения типов.The next section of a management pack contains type definitions. Раздел TypeDefinitions содержит определения классов, перечислений и отношений, используемых пакетом управления.The TypeDefinitions section of a management pack contains definitions for classes, enumerations, and relationships that are used by the management pack.

В следующем примере представлен класс, содержащий сведения о проекторах:The following example shows a class that contains information about projectors:


<TypeDefinitions>  
    <EntityTypes>  
      <ClassTypes>  
        <ClassType ID="System.ConfigItem.Projector" Base="System!System.ConfigItem" Hosted="false" Accessibility="Public" Abstract="false">  
          <Property ID="SerialNumber" Type="int" Key="true" />  
          <Property ID="Make" Type="string" />  
          <Property ID="Model" Type="string"  />  
          <Property ID="Location" Type="string" />  
          <Property ID="Condition" Type="enum" EnumType="ProjectorCondition"  />  
        </ClassType>  
      </ClassTypes>  
      <RelationshipTypes>  
      </RelationshipTypes>  
      <EnumerationTypes>  
        <EnumerationValue ID="ProjectorCondition" Accessibility="Public"/>  
        <EnumerationValue ID="ProjectorCondition.Working" Parent="ProjectorCondition" Accessibility="Public"/>  
        <EnumerationValue ID="ProjectorCondition.BeingRepaired" Parent="ProjectorCondition" Accessibility="Public"/>  
        <EnumerationValue ID="ProjectorCondition.New" Parent="ProjectorCondition" Accessibility="Public"/>  
        <EnumerationValue ID="ProjectorCondition.Broken" Parent="ProjectorCondition" Accessibility="Public"/>  
        <EnumerationValue ID="ProjectorViewTasksEnumeration" Accessibility="Public"/>  
      </EnumerationTypes>  
    </EntityTypes>  
  </TypeDefinitions>  

Ниже приведен раздел - с - описанием того, что содержит определение типа.The following is a section-by-section explanation of what the type definition contains.

Раздел раздел classtypesThe ClassTypes section

Элемент ClassType определяет класс проектора:The ClassType element defines the projector class:

<ClassType ID="System.ConfigItem.Projector" Base="System!System.ConfigItem" Hosted="false" Accessibility="Public" Abstract="false">

Атрибут ID является уникальным идентификатором данного класса.The ID attribute is the unique identifier of this class. Ему присвоено следующее значение:It is set to:

ID="System.ConfigItem.Projector"

Атрибут Base является идентификатором класса, из которого происходит данный класс.The Base attribute is the ID of the class from which this class derives. Поскольку проектор в каком-то роде является элементом конфигурации, этот атрибут имеет следующее значение:Because a projector is a kind of configuration item, this is set to:

Base="System!System.ConfigItem"

Нотация **системы ! **The notation of System! обозначает, что данный класс ( System.ConfigItem) находится в пакете управления, ссылка на который осуществляется при помощи псевдонима System.indicates that this class, System.ConfigItem, is in the management pack that is referenced by the alias System.

Атрибут Hosted определяет, размещен ли данный класс в другом классе.The Hosted attribute defines whether this class is hosted by another class. Если это так, экземпляр данного класса может существовать только при условии, что существует родительский экземпляр.In this case, an instance of this class can only exist when a host instance exists that contains it. В данном примере проекторы не размещены внутри какого-либо класса, поэтому атрибут Hosted имеет значение false.For this example, projectors are not hosted by anything; therefore, the Hosted attribute is set to false:

Hosted="false"

Если атрибут Hosted имеет значение true , это означает, что класс размещен в другом классе.Setting the Hosted attribute to true indicates that the class is hosted by another class. Отношение размещения должно быть объявлено в разделе RelationshipTypes .A hosting relationship must be declared in the RelationshipTypes section.

Атрибут Accessibility определяет, могут ли другие классы использовать данный класс в качестве базового.The Accessibility attribute defines whether other classes can derive from this class. Чтобы позволить другим создавать специализированные версии класса, установите этому атрибуту значение public, например, следующим образом:In cases where you might want to allow others to create a more specific version of your class, set this attribute to public, for example:

Accessibility="Public"

Установка атрибуту Accessibility значения Internal предотвращает создание классов на основе данного класса.Setting the Accessibility attribute to Internal prevents other classes from deriving from this class.

Атрибут Abstract определяет, можно ли создавать экземпляры данного класса, или же класс используется лишь в качестве родительского класса для других классов.The Abstract attribute defines whether instances of this class can be created, or whether the class should just be used as a parent class to other classes to derive from. В данном примере этот атрибут имеет значение false.In this example, this attribute is set to false. Установка для атрибута значения true приводит к невозможности непосредственного создания экземпляров этого класса, позволяя использовать его лишь в качестве родительского класса.Setting this attribute to true means that no instances of this class can be created directly and that this class can be used only as a parent class.

В следующем разделе определения класса находятся свойства класса.The next section of the class definition contains the class properties. XML-код, определяющий свойства класса в данном примере, приведен ниже.The XML that defines the class properties for this example are defined in the following code example:


<Property ID="SerialNumber" Type="int" Key="true" />  
<Property ID="Make" Type="string" />  
<Property ID="Model" Type="string"  />  
<Property ID="Location" Type="string" />  
<Property ID="Condition" Type="enum" EnumType="ProjectorCondition"  />  

Каждый элемент Property имеет следующие атрибуты:Each Property element has the following attributes:

  • Атрибут ID представляет собой уникальный идентификатор свойства.The ID attribute, which designates the unique identifier of the property.

  • Атрибут Type , обозначает тип данных свойства.The Type attribute, which indicates the data type of the property.

  • Ключевой атрибут.The Key attribute. Установка данному атрибуту значения true обозначает, что это свойство будет использоваться в качестве уникального идентификатора данного класса.Setting this attribute to true indicates that this property is to be used to uniquely identify this class.

Создание типов перечисленийCreating Enumeration Types

Перечисления типа enum являются специальными типами данных.Enumerations of the enum data type are special data types. Перечисления используются для ограничения возможных значений свойства заранее определенным набором.Enumerations are used to constrain the data that is allowed for a property to a specific set of values. Перечисления могут быть иерархическими, одно перечисление может основываться на другом.Enumerations can be hierarchical; one enumeration can be based on another enumeration.

Перечисления создаются в разделе пакета решения EnumertionTypes .Enumerations are defined in the EnumertionTypes section of a solution pack. Определение перечисления содержит корневое перечисление, за которым следуют фактические значения перечисления.An enumeration definition contains the root enumeration, followed by the actual enumeration values.

Каждый EnumerationValue принимает несколько атрибутов:Each EnumerationValue accepts a few attributes:

В данном примере перечисление определяется для отслеживания технического состояния проекторов.In this example, an enumeration is defined for keeping track of the condition of the projectors. Ниже представлено определение данного перечисления.The following defines this enumeration:

  • ID является идентификатором перечисления или значения перечисления.ID is the identifier for the enumeration or enumeration value.

  • Accessibility указывает, может ли данный перечислитель содержать другие перечислители.Accessibility specifies whether this enumerator can contain other enumerators.

  • ParentName — это атрибут, указывающий значение ID для родительского элемента значения перечислителя.ParentName is an attribute that specifies the ID of the parent of the enumerator value.


<EnumerationTypes>  
   <EnumerationValue ID="ProjectorCondition" Accessibility="Public"/>  
   <EnumerationValue ID="ProjectorCondition.Working" Parent="ProjectorCondition" Accessibility="Public"/>  
   <EnumerationValue ID="ProjectorCondition.BeingRepaired" Parent="ProjectorCondition" Accessibility="Public"/>  
   <EnumerationValue ID="ProjectorCondition.New" Parent="ProjectorCondition" Accessibility="Public"/>  
   <EnumerationValue ID="ProjectorCondition.Broken" Parent="ProjectorCondition" Accessibility="Public"/>  
   <EnumerationValue ID="ProjectorViewTasksEnumeration" Accessibility="Public"/>  
</EnumerationTypes>  

Создание формыCreate a form

Service Manager формы основаны на формах WPF Windows Presentation Framework ( ) .Service Manager forms are based on Windows Presentation Framework (WPF) forms. Service Manager расширяет WPF с помощью простых атрибутов, которые добавляются в определение XML и позволяют Service Manager привязывать данные из пакета управления к форме.Service Manager extends WPF with simple attributes that are added to the XML definition and allow Service Manager to bind data from the management pack to the form.

Service Manager формы можно создавать с помощью нескольких различных средств, в том числе Microsoft Visual Studio или Microsoft Expression Blend.Service Manager forms can be created by using several different tools, including Microsoft Visual Studio or Microsoft Expression Blend. Поскольку формы - основаны на XML, их также можно определить с помощью любого редактора XML.Because the forms are XML-based, they can also be defined by using any XML editor.

В примере ниже показано определение формы, созданное при помощи пакета Microsoft Expression Blend.The following example shows a form definition that was created by using Microsoft Expression Blend. В данной форме размещены четыре элемента управления, три текстовых поля и одно поле со списком. Все они привязаны к свойствам класса Проектор , которые были определены ранее.This form contains four controls, three text boxes and one combo box, that are bound to the Projector class properties that were defined previously:


<UserControl xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:SMFormsDemo" x:Class="SMFormsDemo.TestControl" x:Name="Control" Width="574" Height="390" Opacity="1" xmlns:d="https://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}">  
   <UserControl.Resources>  
      <ObjectDataProvider ObjectType="{x:Type local:helper}" MethodName="GetStatusValues" x:Key="getStatusValues"/>  
   </UserControl.Resources>  
   <Grid x:Name="LayoutRoot">  
      <Label Margin="70,20,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Serial Number:"/>  
      <TextBox Margin="180,20,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=SerialNumber, Mode=TwoWay}"/>  
      <Label Margin="70,60,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Make:"/>  
      <TextBox Margin="180,60,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Make, Mode=TwoWay}"/>  
      <Label Margin="70,100,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Model:"/>  
      <TextBox Margin="180,100,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Model, Mode=TwoWay}"/>  
      <Label Margin="70,140,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Location:"/>  
      <TextBox Margin="180,140,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Location, Mode=TwoWay}"/>  
      <Label Margin="70,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Condition:"/>  
      <ComboBox Margin="180,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }" IsSynchronizedWithCurrentItem="True">  
         <ComboBox.SelectedItem>  
            <Binding Path="Condition" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>  
         </ComboBox.SelectedItem>  
         <ComboBox.ItemTemplate>  
            <DataTemplate>  
               <StackPanel>  
                  <TextBlock Text="{Binding Path=DisplayName}"/>  
               </StackPanel>  
            </DataTemplate>  
         </ComboBox.ItemTemplate>  
      </ComboBox>  
   </Grid>  
</UserControl>  

Чтобы активировать привязку элементов управления формой к свойствам класса, определенным в пакете управления, следует указать ряд элементов.To enable binding of controls on the form to class properties that are defined in a management pack, a number of items must be specified.

Привязка текстовых элементов управленияBinding Text Controls

Чтобы привязать текстовые поля к свойствам класса в пакете управления, добавьте тег пути привязки к свойству Text элемента управления Text Box, например:To bind text boxes to class properties in a management pack, add a Binding Path tag to the text box control's Text property, for example:

{Binding Path=SerialNumber, Mode=TwoWay}  

Этот тег привязывает элемент управления "текстовое поле" к свойству SerialNumber класса проектора , который был определен в пакете управления, и указывает, что это должна быть двусторонняя - Привязка.This tag binds the text box control to the SerialNumber property of the Projector class that was defined in the management pack, and it specifies that this should be a two-way binding. Значение этого свойства извлекается из базы данных и отображается в текстовом поле при загрузке формы. Если пользователь меняет его, новое значение свойства сохраняется в базе данных.The value of the property is retrieved from the database and displayed in the text box when the form is loaded, and the property value is stored back to the database if it is changed by the user.

Привязка полей со спискомBinding Combo Boxes

Чтобы разрешить форме получать данные перечисления из базового пакета управления и привязывать их к элементу управления в форме, вспомогательный класс должен быть определен в коде - программной части в форме.To allow the form to retrieve enumeration data from the underlying management pack and bind it to a control on the form, a helper class must be defined in the code-behind in the form. Класс поддержки должен иметь метод, который возвращает перечисление, определенное в пакете управления.This helper class should contain a method that returns an enumeration that is defined in the management pack. Для возврата перечисления используйте метод GetEnumerations , принадлежащий текущему пакету управления.To return an enumeration use the GetEnumerations method of the current management pack. Доступ к этому экземпляру осуществляется с помощью класса ConsoleContextHelper из пакета SDK пакета средств разработки программного обеспечения Service Manager ( ) .This instance is accessed with the ConsoleContextHelper class from the Service Manager software development kit (SDK). В приведенном ниже примере класс поддержки определяет метод GetStatusValues , извлекающий значения перечисления ProjectorCondition , которое было определено в пакете управления.In the following example, a helper class defines a GetStatusValues method that retrieves the values for the ProjectorCondition enumeration that was defined in the management pack:


public class helper  
{  
   public static ICollection<IDataItem> GetStatusValues()  
   {  
      return ConsoleContextHelper.Instance.GetEnumerations("ProjectorCondition",true);  
   }  
}  

Чтобы получить доступ к данному методу, в находящемся в пакете управления определении формы следует определить ряд элементов.To access this method, a few things must be defined in the form definition in the management pack.

Прежде всего в определение формы добавляется пространство имен, указывающее на пространство имен code behind для формы.First, a namespace that points to the namespace for the code behind for the form is added to the form definition. В данном примере используется пространство имен SMFormsDemo.In this example, the namespace is SMFormsDemo:

xmlns:local="clr-namespace:SMFormsDemo"  

Далее следует определить объект ObjectDataProvider для передачи значений полю со списком, отображающему состояние проектора.Next, an ObjectDataProvider must be defined to provide the values for the combo box that displays the projector status. ObjectDataProvider определяется в виде ресурса:This ObjectDataProvider is defined as a resource:


<UserControl.Resources>  
   <ObjectDataProvider   
      ObjectType="{x:Type local:helper}"    
      MethodName="GetStatusValues"   
      x:Key="getStatusValues" />  
</UserControl.Resources>  

Этот поставщик данных указывает объект и метод, используемые для получения значений перечисления из пакета управления.This data provider specifies the object and method name that retrieves the enumeration values from the management pack.

И, наконец, чтобы привязать поле со списком к значениям перечисления, указанным в пакете управления, в определение поля со списком добавляется атрибут ItemsSource .Finally, to bind the combo box to the enumeration values that are defined in the management pack, an ItemsSource attribute is added to the combo box definition. Данный атрибут указывает, куда извлечь значения перечисления, например:This attribute specifies where to retrieve the enumeration values, for example:

ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }"  

Затем элементы SelectedItem и ItemTemplate добавляются в ( определение XAML XAML ) элемента управления "поле со списком".Next, SelectedItem and ItemTemplate elements are added to the Extensible Application Markup Language (XAML) definition of the combo box control. В следующем примере показывается определение поля со списком с дополнительным XAML-кодом привязки.The following example shows the combo box definition with the binding XAML included:


<ComboBox Margin="180,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }" IsSynchronizedWithCurrentItem="True">  
   <ComboBox.SelectedItem>  
      <Binding Path="Condition" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>  
   </ComboBox.SelectedItem>  
   <ComboBox.ItemTemplate>  
      <DataTemplate>  
         <StackPanel>  
            <TextBlock Text="{Binding Path=DisplayName}"/>  
         </StackPanel>  
      </DataTemplate>  
   </ComboBox.ItemTemplate>  
</ComboBox>  

Раздел категорииThe Category section

Раздел Category группирует элементы пакета управления для упрощения навигации.The Category section of a management pack groups management pack elements together for easier navigation.

Первые два <Category> элемента в примере используются для управления отображением задач " Создание и изменение " в представлении " Проекторы ".The first two <Category> elements in the example are used to control the display of the New and Edit tasks in the Projectors view.

<Category ID="ProjectorViewHasTasks.View" Target="AllProjectorsView" Value="ProjectorViewTasksEnumeration" />  
<Category ID="ProjectorViewHasTasks.CreateTask" Target="CreateProjector" Value="ProjectorViewTasksEnumeration" />  

Второй элемент категории в примере пакета управления используется для того, чтобы перечисление условий проектора отображалось в представлении " списки " в области " создание и Настройка" консоли Service Manager.The second two Category elements in the example management pack are used to make the projector condition enumeration appear in the Lists view in the Authoring pane in the Service Manager console. Это позволяет пользователю выполнять настройку значений:This enables the user to customize the values:

<Category ID="Project.ProjectorConditionEnumVisibleCategory" Target="ProjectorCondition" Value="System!VisibleToUser"/>  

Добавление данной категории в представленный ниже пример приводит к появлению задачи Правка в представлении Списки для значения EnumerationValue , на которое указывает атрибут Target .Adding this category in the following example makes the Edit task appear in the Lists view for the EnumerationValue that is pointed at in the Target attribute:

<Category ID="Projector.ProjectorConditionCategory" Target="ProjectorCondition" Value="Authoring!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.EnumerationViewTasks"/>  

Раздел "Презентация"The Presentation section

В разделе Presentation пакета управления объявляются и определяются элементы, - связанные с пользовательским интерфейсом - .The Presentation section of a management pack declares and defines user-interface-related elements. К этому разряду относятся объявления форм, категории и задачи консоли.These include forms declarations, categories, and console tasks.

Раздел FormsThe Forms Section

В разделе Forms объявляются формы, используемые пакетом управления.The Forms section declares forms that are used by your management pack. В примере ниже указывается расположение формы, определенной для отображения и изменения экземпляров класса Projector .The following example specifies where to find the form that is defined to display and edit instances of the Projector class. Данный код привязывает форму к классу Projector , определенному в пакете управления.This binds the form to the Projector class that is defined in the management pack:


<Forms>  
   <Form TypeName="SMFormsDemo.TestControl"  
      ID="TestForm"  
      Target="System.ConfigItem.Projector"  
      Assembly="ProjectorFormsAssembly"  
      Accessibility="Public">  
   <Category>Form</Category>  
   </Form>  
</Forms>  

В представленном выше примере используются следующие атрибуты:The following attributes are used in the preceding example:

  • Атрибут TypeName содержит пространство имен и имя класса для формы.The TypeName attribute contains the namespace and class name of the form.

  • Атрибут ID содержит уникальный идентификатор данного экземпляра формы.The ID attribute contains the unique identifier of this form instance.

  • Атрибут Target содержит имя класса, к которому привязана данная форма.The Target attribute contains the name of the class that this form is bound to.

  • Атрибут Assembly указывает на внешний ресурс, в котором размещена форма.The Assembly attribute points to the external resource that contains the form.

  • Атрибут Accessibility определяет возможность настройки данной формы.The Accessibility attribute defines whether this form can be customized.

Определение представленияDefining a View

В разделе " представления " пакета управления содержатся определения представлений пользовательских интерфейсов ( пользовательского интерфейса ) .The Views section of a management pack contains definitions of user interface (UI) views. Эти представления можно использовать для фильтрации и отображения объектов пакета управления.These views can be used to filter and display objects in a management pack.

<View Target="System.ConfigItem.Projector"   
Enabled="true"  
TypeID="SMConsole!GridViewType"  
ID="AllProjectorsView"  
Accessibility="Public">  
<Category>NotUsed</Category>  
<Data>  
<Adapters>  
      <Adapter AdapterName="dataportal:EnterpriseManagementObjectAdaptor">  
                <AdapterAssembly>Microsoft.EnterpriseManagement.UI.SdkDataAccess</AdapterAssembly>  
   <AdapterType>  
Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.EnterpriseManagementObjectAdapter  
   </AdapterType>  
      </Adapter>  
            <Adapter AdapterName="viewframework://adapters/ListDefault">  
              <AdapterAssembly>Microsoft.EnterpriseManagement.UI.ViewFramework</AdapterAssembly>  
              <AdapterType>Microsoft.EnterpriseManagement.UI.ViewFramework.ListSupportAdapter</AdapterType>  
            </Adapter>  
</Adapters>  
<ItemsSource>  
  <AdvancedListSupportClass DataTypeName="" AdapterName="viewframework://adapters/AdvancedList" FullUpdateAdapter="dataportal:EnterpriseManagementObjectAdapter" FullUpdateFrequency='1' DataSource="mom:ManagementGroup" IsRecurring="true" RecurrenceFrequency="5000"  treaming='true' xmlns="clr-namespace:Microsoft.EnterpriseManagement.UI.ViewFramework;assembly=Microsoft.EnterpriseManagement.UI.ViewFramework" xmlns:av="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" >  
    <AdvancedListSupportClass.Parameters>  
                <QueryParameter Parameter="TargetClass" Value="System.ConfigItem.Projector"/>  
    </AdvancedListSupportClass.Parameters>  
    </AdvancedListSupportClass>  
    </ItemsSource>  
    <Criteria />  
</Data>  
<Presentation>  
<Columns>  
            <mux:ColumnCollection xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:mux="https://schemas.microsoft.com/SystemCenter/Common/UI/Views/GridView" xmlns:s="clr-namespace:System;assembly=mscorlib">  
              <mux:Column Name="SerialNumber" DisplayMemberBinding="{Binding Path=SerialNumber}" Width="100" DisplayName="SerialNumber" Property="SerialNumber" DataType="s:Int32" />  
              <mux:Column Name="Location" DisplayMemberBinding="{Binding Path=Location}" Width="100" DisplayName="Location" Property="Location" DataType="s:String" />  
              <mux:Column Name="Condition" DisplayMemberBinding="{Binding Path=Condition.DisplayName}" Width="100" DisplayName="Condition" Property="Condition.DisplayName" DataType="s:String" />  
              <mux:Column Name="DisplayName" DisplayMemberBinding="{Binding Path=DisplayName}" Width="100" DisplayName="Display Name" Property="DisplayName" DataType="s:String" />  
              <mux:Column Name="OwnerUser" DisplayMemberBinding="{Binding Path=OwnerUser.DisplayName}" Width="100" DisplayName="SupportOwner" Property="OwnerUser.DisplayName" DataType="s:String" />  
            </mux:ColumnCollection>      
</Columns>  
</Presentation>  
</View>  

Атрибут View Target указывает на класс, который будет отображаться в представлении.The View Target attribute points to the class that the view will be used to display.

Пример выше содержит ссылку на пакет управления консоли Service Manager.In the preceding example, the Service Manager Console management pack is referenced. Данный пакет управления содержит определение используемого типа представления.This management pack contains a definition of a view type being used. В этом экземпляре определен тип представления определен ! GridViewType .In this instance, the SMConsole!GridViewType view type is defined.

Элемент AdvancedListSupportClass определяет ряд параметров, самым важным из которых является параметр TargetClass .The AdvancedListSupportClass defines a number of parameters, the most important of which is the TargetClass parameter. Установите этому параметру значение ID из элемента ClassType , который будет показан в данном представлении.Set this parameter to the ID of the ClassType that will appear in this view. Для отображения столбцов, являющихся свойствами элемента ClassType, используйте элемент Column и привяжите его к атрибуту PropertyID .To display the columns that are properties of the ClassType, use the Column element and bind it to the PropertyID attribute.

Атрибут атрибут IsRecurring элемента IsRecurring определяет, будет ли автоматическое - Обновление представления.The IsRecurring attribute of the ListSupportClass element determines whether the view auto-refreshes. Атрибут RecurrenceFrequency определяет интервал обновления в миллисекундах.The RecurrenceFrequency attribute defines the refresh interval in milliseconds. В данном примере интервал обновления установлен в 1 секунду, что не рекомендуется в рабочей среде.In this example, the refresh interval is set to 1 second, but that is not recommended for production installations.

Определение папокDefining Folders

Путем определения папки обозначается расположение в дереве навигации, где будет отображено представление.Defining a folder determines the location in the navigation tree in which the view is displayed. В данном примере элемент конфигурации определен так, что представление можно разместить только в существующей папке для элементов конфигурации, в рабочей области Элементы конфигурации .In this example, a configuration item is defined so that it is only suitable to place the view under the existing folder for configuration items in the Configuration Items workspace:

<Folders>  
  <Folder ID="Folder.Projectors" Accessibility="Public" ParentFolder="SMConfig!ServiceManager.Console.ConfigurationManagement.ConfigItem.Root" />  
</Folders>  
<FolderItems>  
   <FolderItem   
      ElementID="AllProjectorsView"   
      Folder="Folder.Projectors" />  
   </FolderItems>  

В примере выше атрибут ElementID содержит ссылку на созданное представление.In the preceding example, the ElementID attribute contains a reference to the view that was created. Атрибут Folder указывает на папку Folders. Projects , которая, в свою очередь, имеет корень, как определено в рабочей области Управление конфигурацией консоли Service Manager.The Folder attribute points to a Folders.Projectors folder, which in turn has its root as defined in the Configuration Management workspace of the Service Manager console. Данная корневая папка определена в пакете управления "Управление конфигурацией".This root folder is defined in the Configuration Management management pack.

Элемент ImageReference сопоставляет созданное представление со значком, определенным в пространстве имен Configuration Management .The ImageReference element maps the view that was previously created to an icon that is defined in the Configuration Management namespace:

<ImageReferences>  
  <ImageReference ElementID="Folder.Projectors" ImageID="SMConfig!ConfigItemImage16x16" />  
  <ImageReference ElementID="AllProjectorsView" ImageID="SMConfig!ConfigItemImage16x16" />  
</ImageReferences>  

Локализация с помощью раздела LanguagePacksLocalization Using the LanguagePacks Section

Раздел LanaguagePacks определяет строковые ресурсы и сопоставления для элементов пакета управления.The LanaguagePacks section of a management pack defines string resources and mappings for management pack elements.

В этом примере енумератионвалуепрожекторкондитион. Work должен выглядеть как работает.In the example, the EnumerationValueProjectorCondition.Working must appear as Working. Для этого следует определить отображаемые имена всех следующих элементов:To do this, display names for each of the following must be defined:

  • Представление: Все проекторыView: All projectors

  • Перечисления: работает, неисправен, в ремонте, новыйEnumerations: working, broken, in repair, new

  <LanguagePacks>  
    <LanguagePack ID="ENU" IsDefault="true">  
      <DisplayStrings>  
        <DisplayString ElementID="AllProjectorsView">  
          <Name>All Projectors</Name>  
          <Description>This displays all projectors</Description>  
        </DisplayString>  
        <DisplayString ElementID="ProjectorCondition.Working">  
          <Name>Working</Name>  
        </DisplayString>  
        <DisplayString ElementID="ProjectorCondition.Broken">  
          <Name>Broken</Name>  
        </DisplayString>  
        <DisplayString ElementID="ProjectorCondition.BeingRepaired">  
          <Name>In Repair</Name>  
        </DisplayString>  
        <DisplayString ElementID="ProjectorCondition.New">  
          <Name>New</Name>  
        </DisplayString>  
      </DisplayStrings>  
    </LanguagePack>  
</LanguagePacks>  

При необходимости вы можете создать дополнительные элементы LanguagePack на каждом нужном языке.You can create additional LanguagePack elements, as necessary, for each additional language you require. На основании языкового стандарта пользователя отображается правильная отображаемая строка пользователя.The correct display string appears to the user based on the user's locale.

РесурсыResources

Раздел Resources содержит ссылки на двоичные ресурсы, которые находятся в сборках за пределами пакета управления.The Resources section of a management pack contains references to binary resources, which are contained in assemblies that are separate from the management pack. В приведенном ниже примере определяется ресурс, указывающий на сборку, содержащую форму, которая используется классом Projector .In the following example, a resource is defined that points to the assembly that contains the form that is used by the Projector class:

<Assembly ID="ProjectorFormsAssembly"    
         Accessibility="Public"   
         QualifiedName="SMFormsDemo, Version=1.0.0.0" FileName="SMFormsDemo.dll" CreationDate="1900-10-12T13:13:13" ModifiedDate="2008-12-12T12:12:12" />  

Расширения классовClass extensions

Расширение класса — это класс, который добавляет свойства в существующий класс.A class extension is a class that adds properties to an existing class. В большинстве случаев существующий класс содержится в запечатанном пакете управления.In most cases, this existing class is in a sealed management pack. В тех случаях, когда существующий класс не содержится в запечатанном пакете управления, расширение класса должно содержаться в том же пакете управления, что и расширяемый класс.In cases where the existing class is not in a sealed management pack, the class extension must be contained in the same management pack as the class that is being extended.

Расширение класса наследует свойства всех родительских классов, например:A class extension inherits the properties of any parent classes, for example:

  • Класс А имеет свойство с именем Свойство1.Class A has a property called Property1

  • Класс B является производным от класса А или расширяет его, следовательно, он имеет свойство с именем Свойство1.Class B derives from, or extends, Class A and therefore has a property called Property1. Это свойство наследуется от класса а, родительского или базового класса)This property is inherited from Class A, the parent, or base class)

  • Определение класса B добавляет свойство с именем Свойство2.The definition of Class B adds a property called Property2.

  • Любое расширение класса, производное от класса B, унаследует Свойство1 и Свойство2.Any class extension that derives from Class B will inherit Property1 and Property2.

    В следующем примере показано определение расширения класса.The following example shows a class extension definition:


<TypeDefinitions>  
     <EntityTypes>  
       <ClassTypes>  
         <ClassType ID="IncidentManagmentPack.Extension" Accessibility="Public" Base="Incident!System.WorkItem.Incident" Hosted="false" IsExtensionType="true">  
          <Property ID="TimeOnIncident" Type="int" Key="false" />  
        </ClassType>  
      </ClassTypes>  
    </EntityTypes>  
  </TypeDefinitions>  

Это расширение класса расширяет класс System.WorkItem.Incident и добавляет новое свойство с именем TimeOnIncident.This class extension extends the System.WorkItem.Incident class and adds a new property called TimeOnIncident.

Определение расширения класса похоже на определение класса.The definition for a class extension is similar to that of a class definition. Для определения класса используются два атрибута элемента ClassType : атрибут Base и атрибут IsExtensionType .Two attributes of the ClassType element are used to define a class definition: the Base attribute and the IsExtensionType attribute.

Атрибут Base определяет ID родительского класса, от которого является производным расширение класса.The Base attribute specifies the ID of the parent class from which the class extension derives. В этом экземпляре значение атрибута задается как инцидент ! System. WorkItem. инцидент.In this instance, the attribute value is set to Incident!System.WorkItem.Incident. Это значение содержит Alias полного имени пакета управления и состоит из имени расширяемого класса, восклицательного знака и имени базового класса.This value contains the Alias of the full management pack name, which contains the class being extended, an exclamation point, and then the name of the base class. Дополнительные сведения см. в следующем примере.For more information, see the following example.

Атрибут IsExtensionType определяет, является ли данный класс расширением базового класса.The IsExtensionType attribute defines whether this class is an extension of the base class. Поскольку TimeOnIncident является расширением класса Incident , это свойство имеет значение true:Because TimeOnIncident is an extension to the Incident class, this property is set to true:

IsExtensionType="true"  

Это свойство также может иметь значение false, которое указывает на то, что данный класс — это не расширение другого класса, а новый класс, унаследованный от базового.The other option is false, which indicates that it is not an extension of another class but a new class that inherits from the base. По умолчанию используется значение false, поэтому этот атрибут не нужно использовать, если класс не является расширением.The default value is false; therefore, this attribute does not have to be used if the class is not an extension.

Полный примерFull Example

В следующем примере кода показан полный пакет управления, содержащий расширение класса.The following code example shows the full management pack containing the class extension.

ManagementPack xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" ContentReadable="true" SchemaVersion="1.1">  
   <Manifest>  
     <Identity>  
      <ID>ServiceManager.Extension</ID>  
      <Version>1.0.0.0</Version>  
     </Identity>  
    <Name>ServiceManagerExtension</Name>  
     <References>  
       <Reference Alias="System">  
        <ID>System.Library</ID>  
        <Version>1.0.2780.0</Version>  
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
      </Reference>  
      <Reference Alias="Incident">  
        <ID>System.WorkItem.Incident.Library</ID>  
        <Version>1.0.2780.0</Version>  
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
      </Reference>  
    </References>  
  </Manifest>  
   <TypeDefinitions>  
     <EntityTypes>  
       <ClassTypes>  
         <ClassType ID="IncidentManagmentPack.Extension" Accessibility="Public" Base="Incident!System.WorkItem.Incident" Hosted="false" Extension="true">  
          <Property ID="TimeOnIncident" Type="int" Key="false" />  
        </ClassType>  
      </ClassTypes>  
    </EntityTypes>  
  </TypeDefinitions>  
</ManagementPack>  

Импорт пакета управления с помощью командлетаImport a management pack by using a cmdlet

С помощью   командлета импорта - SCSMManagementPack Windows PowerShell можно импортировать пакет управления Service Manager, например:You can use the Windows PowerShell Import-SCSMManagementPack cmdlet to import a Service Manager management pack, for example:

Import-SCSMManagementPack MyServiceManager.ManagementPack.xml  

В этом документе не описано, как импортировать и использовать пакеты управления в консоли Service Manager.This document does not describe how to import and use management packs in the Service Manager console. Сведения об использовании пакетов управления в консоли Service Manager см. в разделе Использование пакетов управления в Service Manager.For information about using management packs in the Service Manager console, see Using Management Packs in Service Manager.

Пример полного пакета управленияFull management pack example

В следующих примерах кода представлен полный пример пакета управления, который используется для примеров в этом разделе в дополнение к определению формы и коду на языке # C - для формы.The following code examples represent the full sample management pack that is used for examples in this topic, in addition to the form definition and the C# code-behind for the form.

Пакет управленияManagement Pack

<ManagementPack ContentReadable="true" SchemaVersion="1.1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  <Manifest>  
    <Identity>  
      <ID>ServiceManager.Projector</ID>  
      <Version>7.0.3707.0</Version>  
    </Identity>  
    <Name>Projector Library</Name>  
    <References>  
      <Reference Alias="SMConsole">  
        <ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Console</ID>  
        <Version>7.0.3707.0</Version>  
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
      </Reference>  
      <Reference Alias="Authoring">  
        <ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring</ID>  
        <Version>7.0.3707.0</Version>  
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
      </Reference>  
      <Reference Alias="System">  
        <ID>System.Library</ID>  
        <Version>7.0.3707.0</Version>  
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
      </Reference>  
      <Reference Alias="SMConfig">  
        <ID>ServiceManager.ConfigurationManagement.Library</ID>  
        <Version>7.0.3707.0</Version>  
        <PublicKeyToken>31bf3856ad364e35</PublicKeyToken>  
      </Reference>  
    </References>  
  </Manifest>  
  <TypeDefinitions>  
    <EntityTypes>  
      <ClassTypes>  
        <ClassType ID="System.ConfigItem.Projector" Accessibility="Public" Abstract="false" Base="System!System.ConfigItem" Hosted="false" Singleton="false" Extension="false">  
          <Property ID="SerialNumber" Type="int" Key="true" />  
          <Property ID="Make" Type="string" />  
          <Property ID="Model" Type="string" />  
          <Property ID="Location" Type="string" />  
          <Property ID="Condition" Type="enum" EnumType="ProjectorCondition" />  
        </ClassType>  
      </ClassTypes>  
      <EnumerationTypes>  
        <EnumerationValue ID="ProjectorCondition" Accessibility="Public" />  
        <EnumerationValue ID="ProjectorCondition.Working" Accessibility="Public" Parent="ProjectorCondition" />  
        <EnumerationValue ID="ProjectorCondition.BeingRepaired" Accessibility="Public" Parent="ProjectorCondition" />  
        <EnumerationValue ID="ProjectorCondition.New" Accessibility="Public" Parent="ProjectorCondition" />  
        <EnumerationValue ID="ProjectorCondition.Broken" Accessibility="Public" Parent="ProjectorCondition" />  
        <EnumerationValue ID="ProjectorViewTasksEnumeration" Accessibility="Public" />  
      </EnumerationTypes>  
    </EntityTypes>  
  </TypeDefinitions>  
  <Categories>  
    <Category ID="AllProjectorsView.Category" Target="AllProjectorsView" Value="SMConsole!Microsoft.EnterpriseManagement.ServiceManager.UI.Console.ViewTasks" />  
    <Category ID="ProjectorViewHasTasks.CreateTask" Target="AllProjectorsView" Value="Authoring!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.CreateTypeCategory" />  
    <Category ID="Projector.ProjectorConditionCategory" Target="ProjectorCondition" Value="Authoring!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.EnumerationViewTasks" />  
    <Category ID="Project.ProjectorConditionEnumVisibleCategory" Target="ProjectorCondition" Value="System!VisibleToUser" />  
  </Categories>  
  <Presentation>  
    <Forms>  
      <Form ID="TestForm" Accessibility="Public" Target="System.ConfigItem.Projector" Assembly="ProjectorFormsAssembly" TypeName="New_CI_lab.TestControl">  
        <Category>Form</Category>  
      </Form>  
    </Forms>  
    <Views>  
      <View ID="AllProjectorsView" Accessibility="Public" Enabled="true" Target="System.ConfigItem.Projector" TypeID="SMConsole!GridViewType" Visible="true">  
    <Category>NotUsed</Category>  
    <Data>  
    <Adapters>  
    <Adapter AdapterName="dataportal:EnterpriseManagementObjectAdapter">  
    <AdapterAssembly>Microsoft.EnterpriseManagement.UI.SdkDataAccess</AdapterAssembly>  
    <AdapterType>Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.EnterpriseManagementObjectAdapter</AdapterType>  
    </Adapter>  
    <Adapter AdapterName="viewframework://adapters/AdvancedList">  
    <AdapterAssembly>Microsoft.EnterpriseManagement.UI.ViewFramework</AdapterAssembly>  
    <AdapterType>Microsoft.EnterpriseManagement.UI.ViewFramework.AdvancedListSupportAdapter</AdapterType>  
    </Adapter>  
    <Adapter AdapterName="omsdk://Adapters/Criteria">  
    <AdapterAssembly>Microsoft.EnterpriseManagement.UI.SdkDataAccess</AdapterAssembly>  
    <AdapterType>Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.SdkCriteriaAdapter</AdapterType>  
    </Adapter>  
    </Adapters>  
    <ItemsSource>  
    <AdvancedListSupportClass DataTypeName="" AdapterName="viewframework://adapters/AdvancedList" FullUpdateAdapter="dataportal:EnterpriseManagementObjectAdapter" FullUpdateFrequency='1' DataSource="mom:ManagementGroup"   
  IsRecurring="true" RecurrenceFrequency="5000"  Streaming='true' xmlns="clr-namespace:Microsoft.EnterpriseManagement.UI.ViewFramework;assembly=Microsoft.EnterpriseManagement.UI.ViewFramework" xmlns:av="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" >  
    <AdvancedListSupportClass.Parameters>  
                <QueryParameter Parameter="TargetClass" Value="System.ConfigItem.Projector"/>  
    </AdvancedListSupportClass.Parameters>  
    </AdvancedListSupportClass>  
    </ItemsSource>  
    <Criteria />  
    </Data>  
    <Presentation>  
    <Columns>  
<mux:ColumnCollection xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:mux="https://schemas.microsoft.com/SystemCenter/Common/UI/Views/GridView" xmlns:s="clr-namespace:System;assembly=mscorlib">  
              <mux:Column Name="SerialNumber" DisplayMemberBinding="{Binding Path=SerialNumber}" Width="100" DisplayName="SerialNumber" Property="SerialNumber" DataType="s:Int32" />  
              <mux:Column Name="Location" DisplayMemberBinding="{Binding Path=Location}" Width="100" DisplayName="Location" Property="Location" DataType="s:String" />  
              <mux:Column Name="Condition" DisplayMemberBinding="{Binding Path=Condition.DisplayName}" Width="100" DisplayName="Condition" Property="Condition.DisplayName" DataType="s:String" />  
              <mux:Column Name="DisplayName" DisplayMemberBinding="{Binding Path=DisplayName}" Width="100" DisplayName="Display Name" Property="DisplayName" DataType="s:String" />  
              <mux:Column Name="OwnerUser" DisplayMemberBinding="{Binding Path=OwnerUser.DisplayName}" Width="100" DisplayName="SupportOwner" Property="OwnerUser.DisplayName" DataType="s:String" />  
            </mux:ColumnCollection>      
    </Columns>  
    </Presentation>  
    </View>  
    </Views>  
    <Folders>  
      <Folder ID="Folder.Projectors" Accessibility="Public" ParentFolder="SMConfig!ServiceManager.Console.ConfigurationManagement.ConfigItem.Root" />  
    </Folders>  
    <FolderItems>  
      <FolderItem ElementID="AllProjectorsView" ID="FolderItem.AllProjectors" Folder="Folder.Projectors" />  
    </FolderItems>  
    <ImageReferences>  
      <ImageReference ElementID="Folder.Projectors" ImageID="SMConfig!ConfigItemImage16x16" />  
      <ImageReference ElementID="AllProjectorsView" ImageID="SMConfig!ConfigItemImage16x16" />  
    </ImageReferences>  
  </Presentation>  
  <LanguagePacks>  
    <LanguagePack ID="ENU" IsDefault="true">  
      <DisplayStrings>  
    <DisplayString ElementID="System.ConfigItem.Projector">  
    <Name>Projector</Name>  
    </DisplayString>  
        <DisplayString ElementID="Folder.Projectors">  
          <Name>Projectors</Name>  
          <Description>This is the Projector Folder</Description>  
        </DisplayString>  
        <DisplayString ElementID="AllProjectorsView">  
          <Name>All Projectors</Name>  
          <Description>This displays all projectors</Description>  
        </DisplayString>  
        <DisplayString ElementID="ProjectorCondition.Working">  
          <Name>Working</Name>  
        </DisplayString>  
        <DisplayString ElementID="ProjectorCondition.Broken">  
          <Name>Broken</Name>  
        </DisplayString>  
        <DisplayString ElementID="ProjectorCondition.BeingRepaired">  
          <Name>In Repair</Name>  
        </DisplayString>  
        <DisplayString ElementID="ProjectorCondition.New">  
          <Name>New</Name>  
        </DisplayString>  
      </DisplayStrings>  
    </LanguagePack>  
  </LanguagePacks>  
  <Resources>  
    <Assembly ID="ProjectorFormsAssembly" Accessibility="Public" FileName="New_CI_lab.dll" QualifiedName="New_CI_lab, Version=0.0.0.0" />  
  </Resources>  
</ManagementPack>  

Определение формыForm Definition


<UserControl  
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"  
    xmlns:local="clr-namespace:SMFormsDemo"  
    x:Class="SMFormsDemo.TestControl"  
    x:Name="Control"  
    Width="574" Height="390" Opacity="1" xmlns:d="https://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}">  
  <UserControl.Resources>  
    <ObjectDataProvider ObjectType="{x:Type local:helper}"  MethodName="GetStatusValues" x:Key="getStatusValues" />  
  </UserControl.Resources>  
  <Grid x:Name="LayoutRoot">  
    <Label Margin="70,20,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Serial Number:"/>  
    <TextBox Margin="180,20,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=SerialNumber, Mode=TwoWay}"/>  
    <Label Margin="70,60,0,0" HorizontalAlignment="Left"  VerticalAlignment="Top" Width="160" Height="25" Content="Make:"/>  
    <TextBox Margin="180,60,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Make, Mode=TwoWay}" />  
    <Label Margin="70,100,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Model:"/>  
    <TextBox Margin="180,100,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Model, Mode=TwoWay}"/>  
    <Label Margin="70,140,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Location:"/>  
    <TextBox Margin="180,140,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" d:IsStaticText="True" Text="{Binding Path=Location, Mode=TwoWay}" />  
    <Label Margin="70,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" Content="Condition:"/>  
    <ComboBox Margin="180,180,80,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="160" Height="25" ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }" IsSynchronizedWithCurrentItem="True">  
      <ComboBox.SelectedItem>  
        <Binding Path="Condition" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>  
      </ComboBox.SelectedItem>  
      <ComboBox.ItemTemplate>  
        <DataTemplate>  
          <StackPanel>  
            <TextBlock Text="{Binding Path=DisplayName}"/>  
          </StackPanel>  
        </DataTemplate>  
      </ComboBox.ItemTemplate>  
    </ComboBox>  
  </Grid>  
</UserControl>  

-Код формыForm Code-Behind


using System;  
using System.Collections.Generic;  
using System.Collections.ObjectModel;  
using System.Threading;  
using System.Windows.Controls;  
using Microsoft.EnterpriseManagement.ServiceManager.Application.Common;  
using Microsoft.EnterpriseManagement.UI.DataModel;  
namespace SMFormsDemo  
{  
   /// <summary>  
   /// Interaction logic for ProjectorForm.xaml  
   /// </summary>  
   public partial class TestControl : UserControl  
   {  
        public TestControl()  
      {  
         InitializeComponent();  
      }        
   }  
   public class helper  
   {  

      public static ICollection<IDataItem> GetStatusValues()  
      {  
            return ConsoleContextHelper.Instance.GetEnumerations("ProjectorCondition",true);  
      }  
   }  
}  

Дальнейшие действияNext steps