Sviluppo SMP
Un provider WMI
Le interfacce SMP (Storage Management Provider) sono basate su WMI. Sebbene sia possibile scrivere un SMP usando WMI v1, è consigliabile scrivere un provider WMI v2 usando C/C++. Non è consigliabile usare .NET Framework per lo sviluppo SMP perché alcune funzionalità importanti potrebbero non essere disponibili tramite la piattaforma .NET. In aggiunta:
- WMI v1 ha una dipendenza pesante da COM, che può essere difficile e dispendiosa in termini di tempo per imparare.
- WMI v2 si allinea più vicino agli standard di settore rispetto a WMI v1; WMI v2 usa WS-Management anziché DCOM.
- I provider possono usare errori/eventi migliori in WMI v2.
- I provider possono usare le estensioni e l'integrazione di PowerShell in WMI v2.
Elenco di controllo delle risorse di sviluppo
Articolo | Ufficio | Nota |
---|---|---|
File MOF della classe base: Storagewmi_provider.mof e tutti i file MOF che iniziano con "msft_" nel nome file. | Windows Software Development Kit (SDK) | In %SDK_Installed_Location%\Windows Kits\x.x\Include\um |
Altri file MOF necessari: qualifiers.mof e CIM_Error.mof | Distributed Management Task Force: http://dmtf.org/standards/cim | Questi file non sono definiti da Microsoft. |
File di intestazione: mi.h | Windows SDK | In %SDK_Installed_Location%\Windows Kits\x.x\Include\um |
Strumento di generazione dello scheletro del provider e file di .dll: Convert-MofToProvider.exe | Windows SDK | In %SDK_Installed_Location%\Windows Kits\x.x\bin\x64\ o ...\bin\x86 |
Strumento di registrazione provider: Register-CimProvider.exe | %OS_Install_Path%\Windows\System32\ |
Definizione MOF
Lo sviluppo SMP iniziale viene eseguito in tre semplici passaggi:
- Estendere il file MOF del provider.
- Generare uno scheletro del provider (o stub).
- Implementare gli stub.
Estensione del file MOF del provider
I file MOF SMP si trovano nella cartella di inclusione di Windows SDK. Sono preceduti da MSFT_*. Copiare questi file nella directory di sviluppo, insieme a CIM_Error.mof e qualifiers.mof. Ogni MOF definisce una o più classi astratte che formano la base per il modello SMP.
Analogamente ad altri linguaggi, non è possibile implementare direttamente una classe astratta. Deve essere derivato e implementato in una classe di implementazione separata. Creare un file MOF personalizzato e includere tutti i file MOF del provider pertinenti. Creare quindi una classe derivata per ognuna delle classi di base implementate dal provider. Assicurarsi di selezionare un prefisso univoco per le classi. Ad esempio, una società denominata "Contoso Storage Inc". può anteporre alle classi CONTOSO_* o CSI_*. Ad esempio, per MSFT_StorageProvider, un prefisso "CONTOSO_" restituirà CONTOSO_StorageProvider. A questo punto, la classe dovrebbe apparire come illustrato di seguito:
class CONTOSO_StorageProvider : MSFT_StorageProvider
{
...
}
Dopo aver creato queste classi scheletro, è necessario copiare tutte le dichiarazioni di metodo per i metodi che si prevede di implementare. Tutti i metodi che non vengono copiati (indipendentemente dal fatto che implementati o meno) restituisca MI_RESULT_NOT_SUPPORTED. Non è necessario copiare le proprietà della classe. Per ridurre al minimo gli errori di compilazione MOF, mantenere tutti i qualificatori dei metodi e dei parametri.
Assicurarsi infine di includere queste righe all'inizio del file MOF:
#pragma include("storagewmi_provider.mof")
#pragma include("msft_qualifiers.mof")
Al termine del passaggio 1, è ora possibile generare gli stub del provider usando Convert-MofToProvider.exe. Quando si specifica l'input per questo comando, assicurarsi di specificare solo le classi derivate. Le intestazioni per le classi di base vengono generate in modo implicito.
Vedere FILE MOF di esempio SMP.
Generazione scheletro provider
Gli sviluppatori SMP possono usare lo strumento di Convert-MofToProvider.exe dell'SDK WMI per generare uno scheletro del provider. Questo progetto include un elenco di file di intestazione e di origine C precompilato con metodi del provider WMI. Fornendo implementazioni per questi metodi, gli sviluppatori possono fornire supporto all'hardware di archiviazione.
Inserire tutti i file MOF dalla sezione "Elenco di controllo delle risorse di sviluppo" e i FILE MOF creati in una sola cartella. Usare quindi il comando seguente in un prompt dei comandi per generare lo scheletro del provider (vedere il testo della Guida per le opzioni più aggiornate):
Convert-MofToProvider.exe
-MofFile <path to your provider mof>
-ClassList <list of ALL classes listed in your mof, space separated>
-IncludePath <path to qualifiers.mof and CIM_Error.mof>
-SkipQualifiers
-SkipLocalize
Infine, includere il file di intestazione mi.h nel progetto di sviluppo.
Sequenza di sviluppo consigliata
StorageProvider, StorageSubSystem e VirtualDisk sono classi obbligatorie. A seconda delle funzionalità dell'array di archiviazione, StoragePool, ResiliencSetting, PhysicalDisk, MaskingSet, InitiatorId, TargetPort, TargetPortal, OffloadDataTransferSetting e StorageJob sono facoltativi.
Per semplificare il processo di sviluppo e test, è consigliabile seguire una sequenza di implementazione:
- EnumerateInstances: supporta le query di base per le classi necessarie StorageProvider, StorageSubSystem, VirtualDisk.
- GetInstance: GetInstance è necessaria per molte operazioni WMI, inclusa la chiamata al metodo.
- Create*/DeleteObject: implementa tutti i metodi di creazione ed eliminazione per gli oggetti supportati dal provider.
- Associazioni di oggetti: le associazioni consentono un attraversamento rapido e semplice tra gli oggetti della matrice. EnumerateInstances, AssociatorsOf e ReferencesOf nella classe associator sono necessari per l'implementazione. GetInstance nell'associatore non è obbligatorio, ma GetInstance negli oggetti di origine e di destinazione.
- Indicazioni: le indicazioni consentono al provider di notificare alle applicazioni di gestione una modifica.
- Resto dei metodi.
Registrazione del provider
Avviare un prompt dei comandi. Registrare il provider con il comando seguente:
Register-CimProvider.exe
–Namespace root\Microsoft\Windows\Storage\Providers
–ProviderName <name of your provider>
–Path <path to your provider’s dll file>