Compartilhar via


Trabalhar com arquivos XML do pacote de gerenciamento do Service Manager

Para personalizações elaboradas de pacotes de gerenciamento, o console do Service Manager e a Ferramenta de Criação do Service Manager podem não ser suficientes e talvez seja necessário criar ou modificar arquivos do pacote de gerenciamento diretamente. Trabalhar diretamente com arquivos de pacote de gerenciamento requer conhecimento profundo em várias áreas, como o Esquema Comum do System Center e a estrutura dos pacotes de gerenciamento.

Esta seção fornece informações básicas e diretrizes que podem ajudá-lo a criar e modificar pacotes de gerenciamento para personalizar Service Manager.

Alterações no esquema comum do System Center

O Service Manager inclui uma versão atualizada do esquema do pacote de gerenciamento do System Center. Esse esquema agora é chamado de Esquema Comum do System Center e inclui várias melhorias e adições destinadas a aprimorar a funcionalidade existente e habilitar os recursos do Service Manager. Este artigo descreve as alterações no Esquema Comum do System Center.

Propriedades e restrições de propriedade

O esquema comum amplia as classes por meio de vários tipos novos de propriedade. Esses tipos de propriedade incluem os tipos binário, enumerador e incremento automático.

Além disso, você pode definir restrições em determinados valores de propriedade. Por exemplo, você pode definir uma restrição de expressão regular no valor de propriedade de uma cadeia de caracteres. No exemplo a seguir, a propriedade BuildingName tem uma restrição de expressão regular que é definida para que apenas um valor que contenha a palavra Building seguida por um espaço e um número seja considerado válido.


<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>  

Imagens

As imagens não são armazenadas em um pacote de gerenciamento. Portanto, a <PresentationTypes> seção do pacote de gerenciamento não contém mais as <Images>marcas , <Image>, or <ImageData> . Em vez disso, use um recurso de imagem.

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

Enumerações

O esquema comum oferece suporte a enumerações. Enumerações são uma árvore de valores que você pode usar para restringir o valor de uma propriedade ou um atributo.

Cada enumeração tem um atributo exclusivo de ID obrigatório e um atributo de Parent opcional.

No exemplo a seguir, a enumeração do XBoxState é definida com três valores possíveis: Em execução, parado e erro.


<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>  

No exemplo a seguir, a classe Xbox define uma propriedade de enum do tipo 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>  

Relações

A funcionalidade de definições de relações foi aprimorada no esquema comum. O tipo RelationshipType tem agora subelementos de Source e Target com propriedades de ID que podem ser usadas como nomes de exibição. Além disso, você pode definir cardinalidade mínima e máxima para a origem e o destino; por exemplo, relações de 1 para 1 ou 0 para muitos.

A cardinalidade não é imposta pelo processo de validação do pacote de gerenciamento, mas destina-se a ajudar a definir interfaces do usuário para o pacote de gerenciamento. Por exemplo, a cardinalidade pode ser verificada para determinar se um campo pode ser representado na forma de um corpo de texto ou uma lista.

Importante

Todos os valores de MaxCardinality definidos como superiores a 1 são processados como ilimitados.

Se você adicionar um novo tipo de relação de seu próprio pacote de gerenciamento, os usuários precisarão de privilégios suficientes para atualizar todas as propriedades das instâncias da classe de origem e de destino do tipo de relação para criar uma instância do novo tipo de relação.

No exemplo a seguir, uma relação de hospedagem chamada HasXboxes entre o tipo Lobby e o tipo Xbox é definida. Nesta definição de relação, cada tipo Lobby pode ter vários tipos Xbox .


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

Classes de combinação

As classes de combinação representam uma agregação de vários tipos relacionados no pacote de gerenciamento, semelhante às exibições definidas em um banco de dados do Microsoft SQL Server, que podem retornar dados de várias tabelas. As classes de combinação armazenam e recuperam todos os dados agregados em uma operação no banco de dados, e podem facilitar a definição de interfaces de usuário de um pacote de gerenciamento.

No exemplo a seguir, uma projeção foi definida para uma exibição do gerenciamento de incidentes. Esta projeção combina vários componentes diferentes relacionados a um incidente em uma única unidade, que pode ser usada com mais facilidade em formulários e operações do banco de dados.


<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>  

Tarefas do console

As tarefas do console foram ampliadas no esquema comum. Anteriormente, as tarefas do console eram simples indicadores de um diretório de aplicativo e um nome de arquivo executável. Agora, as tarefas do console estão implementadas como código de manipulador em um assembly do Microsoft.NET Framework. O código de manipulador referencia o assembly que hospeda o código, o nome do manipulador e uma lista de valores denominados que podem ser transmitidos como argumentos ao manipulador.

No exemplo a seguir, o manipulador Some.Handler.Name está definido no assembly MyLibrary.Resources.Assembly . Uma lista de parâmetros do manipulador e os respectivos valores também estão definidos.

<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>  

Recursos

Os dados binários não são armazenados diretamente em um pacote de gerenciamento. Em vez disso, metadados sobre o recurso binário são armazenados no pacote de gerenciamento e os dados binários reais são armazenados externamente em um arquivo do recurso. Os metadados abrangem um identificador exclusivo, o nome do arquivo, a data de criação, a data de modificação e informações de acessibilidade.

Dados binários podem abranger recursos genéricos, imagens, assemblies, definições de relatório e formulários. O exemplo a seguir mostra um recurso XML genérico, um recurso de assembly e um recurso de relatório.

<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>  

Formulários

Os formulários são definidos em um pacote de gerenciamento. Você pode usar formulários para exibir e modificar uma única instância de um tipo ou classe de combinação.

Os formulários são baseados no Windows Presentation Framework (WPF) e são definidos em assemblies. O assembly e a classe que contêm as implementações do formulário de um pacote de gerenciamento estão incluídos na seção de recursos do pacote de gerenciamento. Assim como acontece com qualquer recurso binário em um pacote de gerenciamento que usa o novo esquema comum, o pacote de gerenciamento em si não contém os dados binários do formulário. Somente o manifesto do recurso é especificado no pacote de gerenciamento.

Você pode especificar suas próprias informações de configuração do formulário no pacote de gerenciamento. No exemplo a seguir, a seção Configurações contém a propriedade ShowXboxes . Essas informações de configuração não são avaliadas pelo processo de verificação do pacote de gerenciamento; ele é interpretado apenas pela implementação do formulário.


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

Criar um arquivo de pacote de gerenciamento para gerenciar projetores

Os pacotes de gerenciamento são usados para direcionar e estender a funcionalidade do Service Manager. Este artigo usa projetores como um exemplo para descrever as várias seções de um pacote de gerenciamento e para definir os vários objetos necessários para gerenciar projetores em uma organização.

Este artigo inclui um exemplo completo de pacote de gerenciamento com as extensões necessárias para gerenciar projetores em uma organização. Além disso, ele descreve como importar um pacote de gerenciamento usando um cmdlet do Windows PowerShell.

Este artigo descreve as seguintes seções de um pacote de gerenciamento:

  • O manifesto

  • TypeDefinitions para criar relações e enumerações de classe

  • Formulários

Este artigo também descreve as seguintes seções de um pacote de gerenciamento que contêm declarações e definições para elementos de interface do usuário e localização:

  • Categorias

  • Apresentação

  • Extensões de classe

Seção de manifesto

A primeira seção de um pacote de gerenciamento contém o manifesto. O manifesto identifica o pacote de gerenciamento e declara todas as referências a outros pacotes de gerenciamento.

O exemplo a seguir mostra a seção Manifest de um pacote de gerenciamento que foi projetado para rastrear projetores em uma organização.


<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>  

Importante

Na seção Referências, não use valores não alfanuméricos, como um '.', no Alias de uma referência.

Criar classes na seção TypeDefinitions

A próxima seção de um pacote de gerenciamento contém definições de tipo. A seção TypeDefinitions de um pacote de gerenciamento contém definições de classes, enumerações e relações que são usadas pelo pacote de gerenciamento.

O exemplo a seguir mostra uma classe que contém informações sobre projetores:


<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>  

Veja a seguir uma explicação seção a seção do que a definição de tipo contém.

A seção ClassTypes

O elemento ClassType define a classe do projetor:

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

O atributo ID é o identificador exclusivo desta classe. Está definido como:

ID="System.ConfigItem.Projector"

O atributo Base é o ID da classe da qual esta classe deriva. Como o projetor é um tipo de item de configuração, isto é definido como:

Base="System!System.ConfigItem"

A notação de System! indica que essa classe, System.ConfigItem, está no pacote de gerenciamento referenciado pelo alias System.

O atributo Hosted define se esta classe é hospedada por outras classes. Neste caso, uma instância desta classe poderá existir apenas quando uma instância do host existir contendo-a. Para este exemplo, os projetores não são hospedados por nada; portanto, o atributo Hosted é definido como false:

Hosted="false"

A configuração do atributo Hosted como true indica que a classe é hospedada por outra classe. Uma relação de hospedagem deve ser declarada na seção RelationshipTypes .

O atributo Accessibility define se outras classes podem derivar desta classe. Para os casos em que desejar permitir que outras pessoas criem uma versão mais específica de sua classe, defina o atributo como public, por exemplo:

Accessibility="Public"

A configuração do atributo Accessibility como Internal impede que outras classes derivem desta classe.

O atributo Abstract define se instâncias desta classe podem ser criadas ou se a classe deve apenas ser usada como classe pai, da qual outras classes serão derivadas. Neste exemplo, este atributo está definido como false. A configuração deste atributo como true significa que nenhuma instância desta classe pode ser criada diretamente e que esta classe pode ser usada apenas como classe pai.

A próxima seção da definição de classe contém as propriedades da classe. O XML que define as propriedades de classe deste exemplo está definido no seguinte exemplo de código:

<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"  />  

Cada elemento de Property tem os seguintes atributos:

  • O atributo ID , que designa o identificador exclusivo da propriedade.

  • O atributo Type , que indica os tipos de dados da propriedade.

  • O atributo Key . A configuração deste atributo como true indica que esta propriedade deve ser usada para identificar exclusivamente esta classe.

Criar tipos de enumeração

Enumerações do tipo de dados enum são tipos de dados especiais. As enumerações são usadas para restringir os dados permitidos para uma propriedade a um conjunto específico de valores. As enumerações podem ser hierárquicas; uma enumeração pode ser baseada em outra.

Elas são definidas na seção EnumertionTypes do pacote de uma solução. Uma definição de enumeração contém a enumeração raiz, seguida por valores reais de enumeração.

Cada EnumerationValue aceita alguns atributos:

Neste exemplo, uma enumeração foi definida para controlar a condição dos projetores. O exemplo a seguir define esta enumeração:

  • ID é o identificador da enumeração ou o valor da enumeração.

  • Accessibility especifica se este enumerador pode conter outros enumeradores.

  • ParentName é um atributo que especifica o ID do pai do valor do enumerador.


<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>  

Criar um formulário

Os formulários do Service Manager são baseados em formulários do Windows Presentation Framework (WPF). Service Manager estende o WPF com atributos simples que são adicionados à definição XML e permitem que Service Manager associe dados do pacote de gerenciamento ao formulário.

Os formulários do Service Manager podem ser criados usando várias ferramentas diferentes, incluindo o Microsoft Visual Studio ou o Microsoft Expression Blend. Como os formulários são baseados em XML, eles também podem ser definidos usando qualquer editor de XML.

O exemplo a seguir mostra uma definição de formulário criada usando o Microsoft Expression Blend. Este formulário contém quatro controles, três caixas de texto e uma caixa de combinação, todos vinculados às propriedades da classe Projetor definidas anteriormente.

<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>  

Para habilitar a vinculação de controles no formulário para as propriedades da classe definidas no pacote de gerenciamento, vários itens devem ser especificados.

Vincular controles de texto

Para associar caixas de texto a propriedades de classe em um pacote de gerenciamento, adicione uma marca Binding Path à propriedade Text do controle de caixa de texto, por exemplo:

{Binding Path=SerialNumber, Mode=TwoWay}  

Esta marca vincula o controle da caixa de texto à propriedade SerialNumber da classe Projetor definida no pacote de gerenciamento e especifica que a vinculação deve ser bidirecional. O valor da propriedade é recuperado do banco de dados e exibido na caixa de texto quando o formulário é carregado, e o valor da propriedade é armazenado de volta no banco de dados se for alterado pelo usuário.

Caixas de combinação de ligação

Para permitir que o formulário recupere dados de enumeração do pacote de gerenciamento subjacente e os vincule a um controle do formulário, uma classe auxiliar deve ser definida no code-behind do formulário. Esta classe auxiliar deve conter um método que retorne uma enumeração definida no pacote de gerenciamento. Para retornar uma enumeração, use o método GetEnumerations do pacote de gerenciamento atual. Essa instância é acessada com a classe ConsoleContextHelper do SDK (kit de desenvolvimento de software) do Service Manager. No exemplo a seguir, uma classe auxiliar define o método GetStatusValues , que recupera os valores da enumeração de ProjectorCondition definida no pacote de gerenciamento:


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

Para acessar este método, algumas coisas devem ser configuradas na definição do formulário do pacote de gerenciamento.

Primeiro, um namespace que indique o namespace do code behind do formulário é adicionado à definição do formulário. Neste exemplo, o namespace é SMFormsDemo:

xmlns:local="clr-namespace:SMFormsDemo"  

Em seguida, um ObjectDataProvider deve ser definido para fornecer os valores à caixa de combinação que exibe o status do projetor. Este ObjectDataProvider está definido como um recurso:


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

Este provedor de dados especifica o objeto e o nome do método que recupera os valores de enumeração do pacote de gerenciamento.

Por último, para vincular a caixa de combinação aos valores de enumeração definidos no pacote de gerenciamento, o atributo ItemsSource é adicionado à definição da caixa de combinação. Este atributo especifica onde recuperar os valores de enumeração, por exemplo:

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

Depois, os elementos SelectedItem e ItemTemplate são adicionados à definição de XAML (Extensible Application Markup Language) do controle da caixa de combinação. O exemplo a seguir mostra a definição da caixa de combinação com a vinculação XAML inclusa:


<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>  

A seção Categoria

A seção Category de um pacote de gerenciamento agrupa elementos do pacote de gerenciamento para uma navegação mais simples.

Os dois <Category> primeiros elementos no exemplo são usados para controlar a exibição das tarefas Novo e Editar na visualização Projetores.

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

Os dois segundos elementos Category no pacote de gerenciamento de exemplo são usados para fazer com que a enumeração de condição do projetor apareça no modo de exibição Listas no painel Criação no console do Service Manager. Isso permite que o usuário personalize os valores:

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

A adição desta categoria no exemplo a seguir faz com que a tarefa Editar apareça na exibição Listas para o EnumerationValue indicado no atributo Target :

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

A seção Apresentação

A seção Presentation de um pacote de gerenciamento declara e define os elementos relacionados à interface de usuário. Isso abrange declarações de formulários, categorias e tarefas do console.

A seção de formulários

A seção Forms declara os formulários usados por seu pacote de gerenciamento. O exemplo a seguir especifica onde localizar o formulário que foi definido para exibir e editar instâncias da classe Projetor . Isso vincula o formulário à classe Projetor definida no pacote de gerenciamento:


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

Os seguintes atributos foram usados no exemplo anterior:

  • O atributo TypeName contém o namespace e o nome da classe do formulário.

  • O atributo ID contém o identificador exclusivo desta instância do formulário.

  • O atributo Target contém o nome da classe à qual este formulário está vinculado.

  • O atributo Assembly indica o recurso externo que contém o formulário.

  • O atributo Accessibility define se este formulário pode ser personalizado.

Definir uma vista

A seção Views de um pacote de gerenciamento contém definições de exibições da interface de usuário. Estas exibições podem ser usadas para filtrar e exibir objetos de um pacote de gerenciamento.

<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>  

O atributo Destino de Exibição indica a classe em que a exibição será usada para exibir.

No exemplo anterior, o pacote de gerenciamento do console do Service Manager foi referenciado. Este pacote de gerenciamento contém uma definição do tipo de exibição que está sendo usado. Neste caso, o tipo de exibição SMConsole!GridViewType está definido.

O AdvancedListSupportClass define vários parâmetros, sendo que o mais importante deles é o parâmetro TargetClass . Defina este parâmetro como o ID do ClassType que aparecerá nesta exibição. Para exibir as colunas que são propriedades do ClassType, use o elemento Column e vincule-o ao atributo PropertyID .

O atributo IsRecurring do elemento ListSupportClass determina se a visão é atualizada automaticamente. O atributo RecurrenceFrequency define o intervalo de atualização em milissegundos. Neste exemplo, o intervalo de atualização é definido como 1 segundo, mas isso não é recomendado para instalações de produção.

Definir pastas

A definição de uma pasta determina o local na árvore de navegação no qual aparece a exibição. Neste exemplo, um item de configuração é definido para que seja adequado apenas colocar a exibição na pasta existente para itens de configuração no espaço de trabalho Itens de Configuração:

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

No exemplo anterior, o atributo ElementID contém uma referência à exibição que foi criada. O atributo Folder aponta para uma pasta Folders.Projectors , que, por sua vez, tem sua raiz conforme definido no espaço de trabalho Gerenciamento de Configuração do console Service Manager. Esta pasta raiz está definida no pacote de gerenciamento do gerenciamento de configuração.

O elemento ImageReference associa a exibição criada anteriormente a um ícone definido no namespace do Configuration Management :

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

Localização usando a seção LanguagePacks

A seção LanaguagePacks de um pacote de gerenciamento define os recursos da cadeia de caracteres e as associações dos elementos do pacote de gerenciamento.

No exemplo, o EnumerationValueProjectorCondition.Working deve aparecer como Working. Para isso, devem ser definidos nomes de exibição para cada uma das seguintes opções:

  • Exibição: todos os projetores

  • Enumerações: processando, quebrado, em reparo, novo

  <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>  

Você poderá criar elementos de LanguagePack adicionais conforme necessário para cada idioma adicional que precisar. A cadeia de caracteres de exibição correta aparece para o usuário com base na localidade do usuário.

Recursos

A seção Resources de um pacote de gerenciamento contém referências a recursos binários, que estão contidos em assemblies separados do pacote de gerenciamento. No exemplo a seguir, um recurso está definido para indicar o assembly que contém o formulário usado pela classe Projetor :

<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" />  

Extensões de classes

Uma extensão de classe é uma classe que adiciona propriedades a uma classe existente. Na maioria dos casos, essa classe existente está em um pacote de gerenciamento sem lacre. Nos casos em que a classe existente não está em um pacote de gerenciamento lacrado, a extensão de classe deve estar contida no mesmo pacote de gerenciamento que a classe que está sendo estendida.

Uma extensão da classe herda as propriedades de todas as classes pai, por exemplo:

  • A classe A tem uma propriedade chamada Property1

  • A Classe B é derivada da Classe A, ou estende a Classe A, e, portanto, tem uma propriedade chamada Property1. Essa propriedade é herdada da Classe A, do pai ou da classe base

  • A definição de Classe B adiciona uma propriedade chamada Property2.

  • Qualquer extensão de classe derivada da Classe B herdará Property1 e Property2.

    O exemplo a seguir mostra uma definição de extensão de classe:


<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>  

Essa extensão de classe estende a classe System.WorkItem.Incident e adiciona uma nova propriedade chamada TimeOnIncident.

A definição de uma extensão de classe é semelhante a de uma definição de classe. Dois atributos do elemento ClassType são usados para definir uma definição de classe: os atributos Base e IsExtensionType .

O atributo Base especifica a ID da classe pai da qual a extensão de classe é derivada. Nesse caso, o valor do atributo é definido como Incident!System.WorkItem.Incident. Esse valor contém o Alias do nome completo do pacote de gerenciamento, que contém a classe que está sendo estendida, um ponto de exclamação e o nome da classe base. Para obter mais informações, consulte o exemplo a seguir.

O atributo IsExtensionType define se essa classe é uma extensão da classe base. Como TimeOnIncident é uma extensão para a classe Incidente , essa propriedade é definida como true:

IsExtensionType="true"  

A outra opção é false, o que indica que não é uma extensão de outra classe, mas uma nova classe que herda da base. O valor padrão é false; portanto, esse atributo não precisa ser usado se a classe não for uma extensão.

Exemplo completo

O exemplo de código a seguir mostra o pacote de gerenciamento completo que contém a extensão de classe.

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>  

Importar um pacote de gerenciamento usando um cmdlet

Você pode usar o cmdlet Import-SCSMManagementPack do Windows PowerShell para importar um pacote de gerenciamento do Service Manager, por exemplo:

Import-SCSMManagementPack MyServiceManager.ManagementPack.xml  

Este documento não descreve como importar e usar pacotes de gerenciamento no console do Service Manager. Para obter informações sobre como usar pacotes de gerenciamento no console do Service Manager, consulte Usando pacotes de gerenciamento no Service Manager.

Exemplo de pacote de gerenciamento completo

Os exemplos de código a seguir representam o pacote de gerenciamento de exemplo completo usado para exemplos neste artigo, além da definição do formulário e do code-behind C# para o formulário.

Pacote de gerenciamento

<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>  

Definição de formulário


<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>  

Formulário 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);  
      }  
   }  
}  

Próximas etapas