Freigeben über


Arbeiten mit XML-Dateien des Service Manager Management Packs

Für aufwendige Anpassungen von Management Packs reicht möglicherweise die Service Manager-Konsole und das Dienst-Manager-Erstellungstool möglicherweise nicht aus, und Möglicherweise müssen Sie Management Pack-Dateien direkt erstellen oder ändern. Das direkte Arbeiten mit Management Pack-Dateien erfordert fundierte Kenntnisse in mehreren Bereichen wie dem System Center Common 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 allgemeinen System Center-Schema

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

Eigenschaften und Eigenschaftseinschränkungen

Das allgemeine Schema erweitert Klassen über mehrere neue Eigenschaftstypen. Zu diesen Eigenschaftentypen gehören die Binären, Enumerator- und autoinkrementellen Typen.

Darüber hinaus können Sie Einschränkungen für bestimmte Eigenschaftswerte definieren. Sie können beispielsweise eine Einschränkung für reguläre Ausdrücke für einen Zeichenfolgeneigenschaftswert definieren. Im folgenden Beispiel verfügt die BuildingName-Eigenschaft über eine Einschränkung regulärer Ausdrücke, die definiert ist, sodass nur ein Wert mit dem Wort Building 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. Daher enthält der <PresentationTypes> Abschnitt des Management Packs nicht mehr die <Images>Tags <Image>oder <ImageData> Tags. Verwenden Sie stattdessen eine Bildressource.

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

Enumerationen

Das allgemeine Schema unterstützt Enumerationen. Enumerationen sind eine Struktur von Werten, die Sie verwenden können, um den Wert einer Eigenschaft oder eines Attributs einzuschränken.

Jede Enumeration verfügt über ein erforderliches eindeutiges ID-Attribut und ein optionales übergeordnetes Attribut.

Im folgenden Beispiel wird die XBoxState-Aufzählung mit drei möglichen Werten definiert: Running, Stopped und Error.


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

Im folgenden Beispiel definiert die Xbox-Klasse eine Enumerationseigenschaft vom Typ 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>  

Beziehungen

Die Funktionalität von Beziehungsdefinitionen wurde im allgemeinen Schema verbessert. Der RelationshipType-Typ verfügt jetzt über Quell - und Ziel-Unterelemente 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. Beispielsweise 1:1- oder 0:n-Beziehungen.

Kardinalität wird nicht durch den Validierungsprozess des Management Packs erzwungen, sondern soll dazu beitragen, Benutzeroberflächen für das Management Pack zu definieren. Beispielsweise kann die Kardinalität überprüft werden, um zu bestimmen, ob ein Feld in einem Formular durch ein Textfeld oder durch eine Liste dargestellt werden kann.

Wichtig

Jeder MaxCardinality-Wert , der als größer als 1 definiert ist, wird als unbegrenzt verarbeitet.

Wenn Sie einen neuen Beziehungstyp aus Ihrem eigenen Management Pack hinzufügen, müssen Benutzer über ausreichende Berechtigungen verfügen, um alle Eigenschaften der Quell- und Zielklasseninstanzen des Beziehungstyps zu aktualisieren, um eine Instanz des neuen Beziehungstyps zu erstellen.

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


<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 stellen eine Aggregation mehrerer verwandter Typen im Management Pack dar, ähnlich wie Ansichten, die in einer Microsoft SQL Server-Datenbank definiert sind, die Daten aus mehreren Tabellen zurückgeben können. Kombinationsklassen speichern und abrufen alle aggregierten Daten in einem Vorgang in der Datenbank, und sie können die Definition von Benutzeroberflächen für ein Management Pack vereinfachen.

Im folgenden Beispiel wird eine Projektion für eine Vorfallverwaltungsansicht definiert. Diese Projektion kombiniert mehrere unterschiedliche Komponenten, die sich auf einen Vorfall beziehen, in einer Einheit, die für Formulare und für Datenbankvorgänge einfacher verwendet werden kann.


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

Konsolenaufgaben

Konsolenaufgaben werden im allgemeinen Schema erweitert. Zuvor waren Konsolenaufgaben einfache Zeiger auf ein Anwendungsverzeichnis und einen Dateinamen für ausführbare Dateien. Konsolenaufgaben werden jetzt als Handlercode in einer Microsoft .NET Framework-Assembly implementiert. Der Handlercode verweist auf die Assembly, die den Code, den Handlernamen und eine Liste mit benannten Werten enthält, die als Argumente an den Handler übergeben werden können.

Im folgenden Beispiel wird der Some.Handler.Name-Handler in der Assembly MyLibrary.Resources.Assembly definiert. Außerdem wird eine Liste der Handlerparameter und deren Werte 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äre Daten werden nicht direkt in einem Management Pack gespeichert. Stattdessen werden Metadaten zur binären Ressource im Management Pack gespeichert, und die tatsächlichen Binärdaten werden extern in einer Ressourcendatei gespeichert. Die Metadaten enthalten einen eindeutigen Bezeichner, den Dateinamen, die Erstellungsdaten, das Änderungsdatum und Barrierefreiheitsinformationen.

Binäre Daten können generische Ressourcen, Bilder, Assemblys, Berichtsdefinitionen und Formulare enthalten. Das folgende Beispiel zeigt eine generische 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. Sie können Formulare verwenden, um eine einzelne Instanz eines Typs oder einer Kombinationsklasse anzuzeigen und zu ändern.

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

Sie können ihre eigenen Konfigurationsinformationen für das Formular im Management Pack angeben. Im folgenden Beispiel enthält der Konfigurationsabschnitt eine ShowXboxes-Eigenschaft . Diese Konfigurationsinformationen werden vom Überprüfungsprozess des Management Packs nicht 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 für die Beschreibung der verschiedenen Abschnitte eines Management Packs und zum Definieren der verschiedenen Objekte verwendet, die für die Verwaltung von Projektoren in einer Organisation erforderlich sind.

Dieser Artikel enthält ein vollständiges Management Pack-Beispiel mit den erforderlichen Erweiterungen zum Verwalten von Projektoren in einer Organisation. Außerdem wird beschrieben, wie Sie ein Management Pack mithilfe eines Windows PowerShell-Cmdlets importieren.

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

  • Das 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 die Benutzeroberfläche und Lokalisierungselemente enthalten:

  • Kategorien

  • Präsentation

  • Klassenerweiterungen

Manifestabschnitt

Der erste Abschnitt eines Management Packs enthält das Manifest. Das Manifest identifiziert das Management Pack und deklariert alle Verweise auf andere Management Packs.

Das folgende Beispiel zeigt den Manifestabschnitt eines Management Packs, das zum Nachverfolgen von Projektoren in einer Organisation entwickelt 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 für einen Verweis.

Erstellen von Klassen im TypeDefinitions-Abschnitt

Der nächste Abschnitt eines Management Packs enthält Typdefinitionen. Der TypeDefinitions-Abschnitt eines Management Packs enthält Definitionen für Klassen, Enumerationen und Beziehungen, die vom Management Pack verwendet werden.

Das folgende Beispiel zeigt eine Klasse, 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 finden Sie eine Abschnitts-nach-Abschnitt-Erläuterung der Artdefinition.

Der Abschnitt "ClassTypes"

Das ClassType-Element definiert die Projektorklasse:

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

Das ID-Attribut ist der eindeutige Bezeichner dieser Klasse. Sie ist auf Folgendes festgelegt:

ID="System.ConfigItem.Projector"

Das Base-Attribut ist die ID der Klasse, von der diese Klasse abgeleitet wird. Da ein Projektor eine Art Konfigurationselement ist, ist dies auf Folgendes festgelegt:

Base="System!System.ConfigItem"

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

Das gehostete Attribut definiert, ob diese Klasse von einer anderen Klasse gehostet wird. In diesem Fall kann eine Instanz dieser Klasse nur vorhanden sein, wenn eine Hostinstanz vorhanden ist, die sie enthält. In diesem Beispiel werden Projektoren nicht von etwas gehostet. Daher wird das Attribut "Hosted " auf "false" festgelegt:

Hosted="false"

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

Das Attribut "Accessibility " definiert, ob andere Klassen von dieser Klasse abgeleitet werden können. In Fällen, in denen Sie anderen das Erstellen einer spezifischeren Version Ihrer Klasse gestatten möchten, legen Sie dieses Attribut auf "öffentlich" fest, z. B.:

Accessibility="Public"

Wenn Sie das Attribut "Barrierefreiheit " auf "Internal " festlegen, wird verhindert, dass andere Klassen von dieser Klasse abgeleitet werden.

Das abstrakte Attribut definiert, ob Instanzen dieser Klasse erstellt werden können oder ob die Klasse nur als übergeordnete Klasse für andere Klassen verwendet werden soll, von der abgeleitet werden soll. In diesem Beispiel wird dieses Attribut auf "false" festgelegt. Das Festlegen dieses Attributs auf "true " bedeutet, dass keine Instanzen dieser Klasse direkt erstellt werden können und dass diese Klasse nur als übergeordnete Klasse verwendet werden kann.

Der nächste Abschnitt der Klassendefinition enthält die Klasseneigenschaften. Der XML-Code, der die Klasseneigenschaften für dieses Beispiel definiert, 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"  />  

Jedes Property-Element weist die folgenden Attribute auf:

  • Das ID-Attribut , das den eindeutigen Bezeichner der Eigenschaft angibt.

  • Das Type-Attribut , das den Datentyp der Eigenschaft angibt.

  • Das Key-Attribut . Wenn Sie dieses Attribut auf "true " festlegen, wird angegeben, dass diese Eigenschaft verwendet werden soll, um diese Klasse eindeutig zu identifizieren.

Erstellen von Enumerationstypen

Enumerationen des Enumerationsdatentyps sind spezielle Datentypen. Enumerationen werden verwendet, um die Für eine Eigenschaft zulässigen Daten auf einen bestimmten Wertesatz zu beschränken. Enumerationen können hierarchisch sein; eine Aufzählung kann auf einer anderen Enumeration basieren.

Enumerationen werden im Abschnitt "EnumertionTypes" eines Lösungspakets definiert. Eine Enumerationsdefinition enthält die Stammaufzählung, gefolgt von den tatsächlichen Enumerationswerten.

Jeder EnumerationValue akzeptiert einige Attribute:

In diesem Beispiel wird eine Enumeration definiert, um den Zustand der Projektoren nachzuverfolgen. Im Folgenden wird diese Enumeration definiert:

  • ID ist der Bezeichner für den Enumerations- oder Enumerationswert.

  • Barrierefreiheit gibt an, ob dieser Enumerator andere Enumerationen enthalten kann.

  • ParentName ist ein Attribut, das die ID des übergeordneten Elements des Enumerationswerts angibt.


<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

Dienst-Manager-Formulare basieren auf Windows Presentation Framework (WPF)-Formularen. Service Manager erweitert WPF mit einfachen Attributen, die der XML-Definition hinzugefügt werden, und ermöglichen Service Manager das Binden von Daten aus dem Management Pack an das Formular.

Dienst-Manager-Formulare können mithilfe verschiedener Tools erstellt werden, einschließlich Microsoft Visual Studio oder Microsoft Expression Blend. Da die Formulare XML-basiert sind, können sie auch mithilfe eines beliebigen XML-Editors definiert werden.

Das folgende Beispiel zeigt eine Formulardefinition, die mithilfe von Microsoft Expression Blend erstellt wurde. Dieses Formular enthält vier Steuerelemente, drei Textfelder und ein Kombinationsfeld, die an die zuvor definierten Projektorklasseneigenschaften 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>  

Um die Bindung von Steuerelementen im Formular an Klasseneigenschaften zu aktivieren, die in einem Management Pack definiert sind, müssen eine Reihe von Elementen angegeben werden.

Binden von Textsteuerelementen

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

{Binding Path=SerialNumber, Mode=TwoWay}  

Dieses Tag bindet das Textfeld-Steuerelement an die SerialNumber-Eigenschaft der Projektorklasse , die im Management Pack definiert wurde, und gibt an, dass dies eine bidirektionale Bindung sein soll. Der Wert der Eigenschaft wird aus der Datenbank abgerufen und beim Laden des Formulars im Textfeld angezeigt, und der Eigenschaftswert wird wieder in der Datenbank gespeichert, wenn er vom Benutzer geändert wird.

Bindungskombinationsfelder

Damit das Formular Enumerationsdaten aus dem zugrunde liegenden Management Pack abrufen und an ein Steuerelement im Formular binden kann, muss eine Hilfsklasse im CodeBehind im Formular definiert werden. Diese Hilfsklasse sollte eine Methode enthalten, die eine Im Management Pack definierte Aufzählung zurückgibt. Verwenden Sie zum Zurückgeben einer Enumeration die GetEnumerations-Methode des aktuellen Management Packs. Auf diese Instanz wird mit der ConsoleContextHelper-Klasse aus dem Service Manager Software Development Kit (SDK) zugegriffen. Im folgenden Beispiel definiert eine Hilfsklasse eine GetStatusValues-Methode , die die Werte für die ProjektorCondition-Aufzählung abruft, die im Management Pack definiert wurde:


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

Um auf diese Methode zuzugreifen, müssen einige Dinge in der Formulardefinition im Management Pack definiert werden.

Zunächst wird der Formulardefinition ein Namespace hinzugefügt, der auf den Namespace für den CodeBehind für das Formular verweist. In diesem Beispiel ist der Namespace SMFormsDemo:

xmlns:local="clr-namespace:SMFormsDemo"  

Als Nächstes muss ein ObjectDataProvider definiert werden, um die Werte für das Kombinationsfeld bereitzustellen, in dem der Projektorstatus angezeigt wird. Dieser ObjectDataProvider ist als Ressource definiert:


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

Dieser Datenanbieter gibt den Objekt- und Methodennamen an, der die Enumerationswerte aus dem Management Pack abruft.

Zum Binden des Kombinationsfelds an die Enumerationswerte, die im Management Pack definiert sind, wird der Definition des Kombinationsfelds ein ItemsSource-Attribut hinzugefügt. Dieses Attribut gibt an, wo die Enumerationswerte abgerufen werden sollen, z. B.:

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

Als Nächstes werden SelectedItem- und ItemTemplate-Elemente der XAML-Definition (Extensible Application Markup Language) des Kombinationsfeld-Steuerelements hinzugefügt. Das folgende Beispiel zeigt die Kombinationsfelddefinition, in der die Bindungs-XAML enthalten ist:


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

Der Abschnitt "Kategorie"

Der Abschnitt "Kategorie" eines Management Packs gruppiert Management Pack-Elemente zusammen, um die Navigation zu vereinfachen.

Die ersten beiden <Category> Elemente im Beispiel werden verwendet, um die Anzeige der Vorgänge "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 Beispielverwaltungspaket werden verwendet, um die Projektorbedingungsenumeration in der Listenansicht im Bereich "Dokumenterstellung " in der Dienst-Manager-Konsole anzuzeigen. Auf diese Weise kann der Benutzer die Werte anpassen:

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

Wenn Sie diese Kategorie im folgenden Beispiel hinzufügen, wird die Aufgabe "Bearbeiten" in der Listenansicht für den EnumerationValue angezeigt, auf den im Zielattribut verwiesen wird:

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

Der Abschnitt "Präsentation"

Im Abschnitt "Präsentation" eines Management Packs werden benutzeroberflächenbezogene Elemente deklariert und definiert. Dazu gehören Formulardeklarationen, Kategorien und Konsolenaufgaben.

Der Abschnitt "Formulare"

Im Abschnitt "Formulare " werden Formulare deklariert, die von Ihrem Management Pack verwendet werden. Im folgenden Beispiel wird angegeben, wo das Formular gefunden werden soll, das zum Anzeigen und Bearbeiten von Instanzen der Projektorklasse definiert ist. Dadurch wird das Formular an die Projektorklasse gebunden, die im Management Pack definiert ist:


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

Die folgenden Attribute werden im vorherigen Beispiel verwendet:

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

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

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

  • Das Assembly-Attribut verweist auf die externe Ressource, die das Formular enthält.

  • Das Attribut "Accessibility " definiert, ob dieses Formular angepasst werden kann.

Definieren einer Ansicht

Der Abschnitt "Ansichten" eines Management Packs enthält Definitionen von Benutzeroberflächenansichten. Diese Ansichten können zum Filtern und Anzeigen von Objekten in einem Management Pack verwendet 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>  

Das View Target-Attribut verweist auf die Klasse, mit der die Ansicht angezeigt wird.

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

Die AdvancedListSupportClass definiert eine Reihe von Parametern, deren Wichtigstes der TargetClass-Parameter ist. Legen Sie diesen Parameter auf die ID des ClassType fest, der in dieser Ansicht angezeigt wird. Um die Spalten anzuzeigen, die Eigenschaften des ClassType-Objekts sind, verwenden Sie das Column-Element , und binden Sie sie an das PropertyID-Attribut .

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

Definieren von Ordnern

Durch das Definieren eines Ordners wird die Position in der Navigationsstruktur bestimmt, 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 ElementID-Attribut einen Verweis auf die erstellte Ansicht. Das Folder-Attribut verweist auf einen Ordner "Folders.Projektors ", der wiederum seinen Stamm wie im Konfigurationsverwaltungsarbeitsbereich der Dienst-Manager-Konsole definiert hat. Dieser Stammordner wird im Configuration Management Management Pack definiert.

Das ImageReference-Element ordnet die Ansicht zu, die zuvor mit einem Symbol erstellt wurde, das im Konfigurationsverwaltungsnamespace definiert ist:

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

Lokalisierung mithilfe des LanguagePacks-Abschnitts

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. Dazu müssen Anzeigenamen für jede der folgenden Werte definiert werden:

  • Ansicht: Alle Projektoren

  • Aufzählungen: Arbeiten, beschädigt, in Reparatur, 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>  

Sie können bei Bedarf zusätzliche LanguagePack-Elemente für jede zusätzliche Sprache erstellen, die Sie benötigen. Die richtige Anzeigezeichenfolge wird dem Benutzer basierend auf dem Gebietsschema des Benutzers angezeigt.

Ressourcen

Der Abschnitt "Ressourcen " eines Management Packs enthält Verweise auf binäre Ressourcen, die in Assemblys enthalten sind, die vom Management Pack getrennt sind. Im folgenden Beispiel wird eine Ressource definiert, die auf die Assembly verweist, die das Formular enthält, das von der Projektorklasse verwendet wird:

<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, die einer vorhandenen Klasse Eigenschaften hinzufügt. 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 gleichen Management Pack enthalten sein wie die Klasse, die erweitert wird.

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

  • Klasse A hat eine Eigenschaft namens Property1

  • Klasse B wird von Klasse A abgeleitet oder erweitert und hat daher eine Eigenschaft mit dem Namen Property1. Diese Eigenschaft wird von Klasse A, dem übergeordneten Element oder der Basisklasse geerbt.

  • Die Definition von Klasse B fügt eine Eigenschaft namens Property2 hinzu.

  • Jede Klassenerweiterung, die von Klasse B abgeleitet wird, erbt Property1 und Property2.

    Das folgende Beispiel zeigt eine Klassenerweiterungsdefinition:


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

Diese Klassenerweiterung erweitert die System.WorkItem.Incident-Klasse und fügt eine neue Eigenschaft namens TimeOnIncident hinzu.

Die Definition für eine Klassenerweiterung ähnelt der einer Klassendefinition. Zum Definieren einer Klassendefinition werden zwei Attribute des ClassType-Elements verwendet: das Base-Attribut und das IsExtensionType-Attribut .

Das Base-Attribut gibt die ID der übergeordneten Klasse an, von der die Klassenerweiterung abgeleitet wird. In diesem Fall wird der Attributwert auf Incident festgelegt! System.WorkItem.Incident. Dieser Wert enthält den Alias des vollständigen Management Pack-Namens, der die Klasse enthält, die erweitert wird, ein Ausrufezeichen und dann den Namen der Basisklasse. Weitere Informationen finden Sie im folgenden Beispiel.

Das IsExtensionType-Attribut definiert, ob diese Klasse eine Erweiterung der Basisklasse ist. Da TimeOnIncident eine Erweiterung der Incident-Klasse ist, wird diese Eigenschaft auf "true" festgelegt:

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

Das folgende Codebeispiel zeigt das vollständige Management Pack mit der Klassenerweiterung.

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 Windows PowerShell Import-SCSMManagementPack-Cmdlet verwenden, um beispielsweise ein Service Manager Management Pack zu importieren:

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.

Beispiel für ein vollständiges Management Pack

Die folgenden Codebeispiele stellen das vollständige Beispielverwaltungspaket dar, das neben der Formulardefinition und dem C#-CodeBehind für das Formular 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>  

FormularcodeBehind


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