Delen via


Werken met Service Manager XML-bestanden van het management pack

Belangrijk

Deze versie van Service Manager heeft het einde van de ondersteuning bereikt. U wordt aangeraden een upgrade uit te voeren naar Service Manager 2022.

Voor uitgebreide aanpassingen van management packs zijn de Service Manager-console en het Service Manager-bewerkingsprogramma mogelijk niet voldoende. Mogelijk moet u management pack-bestanden rechtstreeks ontwerpen of wijzigen. Het rechtstreeks werken met management pack-bestanden vereist diepgaande kennis op verschillende gebieden, zoals het algemene System Center-schema en de structuur van management packs.

Deze sectie bevat achtergrondinformatie en richtlijnen die u kunnen helpen bij het ontwerpen en wijzigen van management packs om Service Manager aan te passen.

Wijzigingen in het algemene schema van System Center

Service Manager bevat een bijgewerkte versie van het System Center Management Pack-schema. Dit schema wordt nu het System Center Common Schema genoemd en bevat een aantal verbeteringen en toevoegingen die bedoeld zijn om de bestaande functionaliteit te verbeteren en Service Manager functies in te schakelen. In dit artikel worden de wijzigingen in het algemene schema van System Center beschreven.

Eigenschappen en eigenschapsbeperkingen

In het algemene schema worden klassen uitgebreid met verschillende nieuwe eigenschaptypen. Deze eigenschapstypen omvatten de typen binair, enumerator en automatisch verhogen.

U kunt bovendien beperkingen op bepaalde eigenschapswaarden definiëren. U kunt bijvoorbeeld een restrictie in de vorm van een reguliere expressie definiëren op de eigenschapswaarde van een tekenreeks. In het volgende voorbeeld heeft de eigenschap BuildingName een reguliere expressiebeperking die is gedefinieerd, zodat alleen een waarde met het woord Gebouw gevolgd door een spatie en een getal als geldig wordt beschouwd.


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

Installatiekopieën

Afbeeldingen worden niet opgeslagen in een management pack. De sectie <PresentationTypes> van het management pack bevat daarom niet meer de tags <Images>, <Image> en <ImageData>. Gebruik in plaats daarvan een afbeeldingsbron.

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

Opsommingen

Het algemene schema ondersteunt opsommingen. Opsommingen zijn een structuur van waarden waarmee u de waarde van een eigenschap of kenmerk kunt beperken.

Elke opsomming heeft een vereist uniek id-kenmerk en een optioneel bovenliggend kenmerk.

In het volgende voorbeeld wordt de opsomming XBoxState gedefinieerd met drie mogelijke waarden: Actief, Gestopt en Fout.


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

In het volgende voorbeeld definieert de Xbox-klasse een enum-eigenschap van het 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>  

Relaties

De functionaliteit van relatiedefinities is uitgebreid in het algemene schema. Het type RelationshipType heeft nu bron - en doelsubelementen met id-eigenschappen die als weergavenamen kunnen worden gebruikt. Daarnaast kunt u minimale en maximale kardinaliteit definiëren voor zowel de bron als het doel; bijvoorbeeld 1-op-1- of 0-op-veel-relaties.

Kardinaliteit wordt niet afgedwongen door het validatieproces van het management pack, maar is bedoeld om gebruikersinterfaces voor het management pack te definiëren. De cardinaliteit kan bijvoorbeeld worden gecontroleerd om te bepalen of een veld in een formulier kan worden vertegenwoordigd door een tekstvak of door een lijst.

Belangrijk

Elke MaxCardinality-waarde die is gedefinieerd als groter dan 1, wordt verwerkt als onbeperkt.

Als u een nieuw relatietype toevoegt uit uw eigen management pack, moeten gebruikers voldoende machtigingen hebben om alle eigenschappen van de bron- en doelklassenexemplaren van het relatietype bij te werken, zodat ze een exemplaar van het nieuwe relatietype kunnen maken.

In het volgende voorbeeld wordt een hostingrelatie met de naam HasXboxes tussen het type Lobby en het Type Xbox gedefinieerd. In deze relatiedefinitie kan elk lobbytype meerdere Xbox-typen hebben.


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

Combinatieklassen

Combinatieklassen vertegenwoordigen een aggregatie van meerdere gerelateerde typen in het management pack, vergelijkbaar met weergaven die zijn gedefinieerd in een Microsoft SQL Server-database die gegevens uit meerdere tabellen kan retourneren. In combinatieklassen worden alle geaggregeerde gegevens in één bewerking naar de database opgeslagen en opgehaald, en met combinatieklassen kan het definiëren van gebruikersinterfaces voor een management pack eenvoudiger worden.

In het volgende voorbeeld wordt een projectie gedefinieerd voor een incidentenbeheerweergave. In deze projectie worden verschillende onderdelen die betrekking hebben op een incident, gecombineerd in één eenheid die eenvoudiger kan worden gebruikt voor formulieren en databasebewerkingen.


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

Consoletaken

Consoletaken zijn uitgebreid in het algemene schema. Eerder waren consoletaken eenvoudige aanwijzers naar een toepassingsmap en de naam van een uitvoerbaar bestand. Consoletaken worden nu geïmplementeerd als handlercode in een Microsoft .NET Framework assembly. In de handlercode wordt verwezen naar de assembly waarin de code is opgenomen, de naam van de handler en een lijst met alle naamwaarden die als argumenten kunnen worden doorgegeven aan de handler.

In het volgende voorbeeld wordt de handler Some.Handler.Name gedefinieerd in de assembly MyLibrary.Resources.Assembly . Er wordt ook een lijst met handlerparameters en hun waarden gedefinieerd.

<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

Binaire gegevens worden niet rechtstreeks in een management pack opgeslagen. In plaats daarvan worden metagegevens over de binaire bron opgeslagen in het management pack, en worden de daadwerkelijke binaire gegevens extern in een bronbestand opgeslagen. De metagegevens bestaan uit een unieke id, de bestandsnaam, de datum waarop de bron is gemaakt, de datum waarop de bron is gewijzigd en toegankelijkheidsinformatie.

Binaire gegevens kunnen algemene bronnen, afbeeldingen, assembly's, rapportdefinities en formulieren zijn. In het volgende voorbeeld ziet u een algemene XML-bron, een assemblybron en een rapportbron.


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

Formulieren

Formulieren worden gedefinieerd in een management pack. U kunt formulieren gebruiken om één exemplaar van een type of combinatieklasse weer te geven en te wijzigen.

Formulieren zijn gebaseerd op het Windows Presentation Framework (WPF) en worden gedefinieerd in assembly's. De assembly en klasse die de formulierimplementaties voor een management pack bevatten, worden opgenomen in de bronnensectie van het management pack. Net als bij elke binaire resource in een management pack die gebruikmaakt van het nieuwe algemene schema, bevat het management pack zelf niet de binaire gegevens voor het formulier. Alleen het bronmanifest is opgegeven in het management pack.

U kunt uw eigen configuratie-informatie voor het formulier in het management pack opgeven. In het volgende voorbeeld bevat de sectie Configuratie de eigenschap ShowXboxes . Deze configuratiegegevens worden niet geëvalueerd door het verificatieproces van het management pack. het wordt alleen geïnterpreteerd door de formulier-implementatie.


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

Een management pack-bestand maken voor het beheren van projectors

Management packs worden gebruikt om de functionaliteit van Service Manager te sturen en uit te breiden. In dit artikel worden projectors gebruikt als voorbeeld voor het beschrijven van de verschillende secties van een management pack en voor het definiëren van de verschillende objecten die nodig zijn voor het beheren van projectors in een organisatie.

Dit artikel bevat een volledig management pack-voorbeeld met de benodigde extensies voor het beheren van projectors in een organisatie. Ook wordt beschreven hoe u een management pack importeert met behulp van een Windows PowerShell cmdlet.

In dit artikel worden de volgende secties van een management pack beschreven:

  • Het manifest

  • TypeDefinitions om klasseopsommingen en -relaties te maken

  • Formulieren

In dit artikel worden ook de volgende secties van een management pack beschreven die declaraties en definities voor de gebruikersinterface (UI) en lokalisatie-elementen bevatten:

  • Categorieën

  • Stijl

  • Klasse-extensies

Sectie Manifest

De eerste sectie van een management pack bevat het manifest. Het manifest identificeert het management pack en geeft eventuele verwijzingen naar andere management packs aan.

In het volgende voorbeeld ziet u de sectie Manifest van een management pack dat is ontworpen om projectors in een organisatie bij te houden.


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

Belangrijk

Gebruik in de sectie Verwijzingen geen niet-alfaumerische waarden, zoals een '.', in de alias voor een verwijzing.

Klassen maken in de sectie TypeDefinitions

De volgende sectie van een management pack bevat typedefinities. De sectie TypeDefinitions van een management pack bevat definities voor klassen, opsommingen en relaties die door het management pack worden gebruikt.

In het volgende voorbeeld wordt een klasse weergegeven die informatie over projectors bevat:


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

Hier volgt een uitleg per sectie over wat de typedefinitie bevat.

De sectie ClassTypes

Het element ClassType definieert de projectorklasse:

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

Het id-kenmerk is de unieke id van deze klasse. Dit is ingesteld op:

ID="System.ConfigItem.Projector"

Het kenmerk Base is de id van de klasse waaruit deze klasse is afgeleid. Omdat een projector een soort configuratie-item is, is deze id ingesteld op:

Base="System!System.ConfigItem"

De notatie van System! geeft aan dat deze klasse, System.ConfigItem, zich in het management pack bevindt waarnaar wordt verwezen door de alias System.

Het kenmerk Gehost definieert of deze klasse wordt gehost door een andere klasse. In dit geval kan alleen een instantie van deze klasse bestaan wanneer er een host is die deze klasse bevat. In dit voorbeeld worden projectors nergens gehost. Daarom is het kenmerk Gehost ingesteld op false:

Hosted="false"

Als u het kenmerk Hosted instelt op true , geeft u aan dat de klasse wordt gehost door een andere klasse. Een hostingrelatie moet worden gedeclareerd in de sectie RelationshipTypes .

Het kenmerk Toegankelijkheid bepaalt of andere klassen kunnen worden afgeleid van deze klasse. In gevallen waarin u anderen mogelijk wilt toestaan een specifiekere versie van uw klasse te maken, stelt u dit kenmerk in op openbaar, bijvoorbeeld:

Accessibility="Public"

Als u het kenmerk Toegankelijkheid instelt op Intern , voorkomt u dat andere klassen afkomstig zijn van deze klasse.

Het kenmerk Abstract definieert of exemplaren van deze klasse kunnen worden gemaakt of dat de klasse alleen moet worden gebruikt als een bovenliggende klasse voor andere klassen waaruit kan worden afgeleid. In dit voorbeeld is dit kenmerk ingesteld op false. Als u dit kenmerk instelt op true , betekent dit dat er geen exemplaren van deze klasse rechtstreeks kunnen worden gemaakt en dat deze klasse alleen als een bovenliggende klasse kan worden gebruikt.

De volgende sectie van de klassedefinitie bevat de klasse-eigenschappen. De XML waarmee de klasse-eigenschappen voor dit voorbeeld worden gedefinieerd, worden in het volgende codevoorbeeld gedefinieerd:


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

Elk eigenschapselement heeft de volgende kenmerken:

  • Het id-kenmerk, waarmee de unieke id van de eigenschap wordt opgegeven.

  • Het kenmerk Type , waarmee het gegevenstype van de eigenschap wordt aangegeven.

  • Het kenmerk Sleutel . Als u dit kenmerk instelt op true , geeft u aan dat deze eigenschap moet worden gebruikt om deze klasse uniek te identificeren.

Opsommingstypen maken

Opsommingen van het gegevenstype enum zijn speciale gegevenstypen. Opsommingen worden gebruikt om de toegestane gegevens voor een eigenschap te beperken tot een bepaalde verzameling waarden. Opsommingen kunnen hiërarchisch zijn. Eén opsomming kan zijn gebaseerd op een andere opsomming.

Opsommingen worden gedefinieerd in de sectie EnumertionTypes van een oplossingspakket. Een opsommingsdefinitie bevat de hoofdopsomming gevolgd door de werkelijke opsommingswaarden.

Elke EnumerationValue accepteert een aantal kenmerken:

In dit voorbeeld wordt een opsomming gedefinieerd om de staat van de projectors bij te houden. Deze opsomming wordt als volgt gedefinieerd:

  • Id is de id voor de opsomming of opsommingswaarde.

  • Toegankelijkheid geeft aan of deze enumerator andere opsommingen kan bevatten.

  • ParentName is een kenmerk dat de id van het bovenliggende element van de enumeratorwaarde aangeeft.


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

Een formulier maken

Service Manager formulieren zijn gebaseerd op WPF-formulieren (Windows Presentation Framework). Service Manager breidt WPF uit met eenvoudige kenmerken die worden toegevoegd aan de XML-definitie en waarmee Service Manager gegevens van het management pack aan het formulier kunt koppelen.

Service Manager formulieren kunnen worden gemaakt met behulp van verschillende hulpprogramma's, waaronder Microsoft Visual Studio of Microsoft Expression Blend. Omdat de formulieren op XML zijn gebaseerd, kunnen ze ook worden gedefinieerd met behulp van een XML-editor.

In het volgende voorbeeld wordt een formulierdefinitie weergegeven die is gemaakt met Microsoft Expression Blend. Dit formulier bevat vier besturingselementen, drie tekstvakken en één keuzelijst met invoervak, die afhankelijk zijn van de eigenschappen van de klasse Projector die eerder zijn gedefinieerd:


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

U moet een aantal items opgeven om besturingselementen in het formulier te binden aan klasse-eigenschappen die zijn gedefinieerd in een management pack.

Bindingstekstbesturingselementen

Als u tekstvakken wilt binden aan klasse-eigenschappen in een management pack, voegt u de tag Binding path toe aan de eigenschap Text van het tekstvakbesturingselement, bijvoorbeeld:

{Binding Path=SerialNumber, Mode=TwoWay}  

Met deze tag wordt het tekstvakbesturingselement gebonden aan de eigenschap SerialNumber van de klasse Projector die in het management pack is gedefinieerd. Hiermee wordt aangegeven dat dit een tweerichtingsbinding moet zijn. De waarde van de eigenschap wordt opgehaald uit de database en weergegeven in het tekstvak wanneer het formulier wordt geladen en de eigenschapswaarde wordt weer opgeslagen in de database als deze door de gebruiker wordt gewijzigd.

Keuzelijsten met invoervak binden

Als u wilt dat het formulier opsommingsgegevens ophaalt uit het onderliggende management pack en deze koppelt aan een besturingselement op het formulier, moet een helperklasse worden gedefinieerd in de code-behind in het formulier. Deze helperklasse moet een methode bevatten waarmee een opsomming wordt geretourneerd die is gedefinieerd in het management pack. Als u een opsomming wilt retourneren, gebruikt u de methode GetEnumerations van het huidige management pack. Dit exemplaar wordt geopend met de klasse ConsoleContextHelper vanuit de Service Manager Software Development Kit (SDK). In het volgende voorbeeld definieert een helperklasse een methode GetStatusValues waarmee de waarden worden opgehaald voor de opsomming ProjectorCondition die is gedefinieerd in het management pack:


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

Als u deze methode wilt gebruiken, moet u een aantal items definiëren in de formulierdefinitie in het management pack.

Eerst wordt een naamruimte die verwijst naar de naamruimte voor de code erachter voor het formulier toegevoegd aan de formulierdefinitie. In dit voorbeeld is de naamruimte SMFormsDemo:

xmlns:local="clr-namespace:SMFormsDemo"  

Vervolgens moet een ObjectDataProvider worden gedefinieerd om de waarden op te geven voor de keuzelijst met invoervak die de status van de projector weergeeft. Deze ObjectDataProvider is gedefinieerd als een resource:


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

Deze gegevensprovider geeft het object en de naam van de methode op waarmee de opsommingswaarden worden opgehaald uit het management pack.

Als u ten slotte de keuzelijst met invoervak wilt binden aan de opsommingswaarden die in het management pack zijn gedefinieerd, wordt het kenmerk ItemsSource toegevoegd aan de definitie van de keuzelijst met invoervak. Met dit kenmerk wordt opgegeven waar de opsommingswaarden moeten worden opgehaald, bijvoorbeeld:

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

Vervolgens worden de elementen SelectedItem en ItemTemplate toegevoegd aan de XAML-definitie (Extensible Application Markup Language) van het besturingselement keuzelijst met invoervak. In het volgende voorbeeld wordt de definitie van het keuzelijst met de binding-XAML weergegeven:


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

De sectie Categorie

In de sectie Categorie van een management pack worden management pack-elementen gegroepeerd voor eenvoudigere navigatie.

De eerste twee <Category> elementen in het voorbeeld worden gebruikt om de weergave van de taken Nieuw en Bewerken in de weergave Projectoren te bepalen.

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

De tweede twee Categorie-elementen in het voorbeeld-management pack worden gebruikt om de opsomming van de projectorvoorwaarde weer te geven in de weergave Lijsten in het deelvenster Ontwerpen in de Service Manager-console. Dit stelt de gebruiker in staat de waarden aan te passen:

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

Als u deze categorie toevoegt in het volgende voorbeeld, wordt de taak Bewerken weergegeven in de weergave Lijsten voor de EnumerationValue waarnaar wordt verwezen in het kenmerk Target:

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

De sectie Presentatie

De sectie Presentatie van een management pack declareert en definieert elementen met betrekking tot de gebruikersinterface. Hierbij gaat het om formulierdeclaraties, categorieën en consoletaken.

De sectie Formulieren

De sectie Formulieren declareert formulieren die worden gebruikt door uw management pack. In het volgende voorbeeld wordt aangegeven waar het formulier moet worden gevonden dat is gedefinieerd voor het weergeven en bewerken van exemplaren van de klasse Projector . Hiermee wordt het formulier gebonden aan de klasse Projector die is gedefinieerd in het management pack:


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

De volgende kenmerken worden gebruikt in het vorige voorbeeld:

  • Het kenmerk TypeName bevat de naamruimte en klassenaam van het formulier.

  • Het id-kenmerk bevat de unieke id van dit formulierexemplaar.

  • Het kenmerk Doel bevat de naam van de klasse waaraan dit formulier is gebonden.

  • Het kenmerk Assembly verwijst naar de externe resource die het formulier bevat.

  • Het kenmerk Toegankelijkheid bepaalt of dit formulier kan worden aangepast.

Een weergave definiëren

De sectie Weergaven van een management pack bevat definities van gebruikersinterfaceweergaven. Deze weergaven kunnen worden gebruikt om objecten in een management pack te filteren en weer te geven.

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

Het kenmerk View Target verwijst naar de klasse die door de weergave wordt gebruikt.

In het vorige voorbeeld wordt verwezen naar het management pack Service Manager-console. Dit management pack bevat een definitie van een weergavetype dat wordt gebruikt. In dit geval de SMConsole! Het weergavetype GridViewType is gedefinieerd.

De AdvancedListSupportClass definieert een aantal parameters, waarvan de belangrijkste de parameter TargetClass is. Stel deze parameter in op de id van het ClassType dat in deze weergave wordt weergegeven. Als u de kolommen wilt weergeven die eigenschappen van het ClassType zijn, gebruikt u het element Column en verbindt u dit met het kenmerk PropertyID .

Het kenmerk IsRecurring van het element ListSupportClass bepaalt of de weergave automatisch wordt vernieuwd. Het kenmerk RecurrenceFrequency definieert het vernieuwingsinterval in milliseconden. In dit voorbeeld is het vernieuwingsinterval ingesteld op 1 seconde, maar dat wordt niet aanbevolen voor productie-installaties.

Mappen definiëren

Door een map te definiëren, bepaalt u op welke locatie in de navigatiestructuur de weergave wordt weergegeven. In dit voorbeeld is een configuratie-item zo gedefinieerd dat het alleen geschikt is om de weergave onder de bestaande map voor configuratie-items in de werkruimte Configuratie-items te plaatsen:

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

In het voorgaande voorbeeld bevat het kenmerk ElementID een verwijzing naar de weergave die is gemaakt. Het kenmerk Map verwijst naar een map Folders.Projectors, die op zijn beurt de hoofdmap heeft, zoals gedefinieerd in de werkruimte Configuratiebeheer van de Service Manager-console. Deze hoofdmap is gedefinieerd in het management pack Configuratiebeheer.

Het element ImageReference wijst de eerder gemaakte weergave toe aan een pictogram dat is gedefinieerd in de naamruimte Configuration Management :

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

Lokalisatie met behulp van de sectie LanguagePacks

De sectie LanaguagePacks van een management pack definieert tekenreeksresources en toewijzingen voor management pack-elementen.

In het voorbeeld moet EnumerationValueProjectorCondition.Working worden weergegeven als Werken. Hiervoor moeten weergavenamen voor elk van de volgende items worden gedefinieerd:

  • Weergave: Alle projectors

  • Opsommingen: werkend, defect, in reparatie, nieuw

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

U kunt zo nodig extra LanguagePack-elementen maken voor elke extra taal die u nodig hebt. De juiste weergavetekenreeks wordt weergegeven voor de gebruiker op basis van de landinstelling van de gebruiker.

Bronnen

De sectie Resources van een management pack bevat verwijzingen naar binaire resources, die zijn opgenomen in assembly's die los staan van het management pack. In het volgende voorbeeld wordt een resource gedefinieerd die verwijst naar de assembly die het formulier bevat dat wordt gebruikt door de klasse Projector :

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

Klasse-extensies

Een klasse-extensie is een klasse die eigenschappen toevoegt aan een bestaande klasse. In de meeste gevallen bevindt deze bestaande klasse zich in een verzegeld management pack. In gevallen waarin de bestaande klasse zich niet in een verzegeld management pack bevindt, moet de klasse-extensie zijn opgenomen in hetzelfde management pack als de klasse die wordt uitgebreid.

Een klasse-extensie neemt de eigenschappen over van bovenliggende klassen, zoals:

  • Klasse A bevat een eigenschap met de naam Eigenschap1

  • Klasse B is afgeleid van of is een extensie van Klasse A en bevat daarom Eigenschap 1. Deze eigenschap wordt overgenomen van klasse A, de bovenliggende of basisklasse)

  • De definitie van Klasse B voegt een eigenschap toe met de naam Eigenschap 2.

  • Elke klasse-extensie die is afgeleid van Klasse B neemt Eigenschap 1 en Eigenschap 2 over.

    Het volgende voorbeeld toont de definitie van een klasse-extensie:


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

Deze klasse-extensie breidt de klasse System.WorkItem.Incident uit en voegt een nieuwe eigenschap toe met de naam TimeOnIncident.

De definitie van een klasse-extensie is vergelijkbaar met die van een klassedefinitie. Er worden twee kenmerken van het element ClassType gebruikt om een klassedefinitie te definiëren: het kenmerk Base en het kenmerk IsExtensionType .

Het kenmerk Base geeft de id op van de bovenliggende klasse waaruit de klasse-extensie is afgeleid. In dit geval wordt de kenmerkwaarde ingesteld op Incident! System.WorkItem.Incident. Deze waarde bevat de alias van de volledige naam van het management pack, die de klasse bevat die wordt uitgebreid, een uitroepteken en vervolgens de naam van de basisklasse. Zie het volgende voorbeeld voor meer informatie

Het kenmerk IsExtensionType bepaalt of deze klasse een uitbreiding is van de basisklasse. Omdat TimeOnIncident een extensie is voor de klasse Incident , is deze eigenschap ingesteld op true:

IsExtensionType="true"  

De andere optie is false, wat aangeeft dat het geen uitbreiding van een andere klasse is, maar een nieuwe klasse die van de basis wordt overgenomen. De standaardwaarde is false; Daarom hoeft dit kenmerk niet te worden gebruikt als de klasse geen extensie is.

Compleet voorbeeld

Het volgende codevoorbeeld toont het complete management pack met de klasse-extensie.

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>  

Een management pack importeren met behulp van een cmdlet

U kunt de cmdlet Windows PowerShell Import-SCSMManagementPack gebruiken om een Service Manager management pack te importeren, bijvoorbeeld:

Import-SCSMManagementPack MyServiceManager.ManagementPack.xml  

In dit document wordt niet beschreven hoe u management packs in de Service Manager-console importeert en gebruikt. Zie Management packs gebruiken in Service Manager voor meer informatie over het gebruik van management packs in de Service Manager-console.

Voorbeeld van volledig management pack

De volgende codevoorbeelden vertegenwoordigen het volledige voorbeeld management pack dat wordt gebruikt voor voorbeelden in dit artikel, naast de formulierdefinitie en de C#-code achter het formulier.

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>  

Formulierdefinitie


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

Formulier 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);  
      }  
   }  
}  

Volgende stappen