Freigeben über


Arbeiten mit Service Manager Management Pack-XML-Dateien

Wichtig

Diese Version von Service Manager hat das Ende des Supports erreicht. Es wird empfohlen, ein Upgrade auf Service Manager 2022 durchzuführen.

Für aufwendige Anpassungen von Management Packs reichen die Service Manager-Konsole und das Service Manager Erstellungstool möglicherweise nicht aus, und Sie müssen Management Pack-Dateien möglicherweise direkt erstellen oder ändern. Das direkte Arbeiten mit Management Pack-Dateien erfordert fundierte Kenntnisse in verschiedenen Bereichen, z. B. dem Allgemeinen System Center-Schema und der Struktur von Management Packs.

Dieser Abschnitt enthält Hintergrundinformationen und Richtlinien, mit denen Sie Management Packs erstellen und ändern können, um Service Manager anzupassen.

Änderungen am System Center Common Schema

Service Manager enthält eine aktualisierte Version des System Center Management Pack-Schemas. Dieses Schema wird jetzt als Allgemeines System Center-Schema bezeichnet, und es enthält eine Reihe von Verbesserungen und Ergänzungen, die die vorhandene Funktionalität verbessern und Service Manager Features aktivieren sollen. In diesem Artikel werden die Änderungen am Allgemeinen System Center-Schema beschrieben.

Eigenschaften- und Eigenschaftseinschränkungen

Bei dem Common Schema werden Klassen durch mehrere neue Eigenschaftentypen erweitert. Zu diesen Eigenschaftstypen gehören die Binär-, Enumerator- und Auto-Inkrement-Typen.

Darüber hinaus können Sie für bestimmte Eigenschaftswerte, z. B. für reguläre Ausdrücke oder Zeichenfolgenwerte, Einschränkungen definieren. Im folgenden Beispiel weist die BuildingName-Eigenschaft eine Einschränkung für reguläre Ausdrücke auf, die so definiert ist, dass nur ein Wert, der das Wort Building enthält, gefolgt von einem Leerzeichen und einer Zahl als gültig betrachtet wird.


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

Bilder

Bilder werden nicht in einem Management Pack gespeichert. Der Abschnitt <PresentationTypes> im Management Pack enthält daher nicht mehr die Markierungen <Images><Image> bzw. <ImageData>. Verwenden Sie stattdessen eine Abbildressource.

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

Enumerationen

Das Common Schema unterstützt Aufzählungen. Aufzählungen sind Baumstrukturen mit Werten, die zur Einschränkung des Werts einer Eigenschaft oder eines Attributs verwendet werden können.

Jede Aufzählung besitzt ein erforderliches eindeutiges ID -Attribut und optional ein Parent -Attribut.

Im folgenden Beispiel wird die Aufzählung XBoxState mit drei möglichen Werten definiert: Wird ausgeführt, Beendet und Fehler.


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

Im folgenden Beispiel wird über die Klasse Xbox eine enum -Eigenschaft des Typs XBoxStatedefiniert.


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

Beziehungen

Die Funktionalität der Beziehungsdefinitionen wurde für das Common Schema erweitert. Der Typ RelationshipType verfügt nun über die Unterelemente Source und Target mit ID -Eigenschaften, die als Anzeigenamen verwendet werden können. Darüber hinaus können Sie die minimale und maximale Kardinalität sowohl für die Quelle als auch für das Ziel definieren. z. B. 1:1- oder 0:0-Beziehungen.

Kardinalität wird nicht durch den Überprüfungsprozess des Management Packs erzwungen, soll aber dazu beitragen, Benutzeroberflächen für das Management Pack zu definieren. Sie kann beispielsweise verwendet werden, um zu prüfen, ob ein Feld als Textfeld oder Liste dargestellt werden kann.

Wichtig

Jeder MaxCardinality -Wert über 1 wird als unbegrenzt verarbeitet.

Wenn Sie eine neue Beziehung aus Ihrem eigenen Management Pack hinzufügen, müssen Benutzer über ausreichende Berechtigungen zum Aktualisieren aller Eigenschaften der Quell- und Zielklasseninstanzen des Beziehungstyps verfügen, damit sie eine Instanz des neuen Beziehungstyps erstellen können.

Im folgenden Beispiel wird eine Hostingbeziehung namens HasXboxes zwischen dem Lobbytyp und dem Xbox-Typ definiert. In dieser Beziehungsdefinition kann jeder Lobby -Typ mehrere Xbox -Typen besitzen.


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

Kombinationsklassen

Kombinationsklassen sind eine Aggregierung mehrerer verwandter Typen in dem Management Pack, ähnlich wie Ansichten, die in einer Microsoft SQL Server-Datenbank zur Rückgabe von Daten aus mehreren Tabellen definiert werden. Kombinationsklassen dienen zum Speichern aller aggregierten Daten in einem Vorgang in der Datenbank und gleichermaßen zum Aufrufen dieser Daten aus der Datenbank. Sie können das Definieren von Benutzeroberflächen für ein Management Pack vereinfachen.

Im folgenden Beispiel wird eine Projektion für eine Incident Management-Ansicht definiert. Durch diese Projektion werden verschiedene zu einem Incident gehörende Komponenten zu einer einzelnen Einheit kombiniert, die die Verwendung in Formularen und Datenbankvorgängen vereinfacht.


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

Konsolentasks

Konsolentasks werden im Common Schema erweitert. Zuvor waren Konsolentasks einfache Zeiger auf ein Anwendungsverzeichnis und den Namen einer EXE-Datei. Sie sind jetzt als Handlercode in einer Microsoft .NET Framework-Assembly implementiert. Der Handlercode verweist auf die Assembly, die den Code beinhaltet, den Handlernamen und eine Liste benannter Werte, die an den Handler als Argumente weitergegeben werden können.

Im folgenden Beispiel werden der Handler Some.Handler.Name in der Assembly MyLibrary.Resources.Assembly sowie eine Liste der Handlerparameter und von deren Werten definiert.

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

Ressourcen

Binärdaten werden nicht direkt in einem Management Pack gespeichert. Im Management Pack werden stattdessen Metadaten zu der jeweiligen Binärressource gespeichert, während die binären Daten selbst extern in einer Ressourcendatei gespeichert werden. Die Metadaten enthalten eine eindeutige ID, den Dateinamen, das Erstellungsdatum, das Änderungsdatum und Informationen zur Barrierefreiheit.

Binärdaten können generische Ressourcen, Abbilder, Assemblys, Berichtsdefinitionen und Formulare enthalten. Das folgende Beispiel zeigt eine allgemeine XML-Ressource, eine Assemblyressource und eine Berichtsressource.


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

Formulare

Formulare werden in einem Management Pack definiert. Mit ihrer Hilfe können einzelne Instanzen eines Typs oder einer Kombinationsklasse angezeigt und geändert werden.

Formulare basieren auf dem Windows Presentation Framework (WPF) und werden in Assemblys definiert. Die Assembly und Klasse, welche die Formularimplementierungen für ein Management Pack enthalten, befinden sich im Ressourcenabschnitt des Management Packs. Wie bei jeder binären Ressource in einem Management Pack, das das neue allgemeine Schema verwendet, enthält das Management Pack selbst keine Binärdaten für das Formular. Im Management Pack wird nur das Ressourcenmanifest angegeben.

Sie können im Management Pack Ihre eigenen Konfigurationsinformationen für Formulare festlegen. Im folgenden Beispiel enthält der Konfigurationsabschnitt die Eigenschaft ShowXboxes . Diese Konfigurationsinformationen werden nicht vom Management Pack-Überprüfungsprozess ausgewertet. Sie wird nur von der Formularimplementierung interpretiert.


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

Erstellen einer Management Pack-Datei zum Verwalten von Projektoren

Management Packs werden verwendet, um die Funktionalität von Service Manager zu leiten und zu erweitern. In diesem Artikel werden Projektoren als Beispiel verwendet, um die verschiedenen Abschnitte eines Management Packs zu beschreiben und die verschiedenen Objekte zu definieren, die für die Verwaltung von Projektoren in einer organization benötigt werden.

Dieser Artikel enthält ein vollständiges Management Pack-Beispiel mit den erforderlichen Erweiterungen zum Verwalten von Projektoren in einer organization. Zudem wird hier beschrieben, wie ein Management Pack mithilfe eines Windows PowerShell-Cmdlets importiert wird.

In diesem Artikel werden die folgenden Abschnitte eines Management Packs beschrieben:

  • Abschnitt „Manifest“

  • „TypeDefinitions“ zum Erstellen von Klassenaufzählungen und -beziehungen

  • Formulare

In diesem Artikel werden auch die folgenden Abschnitte eines Management Packs beschrieben, die Deklarationen und Definitionen für Benutzeroberflächen- und Lokalisierungselemente enthalten:

  • Kategorien

  • Präsentation

  • Klassenerweiterungen

Manifestabschnitt

Der erste Abschnitt eines Management Packs enthält das Manifest. Mit dem Manifest wird das Management Pack identifiziert, und es werden Verweise auf andere Management Packs deklariert.

Im folgenden Beispiel ist der Abschnitt Manifest eines Management Packs dargestellt, der zum Nachverfolgen von Projektoren in einer Organisation erstellt wurde.


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

Wichtig

Verwenden Sie im Abschnitt Verweise keine nichtalphanumerischen Werte, z. B. ".", im Alias als Verweis.

Erstellen von Klassen im Abschnitt TypeDefinitions

Im nächste Abschnitt eines Management Packs sind Typdefinitionen enthalten. Der Abschnitt TypeDefinitions eines Management Packs enthält Definitionen für Klassen, Aufzählungen und Beziehungen, die vom Management Pack verwendet werden.

Im folgenden Beispiel ist eine Klasse dargestellt, die Informationen zu Projektoren enthält:


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

Im Folgenden wird der Inhalt der Typdefinition abschnittsweise erläutert.

Abschnitt ClassTypes

Mit dem Element ClassType wird die Projektorklasse definiert:

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

Das Attribut ID ist der eindeutige Bezeichner dieser Klasse. Es ist auf festgelegt:

ID="System.ConfigItem.Projector"

Das Attribut Base ist die ID der Klasse, von der diese Klasse abgeleitet wird. Da ein Projektor ein Konfigurationselement ist, ist er auf folgenden Wert festgelegt:

Base="System!System.ConfigItem"

Die Notation von System! gibt an, dass sich diese Klasse, System.ConfigItem, im Management Pack befindet, auf das vom Alias System verwiesen wird.

Mit dem Attribut Hosted wird definiert, ob diese Klasse von einer anderen Klasse gehostet wird. Ist dies der Fall, kann eine Instanz dieser Klasse nur vorhanden sein, wenn eine Hostinstanz vorhanden ist, die diese Klasse enthält. In diesem Beispiel werden Projektoren von nichts gehostet. Daher ist das Attribut Hosted auf false festgelegt:

Hosted="false"

Wenn das Attribut Hosted auf true festgelegt wird, wird angegeben, dass die Klasse von einer anderen Klasse gehostet wird. Eine Hostbeziehung muss im Abschnitt RelationshipTypes deklariert werden.

Mit dem Attribut Accessibility wird festgelegt, ob von dieser Klasse andere Klassen abgeleitet werden können. Wenn Sie möchten, dass Andere speziellere Versionen der Klasse erstellen können, legen Sie dieses Attribut auf publicfest. Beispiel:

Accessibility="Public"

Wenn das Attribut Accessibility auf Internal festgelegt wird, wird verhindert, dass von dieser Klasse andere Klassen abgeleitet werden.

Mit dem Attribut Abstract wird festgelegt, ob Instanzen dieser Klasse erstellt werden können oder ob die Klasse nur als übergeordnete Klasse zur Ableitung für andere Klassen verwendet werden darf. In diesem Beispiel wird das Attribut auf falsefestgelegt. Wenn dieses Attribut auf true festgelegt wird, bedeutet das, dass keine Instanz dieser Klasse direkt erstellt werden kann und dass diese Klasse nur als übergeordnete Klasse verwendet werden darf.

Der nächste Abschnitt der Klassendefinition enthält die Klasseneigenschaften. Der XML-Code, mit dem die Klasseneigenschaften für dieses Beispiel definiert werden, wird im folgenden Codebeispiel definiert:


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

Alle Elemente vom Typ Property enthalten folgende Attribute:

  • Das Attribut ID , mit dem der eindeutige Bezeichner der Eigenschaft angegeben wird

  • Das Attribut Type , mit dem der Datentyp der Eigenschaft angegeben wird

  • Das Key-Attribut . Wenn dieses Attribut auf true festgelegt wird, wird angegeben, dass diese Eigenschaft zum eindeutigen Identifizieren dieser Klasse verwendet wird.

Erstellen von Enumerationstypen

Aufzählungen vom Datentyp enum sind spezielle Datentypen. Aufzählungen werden verwendet, um die Daten für eine Eigenschaft auf eine bestimmte Gruppe von Werten einzuschränken. Aufzählungen können hierarchisch strukturiert sein. Eine Aufzählung kann auf einer anderen Aufzählung basieren.

Aufzählungen werden im Abschnitt EnumertionTypes eines Lösungspakets definiert. Eine Aufzählungsdefinition enthält die Stammaufzählung gefolgt von den eigentlichen Aufzählungswerten.

Von jedem EnumerationValue werden einige Attribute akzeptiert:

In diesem Beispiel wird eine Aufzählung zum Nachverfolgen der Bedingung für die Projektoren definiert. Im Folgenden wird diese Aufzählung definiert:

  • ID ist der Bezeichner für die Aufzählung oder der Aufzählungswert.

  • MitAccessibility wird angegeben, ob dieser Enumerator andere Enumeratoren enthalten darf.

  • ParentName ist ein Attribut, mit dem die ID des übergeordneten Elements des Enumeratorwerts angegeben wird.


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

Ein Formular erstellen

Service Manager Formulare basieren auf WPF-Formularen (Windows Presentation Framework). Service Manager erweitert WPF um einfache Attribute, die der XML-Definition hinzugefügt werden, und ermöglicht es Service Manager, Daten aus dem Management Pack an das Formular zu binden.

Service Manager Formulare können mit verschiedenen Tools erstellt werden, einschließlich Microsoft Visual Studio oder Microsoft Expression Blend. Da die Formulare auf XML basieren, können sie auch mithilfe eines XML-Editors definiert werden.

Im folgenden Beispiel wird eine Formulardefinition dargestellt, die mithilfe von Microsoft Expression Blend erstellt wurde. Dieses Formular enthält vier Steuerelemente, drei Textfelder und ein Kombinationsfeld, die an die zuvor definierten Klasseneigenschaften vom Typ Projector gebunden sind:


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

Damit Steuerelemente im Formular an in einem Management Pack definierte Klasseneigenschaften gebunden werden können, müssen verschiedene Elemente angegeben werden.

Binden von Textsteuerelementen

Um Textfelder an Klasseneigenschaften in einem Management Pack zu binden, fügen Sie der Text-Eigenschaft des Textfeldsteuerelements ein Bindungspfad-Tag hinzu, z. B.:

{Binding Path=SerialNumber, Mode=TwoWay}  

Mit diesem Tag wird das Textfeld-Steuerelement an die im Management definierte Eigenschaft SerialNumber der Klasse Projector gebunden. Zudem wird festgelegt, dass es sich um eine bidirektionale Bindung handelt. Der Wert der Eigenschaft wird aus der Datenbank abgerufen und im Textfeld angezeigt, wenn das Formular geladen wird, und der Eigenschaftswert wird wieder in der Datenbank gespeichert, wenn er vom Benutzer geändert wird.

Binden von Kombinationsfeldern

Damit vom Formular Aufzählungsdaten aus dem zugrunde liegenden Management Pack abgerufen und an ein Steuerelement im Formular gebunden werden können, muss im code-behind im Formular eine Hilfsklasse definiert werden. Diese Hilfsklasse muss eine Methode enthalten, mit der eine im Management Pack definierte Aufzählung zurückgegeben wird. Verwenden Sie zum Zurückgeben einer Aufzählung die Methode GetEnumerations des aktuellen Management Packs. Auf diese instance wird mit der ConsoleContextHelper-Klasse aus dem Service Manager Software Development Kit (SDK) zugegriffen. Im folgenden Beispiel wird mit einer Hilfsklasse eine Methode vom Typ GetStatusValues definiert, mit der die Werte für die im Management Pack definierte Aufzählung ProjectorCondition abgerufen werden:


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

Für den Zugriff auf diese Methode müssen in der Formulardefinition im Management Pack einige Dinge definiert werden.

Zunächst wird der Formulardefinition ein Namespace hinzugefügt, mit dem auf den Namespace für den code behind für das Formular verwiesen wird. In diesem Beispiel lautet der Namespace SMFormsDemo:

xmlns:local="clr-namespace:SMFormsDemo"  

Als Nächstes muss ein ObjectDataProvider definiert werden, damit die Werte für das Kombinationsfeld bereitgestellt werden, mit dem der Projektorstatus angezeigt wird. Dieser ObjectDataProvider wird als Ressource definiert:


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

Mit diesem Datenanbieter wird der Objekt- und Methodenname angegeben, mit dem die Aufzählungswerte aus dem Management Pack abgerufen werden.

Und schließlich wird der Definition des Kombinationsfelds ein Attribut vom Typ ItemsSource hinzugefügt, um das Kombinationsfeld an die im Management Pack definierten Aufzählungswerte zu binden. Mit diesem Attribut wird angegeben, wo die Aufzählungswerte abgerufen werden sollen. Beispiel:

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

Anschließend werden der XAML-Definition (Extensible Application Markup Language) des Kombinationsfeld-Steuerelements die Elemente SelectedItem und ItemTemplate hinzugefügt. Im folgenden Beispiel wird die Definition des Kombinationsfelds mit der XAML-Definition für die Bindung einbezogen:


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

Abschnitt "Category"

Im Abschnitt Category eines Management Packs werden Management Pack-Elemente zur leichteren Navigation gruppiert.

Die ersten beiden <Category> Elemente im Beispiel werden verwendet, um die Anzeige der Aufgaben "Neu " und "Bearbeiten" in der Projektoransicht zu steuern.

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

Die zweiten beiden Category-Elemente im Beispiel-Management Pack werden verwendet, damit die Enumeration der Projektorbedingung in der Ansicht Listen im Bereich Erstellung in der Service Manager-Konsole angezeigt wird. Dadurch kann der Benutzer die Werte anpassen:

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

Wenn diese Kategorie im folgenden Beispiel hinzugefügt wird, wird der Task Bearbeiten in der Ansicht Listen für den EnumerationValue angezeigt, auf den im Attribut Target verwiesen wird:

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

Der Abschnitt "Präsentation"

Im Abschnitt Presentation eines Management Packs werden Elemente deklariert und definiert, die sich auf die Benutzeroberfläche beziehen. Hierzu zählen Formulardeklarationen, Kategorien und Konsolentasks.

Abschnitt „Forms“

Im Abschnitt Forms werden die vom Management Pack verwendeten Formulare deklariert. Im folgenden Beispiel wird angegeben, wo das Formular zu finden ist, das für die Anzeige und Bearbeitung von Instanzen der Klasse Projector definiert wurde. Damit wird das Formular an die im Management Pack definierte Klasse Projector gebunden:


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

Im vorhergehenden Beispiel werden die folgenden Attribute verwendet:

  • Das Attribut TypeName enthält den Namespace- und Klassennamen des Formulars.

  • Das Attribut ID enthält den eindeutigen Bezeichner dieser Formularinstanz.

  • Das Attribut Target enthält den Namen der Klasse, an die dieses Formular gebunden wurde.

  • Mit dem Attribut Assembly wird auf die externe Ressource verwiesen, die das Formular enthält.

  • Mit dem Attribut Accessibility wird festgelegt, ob dieses Formular angepasst werden kann.

Definieren einer Ansicht

Im Abschnitt Views eines Management Packs sind Definitionen von Ansichten der Benutzeroberfläche enthalten. Mithilfe dieser Ansichten können Objekte in einem Management Pack gefiltert und angezeigt werden.

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

Mit dem Attribut „View Target“ wird auf die Klasse verwiesen, für deren Anzeige die Ansicht verwendet wird.

Im vorherigen Beispiel wird auf das Management Pack der Service Manager-Konsole verwiesen. Dieses Management Pack enthält eine Definition eines verwendeten Ansichtstyps. In diesem Beispiel wird der Ansichtstyp SMConsole!GridViewType definiert.

Mit der AdvancedListSupportClass werden verschiedene Parameter definiert. Der wichtigste davon ist der Parameter TargetClass . Legen Sie diesen Parameter auf die ID des ClassType fest, der in dieser Ansicht angezeigt wird. Binden Sie zum Anzeigen der Spalten, bei denen es sich um Eigenschaften des ClassTypehandelt, das Element Column an das Attribut PropertyID .

Mit dem Attribut IsRecurring des Elements ListSupportClass wird festgelegt, ob die Ansicht automatisch aktualisiert wird. Mit dem Attribut RecurrenceFrequency wird das Aktualisierungsintervall in Millisekunden festgelegt. In diesem Beispiel wird das Aktualisierungsintervall auf 1 Sekunde festgelegt, dies wird jedoch nicht für Produktionsinstallationen empfohlen.

Definieren von Ordnern

Durch Definieren von Ordnern wird der Speicherort in der Navigationsstruktur festgelegt, in der die Ansicht angezeigt wird. In diesem Beispiel wird ein Konfigurationselement so definiert, dass es nur geeignet ist, die Ansicht unter dem vorhandenen Ordner für Konfigurationselemente im Arbeitsbereich Konfigurationselemente zu platzieren:

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

Im vorherigen Beispiel enthält das Attribut ElementID einen Verweis auf die erstellte Ansicht. Das Folder-Attribut verweist auf einen Ordner Folders.Projectors, dessen Stamm wiederum im Konfigurationsverwaltungsbereich der Service Manager-Konsole definiert ist. Dieser Stammordner wird im Management Pack der Konfigurationsverwaltung definiert.

Mit dem Element ImageReference wird die zuvor erstellte Ansicht einem Symbol zugeordnet, das im Namespace Configuration Management definiert wird:

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

Lokalisierung mithilfe des Abschnitts „LanguagePacks“

Im Abschnitt LanaguagePacks eines Management Packs werden Zeichenfolgenressourcen und Zuordnungen für Management Pack-Elemente definiert.

Im Beispiel muss EnumerationValueProjectorCondition.Working als Working angezeigt werden. Hierzu müssen die Anzeigenamen für alle folgenden Elemente definiert werden:

  • Ansicht: Alle Projektoren

  • Aufzählungen: working (in Bearbeitung), broken (unterbrochen), in repair (wird repariert), new (neu)

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

Bei Bedarf können Sie für jede weitere erforderliche Sprache weitere Elemente vom Typ LanguagePack erstellen. Die richtige Anzeigezeichenfolge wird dem Benutzer basierend auf dem Gebietsschema des Benutzers angezeigt.

Ressourcen

Der Abschnitt Resources eines Management Packs enthält Verweise auf binäre Ressourcen, die in vom Management Pack getrennten Assemblys enthalten sind. Im folgenden Beispiel wird eine Ressource definiert, mit der auf die Assembly verwiesen wird, die das von der Klasse Projector verwendete Formular enthält:

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

Klassenerweiterungen

Eine Klassenerweiterung ist eine Klasse, mit der Eigenschaften zur einer vorhandenen Klasse hinzugefügt werden. In den meisten Fällen befindet sich diese vorhandene Klasse in einem versiegelten Management Pack. In Fällen, in denen sich die vorhandene Klasse nicht in einem versiegelten Management Pack befindet, muss die Klassenerweiterung im selben Management Pack enthalten sein wie die Klasse, die erweitert wird.

Eine Klassenerweiterung erbt die Eigenschaften aller übergeordneten Klassen, z. B.:

  • Klasse A verfügt über eine Eigenschaft mit dem Namen „Property1“ (Eigenschaft1).

  • Klasse B wird abgeleitet von bzw. erweitert Klasse A und verfügt daher über eine Eigenschaft mit dem Namen „Property1“. Diese Eigenschaft wird von Klasse A, der übergeordneten oder Basisklasse, geerbt.

  • Durch die Definition der Klasse B wird eine Eigenschaft „Property2“ (Eigenschaft2) hinzugefügt.

  • Jede Klassenerweiterung, die von Klasse B abgeleitet ist, erbt „Property1“ und „Property2“.

    Im folgenden Beispiel ist eine Definition einer Klassenerweiterung dargestellt:


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

Mit dieser Klassenerweiterung wird die Klasse System.WorkItem.Incident erweitert und eine neue Eigenschaft mit dem Namen TimeOnIncidenthinzugefügt.

Die Definition für eine Klassenerweiterung gleicht der einer Klassendefinition. Zwei Attribute des Elements ClassType werden zum Definieren einer Klassendefinition verwendet: das Attribut Base und das Attribut IsExtensionType .

Mit dem Attribut Base wird die ID der übergeordneten Klasse festgelegt, aus der die Klassenerweiterung abgeleitet wird. In diesem Beispiel ist der Attributwert auf Incident!System.WorkItem.Incidentfestgelegt. Dieser Wert enthält den Alias des vollständigen Namens des Management Packs, das die erweiterte Klasse enthält, ein Ausrufezeichen und den Namen der Basisklasse. Weitere Informationen finden Sie im folgenden Beispiel.

Mit dem Attribut IsExtensionType wird festgelegt, ob diese Klasse eine Erweiterung der Basisklasse ist. Da TimeOnIncident eine Erweiterung der Klasse Incident ist, wird diese Eigenschaft auf truefestgelegt:

IsExtensionType="true"  

Die andere Option ist false, was angibt, dass es sich nicht um eine Erweiterung einer anderen Klasse handelt, sondern um eine neue Klasse, die von der Basis erbt. Der Standardwert ist false. Daher muss dieses Attribut nicht verwendet werden, wenn die -Klasse keine Erweiterung ist.

Vollständiges Beispiel

Im folgenden Codebeispiel wird das vollständige Management Pack dargestellt, das die Klassenerweiterung enthält.

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>  

Importieren eines Management Packs mithilfe eines Cmdlets

Sie können das Cmdlet Windows PowerShell Import-SCSMManagementPack verwenden, um ein Service Manager Management Pack zu importieren, z. B.:

Import-SCSMManagementPack MyServiceManager.ManagementPack.xml  

In diesem Dokument wird nicht beschrieben, wie Management Packs in der Service Manager Konsole importiert und verwendet werden. Informationen zur Verwendung von Management Packs in der Service Manager-Konsole finden Sie unter Verwenden von Management Packs in Service Manager.

Vollständiges Management Pack-Beispiel

Die folgenden Codebeispiele stellen das vollständige Beispiel-Management Pack dar, das neben der Formulardefinition und dem C#-Codebehind für das Formular für Beispiele in diesem Artikel verwendet wird.

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>  

Formulardefinition


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

Formular „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);  
      }  
   }  
}  

Nächste Schritte