Modificare direttamente un file del Management Pack per gestire i proiettori
Data di pubblicazione: luglio 2016
Si applica a: System Center 2012 SP1 - Service Manager, System Center 2012 R2 Service Manager, System Center 2012 - Service Manager
I Management Pack vengono utilizzati per indirizzare ed estendere le funzionalità di System Center 2012 - Service Manager. In questo argomento vengono utilizzati come esempio dei proiettori per descrivere le diverse sezioni di un Management Pack e per definire i vari oggetti necessari per la gestione dei proiettori in un'organizzazione.
In questo argomento è incluso un Management Pack di esempio con le estensioni necessarie per gestire i proiettori in un'organizzazione. Inoltre, viene descritto come importare un Management Pack utilizzando un cmdlet di Windows PowerShell.
In questo argomento vengono descritte le seguenti sezioni di un Management Pack:
Il Manifesto
TypeDefinitions per creare enumerazioni e relazioni della classe
Moduli
In questo argomento vengono descritte le sezioni seguenti di un Management Pack che contengono le dichiarazioni e le definizioni per l'interfaccia utente (UI) e gli elementi di localizzazione:
Categoria
Presentazione
Estensioni della classe
La sezione Manifesto
La prima sezione di un Management Pack contiene il manifesto. Il manifesto identifica il Management Pack e dichiara tutti i riferimenti ad altri Management Pack.
Nell'esempio riportato di seguito viene mostrata la sezione Manifest di un Management Pack progettato per registrare i proiettori in un'organizzazione.
<Manifest>
<Identity>
<ID>ServiceManager.Projector_Authoring</ID>
<Version>7.0.3707.0</Version>
</Identity>
<Name>Projector Library</Name>
<References>
<Reference Alias="System">
<ID>System.Library</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
<Reference Alias="SMConsole">
<ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Console</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
<Reference Alias="Authoring">
<ID>Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
<Reference Alias="SMConfig">
<ID>ServiceManager.ConfigurationManagement.Library</ID>
<Version>7.0.3707.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
</References>
</Manifest>
Importante |
---|
|
La sezione TypeDefinitions: creazione di una classe
La sezione successiva di un Management Pack contiene le definizioni dei tipi. La sezione TypeDefinitions di un Management Pack contiene le definizioni di classi, enumerazioni e relazioni utilizzate dal Management Pack.
Nell'esempio seguente viene illustrata una classe che contiene informazioni sui proiettori:
<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>
Di seguito viene fornita la spiegazione sezione per sezione della definizione dei tipi in essa contenute.
La sezione ClassTypes
L'elemento ClassType definisce la classe del proiettore:
<ClassType ID="System.ConfigItem.Projector" Base="System!System.ConfigItem" Hosted="false" Accessibility="Public" Abstract="false">
L'attributo ID è l'identificatore univoco di questa classe. È impostato su:
ID="System.ConfigItem.Projector"
L'attributo Base è l'ID della classe da cui deriva tale classe. Poiché un proiettore è un tipo di elemento di configurazione, è impostato su:
Base="System!System.ConfigItem"
La notazione di System! indica che questa classe, System.ConfigItem, si trova nel Management Pack a cui fa riferimento l'alias System.
L'attributo Hosted definisce se questa classe è ospitata da un'altra classe. In questo caso, un'istanza di questa classe può esistere solo quando esiste un'istanza di host che la contiene. In questo esempio i proiettori non sono ospitati da nulla. Pertanto l'attributo Hosted è impostato su false:
Hosted="false"
Se si imposta l'attributo Hosted su true si indica che la classe è ospitata da un'altra classe. Una relazione di hosting deve essere dichiarata nella sezione RelationshipTypes.
L'attributo Accessibility definisce se altre classi possono derivare da questa classe. Nei casi in cui si desidera permettere ad altri di creare una versione più specifica della classe, impostare questo attributo su public, ad esempio:
Accessibility="Public"
Impostando l'attributo Accessibility su Internal si impedisce che altre classi possano derivare da questa classe.
L'attributo Abstract definisce se possano essere create istanze di questa classe o se la classe debba solo essere usata per altre classi come classe padre da cui derivare. In questo esempio, l'attributo è impostato su false. Se si imposta questo attributo su true significa che non sarà possibile creare direttamente nessuna istanza di questa classe e che questa classe potrà essere usata soltanto come classe padre.
La sezione successiva della definizione della classe contiene le proprietà della classe. Il codice XML che definisce le proprietà della classe per questo esempio è definito nell'esempio di codice riportato di seguito:
<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" />
Ogni elemento Property presenta i seguenti attributi:
L'attributo ID, che indica l'identificatore univoco della proprietà.
L'attributo Type, che indica il tipo di dati della proprietà.
L'attributo Key. Se si imposta questo attributo su true significa che questa proprietà dovrà essere usata per identificare in modo univoco questa classe.
Creazione di tipi di enumerazione
Le enumerazioni del tipo di dati enum sono tipi di dati speciali. Le enumerazioni vengono utilizzate per vincolare i dati consentiti per una proprietà a una serie specifica di valori. Le enumerazioni possono essere gerarchiche; un'enumerazione può essere basata su un'altra enumerazione.
Le enumerazioni sono definite nella sezione EnumertionTypes di un pacchetto della soluzione. Una definizione di enumerazione contiene l'enumerazione principale, seguita dai valori di enumerazione effettivi.
Ogni EnumerationValue accetta alcuni attributi:
In questo esempio è definita un'enumerazione per tenere traccia della condizione dei proiettori. Di seguito viene definita l'enumerazione:
ID è l'identificatore per l'enumerazione o un valore di enumerazione.
Accessibility specifica se l'enumeratore può contenere altri enumeratori.
ParentName è un attributo che specifica l'ID del padre del valore dell'enumeratore.
<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>
Creazione di un modulo
I moduli di Service Manager sono basati su moduli Windows Presentation Framework (WPF).Service Manager estende WPF con attributi semplici che vengono aggiunti alla definizione XML e consentono a Service Manager di associare i dati dal Management Pack al modulo.
Per creare i moduli di Service Manager è possibile usare vari strumenti diversi, tra cui Microsoft Visual Studio e Microsoft Expression Blend. Poiché i moduli sono basati su XML, possono essere definiti anche utilizzando un qualunque editor XML.
Nell'esempio riportato di seguito viene illustrata una definizione di modulo creata mediante Microsoft Expression Blend. Questo modulo contiene quattro controlli, tre caselle di testo e una casella combinata, associati alle proprietà della classe Proiettore definite in precedenza:
<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="https://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>
Per abilitare l'associazione dei controlli nel modulo alle proprietà della classe definite in un Management Pack, è necessario specificare un numero di elementi.
Associazione di controlli di testo
Per associare le caselle di testo alle proprietà della classe in un Management Pack, aggiungere un tag Binding Path alla proprietà Text del controllo della casella di testo, ad esempio:
{Binding Path=SerialNumber, Mode=TwoWay}
Questo tag associa il controllo della casella di testo alla proprietà SerialNumber della classe Proiettore definita in precedenza nel Management Pack e specifica che si tratta di un'associazione bidirezionale. Il valore della proprietà viene recuperato dal database e visualizzato nella casella di testo quando viene caricato il modulo, mentre il valore della proprietà viene archiviato nuovamente nel database se viene modificato dall'utente.
Associazione di caselle combinate
Per consentire al modulo di recuperare i dati di enumerazione dal Management Pack sottostante e associarli a un controllo presente nel modulo, è necessario definire una classe helper nel code-behind nel modulo. Questa classe helper deve contenere un metodo che restituisca un'enumerazione definita nel Management Pack. Per restituire un'enumerazione, utilizzare il metodo GetEnumerations del Management Pack corrente. Si accede a questa istanza con la classe ConsoleContextHelper dal Software Development Kit (SDK) di Service Manager. Nell'esempio seguente, una classe helper definisce un metodo GetStatusValues che recupera i valori per l'enumerazione ProjectorCondition definita in precedenza nel Management Pack:
public class helper
{
public static ICollection<IDataItem> GetStatusValues()
{
return ConsoleContextHelper.Instance.GetEnumerations("ProjectorCondition",true);
}
}
Per accedere a questo metodo, è necessario definire alcuni aspetti nella definizione del modulo nel Management Pack.
Innanzitutto, alla definizione del modulo viene aggiunto uno spazio dei nomi che punta al code behind del modulo. In questo esempio, lo spazio dei nomi è SMFormsDemo:
xmlns:local="clr-namespace:SMFormsDemo"
Quindi è necessario definire un ObjectDataProvider per fornire i valori per la casella combinata che visualizza lo stato del proiettore. Questo ObjectDataProvider è definito come risorsa:
<UserControl.Resources>
<ObjectDataProvider
ObjectType="{x:Type local:helper}"
MethodName="GetStatusValues"
x:Key="getStatusValues" />
</UserControl.Resources>
Il provider di dati specifica l'oggetto e il nome del metodo che recupera i valori di enumerazione dal Management Pack.
Infine, per associare la casella combinata ai valori di enumerazione definiti nel Management Pack, viene aggiunto un attributo ItemsSource alla definizione della casella combinata. Questo attributo specifica dove recuperare i valori di enumerazione, ad esempio:
ItemsSource="{Binding Source={StaticResource getStatusValues}, Mode=OneWay }"
Successivamente vengono aggiunti gli elementi SelectedItem e ItemTemplate dalla definizione Extensible Application Markup Language (XAML) del controllo della casella combinata. Nell'esempio seguente viene mostrata la definizione di una casella combinata con inclusa l'associazione XAML:
<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>
La sezione Categoria
La sezione Category di un Management Pack raggruppa insieme gli elementi del management Pack per semplificare l'esplorazione.
I primi due elementi <Category> nell'esempio vengono usati per controllare la visualizzazione delle attività Nuovo e Modifica nella vista Proiettori.
<Category ID="ProjectorViewHasTasks.View" Target="AllProjectorsView" Value="ProjectorViewTasksEnumeration" />
<Category ID="ProjectorViewHasTasks.CreateTask" Target="CreateProjector" Value="ProjectorViewTasksEnumeration" />
I due secondi elementi Category nel Management Pack di esempio vengono usati per rendere visibile l'enumerazione della condizione del proiettore nella vista Elenchi del riquadro di Creazione e modifica nella Console di Service Manager. Ciò consente all'utente di personalizzare i valori:
<Category ID="Project.ProjectorConditionEnumVisibleCategory" Target="ProjectorCondition" Value="System!VisibleToUser"/>
Aggiungendo questa categoria nell'esempio seguente fa sì che l'attività Modifica appaia nella vista Elenchi per il EnumerationValue che viene puntato nell'attributo Target:
<Category ID="Projector.ProjectorConditionCategory" Target="ProjectorCondition" Value="Authoring!Microsoft.EnterpriseManagement.ServiceManager.UI.Authoring.EnumerationViewTasks"/>
La sezione Presentazione
La sezione Presentation di un Management Pack dichiara e definisce gli elementi correlati all'interfaccia utente, tra cui dichiarazioni di moduli, categorie e attività della console.
La sezione Moduli
La sezione Forms dichiara i moduli utilizzati dal Management Pack. Nell'esempio seguente viene specificato dove trovare il modulo che è stato definito per visualizzare e modificare le istanze della classe Proiettore. Ciò consente di associare il modulo alla classe Proiettore definita nel Management Pack:
<Forms>
<Form TypeName="SMFormsDemo.TestControl"
ID="TestForm"
Target="System.ConfigItem.Projector"
Assembly="ProjectorFormsAssembly"
Accessibility="Public">
<Category>Form</Category>
</Form>
</Forms>
Nell'esempio precedente sono stati utilizzati i seguenti attributi:
L'attributo TypeName contiene lo spazio dei nomi e il nome della classe del modulo.
L'attributo ID contiene l'identificatore univoco di questa istanza del modulo.
L'attributo Target contiene il nome della classe a cui è associato il modulo.
L'attributo Assembly punta alla risorsa esterna che contiene il modulo.
L'attributo Accessibility definisce se questo modulo può essere personalizzato.
Definizione di una vista
La sezione Views di un Management Pack contiene le definizioni delle viste dell'interfaccia utente (UI). Queste viste consentono di filtrare e visualizzare gli oggetti in un Management Pack.
<View Target="System.ConfigItem.Projector"
Enabled="true"
TypeID="SMConsole!GridViewType"
ID="AllProjectorsView"
Accessibility="Public">
<Category>NotUsed</Category>
<Data>
<Adapters>
<Adapter AdapterName="dataportal:EnterpriseManagementObjectAdaptor">
<AdapterAssembly>Microsoft.EnterpriseManagement.UI.SdkDataAccess</AdapterAssembly>
<AdapterType>
Microsoft.EnterpriseManagement.UI.SdkDataAccess.DataAdapters.EnterpriseManagementObjectAdapter
</AdapterType>
</Adapter>
<Adapter AdapterName="viewframework://adapters/ListDefault">
<AdapterAssembly>Microsoft.EnterpriseManagement.UI.ViewFramework</AdapterAssembly>
<AdapterType>Microsoft.EnterpriseManagement.UI.ViewFramework.ListSupportAdapter</AdapterType>
</Adapter>
</Adapters>
<ItemsSource>
<AdvancedListSupportClass DataTypeName="" AdapterName="viewframework://adapters/AdvancedList" FullUpdateAdapter="dataportal:EnterpriseManagementObjectAdapter" FullUpdateFrequency='1' DataSource="mom:ManagementGroup" IsRecurring="true" RecurrenceFrequency="5000" treaming='true' xmlns="clr-namespace:Microsoft.EnterpriseManagement.UI.ViewFramework;assembly=Microsoft.EnterpriseManagement.UI.ViewFramework" xmlns:av="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" >
<AdvancedListSupportClass.Parameters>
<QueryParameter Parameter="TargetClass" Value="System.ConfigItem.Projector"/>
</AdvancedListSupportClass.Parameters>
</AdvancedListSupportClass>
</ItemsSource>
<Criteria />
</Data>
<Presentation>
<Columns>
<mux:ColumnCollection xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:mux="https://schemas.microsoft.com/SystemCenter/Common/UI/Views/GridView" xmlns:s="clr-namespace:System;assembly=mscorlib">
<mux:Column Name="SerialNumber" DisplayMemberBinding="{Binding Path=SerialNumber}" Width="100" DisplayName="SerialNumber" Property="SerialNumber" DataType="s:Int32" />
<mux:Column Name="Location" DisplayMemberBinding="{Binding Path=Location}" Width="100" DisplayName="Location" Property="Location" DataType="s:String" />
<mux:Column Name="Condition" DisplayMemberBinding="{Binding Path=Condition.DisplayName}" Width="100" DisplayName="Condition" Property="Condition.DisplayName" DataType="s:String" />
<mux:Column Name="DisplayName" DisplayMemberBinding="{Binding Path=DisplayName}" Width="100" DisplayName="Display Name" Property="DisplayName" DataType="s:String" />
<mux:Column Name="OwnerUser" DisplayMemberBinding="{Binding Path=OwnerUser.DisplayName}" Width="100" DisplayName="SupportOwner" Property="OwnerUser.DisplayName" DataType="s:String" />
</mux:ColumnCollection>
</Columns>
</Presentation>
</View>
L'attributo Destinazione vista punta alla classe che verrà utilizzata dalla vista per la visualizzazione.
Nell'esempio precedente si fa riferimento al Management Pack Console di Service Manager. Questo Management Pack contiene la definizione di un tipo di vista utilizzato. In questa istanza viene definito il tipo di vista SMConsole!GridViewType.
AdvancedListSupportClass definisce un numero di parametro, il più importante dei quali è il parametro TargetClass. Impostare questo parametro sull'ID del ClassType che verrà visualizzato in questa vista. Per visualizzare le colonne che sono proprietà del ClassType, utilizzare l'elemento Column e associarlo all'attributo PropertyID.
L'attributo IsRecurring dell'elemento ListSupportClass determina se la vista si aggiornerà automaticamente. L'attributo RecurrenceFrequency definisce l'intervallo di aggiornamento in millisecondi. In questo esempio, l'intervallo di aggiornamento è impostato su 1 secondo, che tuttavia non è consigliabile per installazioni di produzione.
Definizione di cartelle
La definizione di una cartella determina la posizione nella struttura ad albero in cui viene visualizzata la vista. In questo esempio viene definito un elemento di configurazione in modo che sia adatto solo a posizionare la vista sotto la cartella esistente degli elementi di configurazione nell'area di lavoro Elementi di configurazione:
<Folders>
<Folder ID="Folder.Projectors" Accessibility="Public" ParentFolder="SMConfig!ServiceManager.Console.ConfigurationManagement.ConfigItem.Root" />
</Folders>
<FolderItems>
<FolderItem
ElementID="AllProjectorsView"
Folder="Folder.Projectors" />
</FolderItems>
Nell'esempio precedente, l'attributo ElementID contiene un riferimento alla vista che è stata creata. L'attributo Folder punta a una cartella Folders.Projectors, che a sua volta ha la sua radice come definita nell'area di lavoro Gestione configurazione della Console di Service Manager. Questa cartella radice è definita nel Management Pack Gestione configurazione.
L'elemento ImageReference esegue il mapping della vista creata in precedenza con un'icona definita nello spazio dei nomi Configuration Management:
<ImageReferences>
<ImageReference ElementID="Folder.Projectors" ImageID="SMConfig!ConfigItemImage16x16" />
<ImageReference ElementID="AllProjectorsView" ImageID="SMConfig!ConfigItemImage16x16" />
</ImageReferences>
Localizzazione utilizzando la sezione LanguagePacks
La sezione LanaguagePacks di un Management Pack definisce le risorse stringa e i mapping per gli elementi del Management Pack.
Nell'esempio, EnumerationValueProjectorCondition.Working deve apparire come In elaborazione. A questo scopo è necessario definire per ciascuno i nomi di visualizzazione:
Visualizza: Tutti i proiettori
Enumerazioni: in elaborazione, interrotte, in riparazione, nuove
<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>
È possibile creare ulteriori elementi LanguagePack, se necessario, per ogni lingua aggiuntiva desiderata. La stringa di visualizzazione corretta verrà visualizzata all'utente in base alle impostazioni locali.
Risorse
La sezione Resources di un Management Pack contiene i riferimento alle risorse binarie, contenute in assembly separati dal Management Pack. Nell'esempio seguente viene definita una risorsa che punta all'assembly, il quale contiene il modulo utilizzato dalla classe Proiettore:
<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" />
Estensioni della classe
Un'estensione della classe è una classe che aggiunge proprietà a una classe esistente. Nella maggior parte dei casi, la classe esistente si trova in un Management Pack bloccato. Nei casi in cui la classe esistente non è presente in un Management Pack bloccato, l'estensione della classe deve essere contenuta nello stesso Management Pack della classe in fase di estensione.
Un'estensione della classe eredita le proprietà di tutte le classi padre, ad esempio:
La classe A contiene una proprietà denominata Property1
La classe B deriva da (o estende) la classe A e disporrà di una proprietà denominata Property1. La proprietà viene ereditata dalla classe A, il padre o la classe base.
La definizione della classe B aggiunge una proprietà denominata Property2.
Qualsiasi estensione della classe che deriva dalla classe B erediterà Property1 e Property2.
Nell'esempio riportato di seguito viene illustrata una definizione di estensione della classe:
<TypeDefinitions>
<EntityTypes>
<ClassTypes>
<ClassType ID="IncidentManagmentPack.Extension" Accessibility="Public" Base="Incident!System.WorkItem.Incident" Hosted="false" IsExtensionType="true">
<Property ID="TimeOnIncident" Type="int" Key="false" />
</ClassType>
</ClassTypes>
</EntityTypes>
</TypeDefinitions>
Questa estensione della classe estende la classe System.WorkItem.Incident e aggiunge una nuova proprietà denominata TimeOnIncident.
La definizione di un'estensione della classe è simile a quella di una definizione della classe. Due attributi dell'elemento ClassType vengono utilizzati per specificare una definizione della classe: gli attributi Base e IsExtensionType.
L'attributo Base specifica l'ID della classe padre da cui deriva l'estensione della classe. In questo caso, il valore dell'attributo viene impostato su Incident!System.WorkItem.Incident. Questo valore comprende l'Alias del nome completo del Management Pack, che contiene la classe oggetto dell'estensione, un punto esclamativo e il nome della classe base. Per ulteriori informazioni, vedere l'esempio seguente.
L'attributo IsExtensionType definisce se la classe è un'estensione della classe base. Poiché TimeOnIncident è un'estensione della classe Indicent, la proprietà viene impostata su true:
IsExtensionType="true"
L'altra opzione è false, che indica che non si tratta di un'estensione di un'altra classe, ma di una nuova classe che erediterà dalla base. Poiché il valore predefinito è false, l'attributo non deve essere utilizzato se la classe non è un'estensione.
Esempio completo
Nell'esempio di codice riportato di seguito viene illustrato il Management Pack completo contenente l'estensione della classe.
<ManagementPack xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" ContentReadable="true" SchemaVersion="1.1">
<Manifest>
<Identity>
<ID>ServiceManager.Extension</ID>
<Version>1.0.0.0</Version>
</Identity>
<Name>ServiceManagerExtension</Name>
<References>
<Reference Alias="System">
<ID>System.Library</ID>
<Version>1.0.2780.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
<Reference Alias="Incident">
<ID>System.WorkItem.Incident.Library</ID>
<Version>1.0.2780.0</Version>
<PublicKeyToken>31bf3856ad364e35</PublicKeyToken>
</Reference>
</References>
</Manifest>
<TypeDefinitions>
<EntityTypes>
<ClassTypes>
<ClassType ID="IncidentManagmentPack.Extension" Accessibility="Public" Base="Incident!System.WorkItem.Incident" Hosted="false" Extension="true">
<Property ID="TimeOnIncident" Type="int" Key="false" />
</ClassType>
</ClassTypes>
</EntityTypes>
</TypeDefinitions>
</ManagementPack>
Importazione di un Management Pack utilizzando un cmdlet di Windows PowerShell
È possibile utilizzare il cmdlet di Windows PowerShell Import-SCSMManagementPack per importare un Management Pack di Service Manager, ad esempio:
Import-SCSMManagementPack MyServiceManager.ManagementPack.xml
Nel presente documento non viene descritto come importare e utilizzare i Management Pack in Console di Service Manager. Per ulteriori informazioni sull'utilizzo dei Management Pack in Console di Service Manager, consultare Using Management Packs in System Center 2012 - Service Manager (Uso dei Management Pack in System Center 2012 - Service Manager) .
Esempio: Management Pack completo
L'esempio di codice riportato di seguito indica il Management Pack completo usato per gli esempi di questo argomento, oltre alla definizione del modulo e del code-behind C# alla base dello stesso.
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>
Definizione del modulo
<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="https://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>
Code-behind del modulo
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);
}
}
}
Vedere anche
Modifiche allo schema comune di System Center
Moduli: Indicazioni generali e procedure consigliate