WMI en CIM
De laatste tijd hoor ik steeds meer de term CIM ofwel “Common Information Model”. CIM is kennelijk de opvolger van het voor mij bekende WMI (Windows Management Instrumentation). Tijd om mezelf een beetje te verdiepen in CIM. Wat zijn de grote verschillen? Bestaat WMI straks niet meer? Wat maak CIM beter dan WMI? Goeie vragen die beantwoord moeten worden toch? Let’s gooooo.
Laten we voor het gemak maar even beginnen met het bekende WMI. WMI is Microsoft zijn implementatie van MBEM (Web-Based Enterprise Management) en CIM (daar hebben we hem al) welke ontwikkeld zijn door de DMTF (Distributed Management Task Force). Tot zover dus nog niets nieuws aan CIM want WMI is o.a. een afgeleide van de CIM standaard.
WMI bestaat uit een reeks uitbreidingen van het Windows Driver Model en maakt het mogelijk om zowel lokaal als remote computerinformatie op te vragen van een Windows OS systeem. Scripttalen zoals Powershell en VBScript kunnen sinds Windows 2000, het moment dat WMI door Microsoft standaard geïmplementeerd is direct gebruik maken van WMI om zo gegevens op te vragen. Pré-Windows 2000 kon dit pas nadat WMI als optioneel pakket geïnstalleerd werd. WMI werd toen nog niet default geïnstalleerd op Windows systemen.
WMI voorziet het OS van een beheerde omgeving waardoor managementgegevens van afzonderlijke bron op een gestandaardiseerde en eenduidige manier kunnen worden opgehaald. WMI biedt hiervoor een eigen set van omgevingsonafhankelijke variabelen welke door managementtoepassingen zoals SNMP (Simple Network Management Protocol) en DMI (Desktop Management Interface) kunnen worden gebruikt.
WMI heeft vele verschillende providers. Een WMI provider is een set aan tools welke volgens het WMI model ontwikkeld is voor een specifieke toepassing. De Active Directory WMI Provider mapt AD aan WMI waardoor via WMI op een gestandaardiseerde manier informatie ontsloten kan worden vanuit AD. Er zijn vele WMI providers welke zich door de jaren ontwikkeld hebben. We kunnen niet alleen informatie opvragen via de WMI standaard maar we kunnen ook informatie wegschrijven. We kunnen dus DNS configureren met de WMI DNS Provider. Omdat Powershell direct gebruik kan maken van WMI kunnen we dus ook DNS aanpassingen maken via Powershell scripts welke WMI aanroepen. Het aantal WMI providers is sinds WindowsNT flink gegroeid. Dit komt omdat het maken van een WMI provider goed omschreven is via duidelijk gedefinieerde stappen. Omdat WMI steeds meer en meer gebruikt werd is WMI uitgegroeid tot een van de belangrijkste managementlagen. WMI wordt vaak gebruikt in combinatie met scripting en in achtergrondprocessen. Maar ook zijn er pakketten die de gebruiker via een GUI WMI laten aanspreken waardoor de noodzaak om te scripten is vervallen.

Ok, dat was WMI… maar nu iets meer informatie over Common Information Model (CIM). Zoals al gezegd is CIM is een open standaard die definieert hoe beheerde elementen binnen een IT-omgeving worden weergegeven als een gemeenschappelijke verzameling van objecten en de relatie tussen deze objecten.
Via CIM kan managementinformatie uitgewisseld worden van beheerde elementen. Let op, CIM biedt niet alleen de beheerde elementen en de bijbehorende managementinformatie, maar biedt ook middelen om deze elementen actief te controleren en te beheren. Door het gemeenschappelijke informatiemodel, kan beheersoftware eenmaal worden geschreven en gebruikt worden binnen verschillende implementaties omdat er via eenzelfde, gemeenschappelijk model gewerkt wordt. Dit voorkomt complexe en kostbare conversiebewerkingen of verlies van informatie.
CIM is een uitbreidbaar, object-oriented en platform onafhankelijk datamodel. Via WMI kan een ontwikkelaar de CIM gebruiken om klassen te maken die harde schijven, toepassingen, netwerkrouters of zelfs door de gebruiker gedefinieerde technologieën vertegenwoordigen. Door een CIM-klasse te bekijken en te wijzigen, kan een beheerder verschillende aspecten van de onderneming besturen. CIM hanteerd 3 verschillende niveaus waarmee zowel algemene als specifieke aspecten kunnen worden beschreven. Deze 3 verschillende klasseniveaus zijn:
Kern: Objecten welke op alle managementgebieden van toepassing zijn.
Gemeenschappelijk: Objecten welke van toepassing zijn op specifieke beheergebieden. Deze klasse zijn afhankelijk van een bepaalde implementatie of technologie welke aanwezig moet zijn.
Uitgebreide: De uitgebreide objectklasse bestaat uit technologie-specifieke toevoegingen op de gemeenschappelijke klassen.
De objectklassen maken op hun beurt weer onderscheid van objecten door deze net als een C++ of COM-klasse te verdelen in verschillende CIM-klassen. Deze CIM-klasse bevatten eigenschappen om gegevens en methoden te beschreven kunnen worden welke uiteindelijk weer het resulterende gedrag bepalen. Net als een set COM-klassen zijn de CIM-klassen niet gebonden aan een platform.
WMI bevat echter een uitbreiding op de CIM die de Microsoft Windows-besturingssysteemplatforms beschrijft.
De CIM gebruikt ook een techniek genaamd “associatie” om verschillende delen van het enterprise-model aan elkaar te koppelen en maakt gebruik van schema’s om verschillende beheeromgevingen te onderscheiden. Een ontwikkelaar kan een klasse uit een andere klasse afleiden. Een afgeleide klasse vertegenwoordigt is een speciaal geval en erft alle eigenschappen en methoden van bovenliggende klasse. Win32_ComputerSystem is zo’n klasse en erft hierbij alle eigenschappen van bijvoorbeeld de klasse “CIM_UnitaryComputerSystem”. De erf-relaties kunnen in beeld worden gebracht met 3 eigenschappen, namelijk:
Derivation: Dit is een array van strings die de gehele keten van overerving tot en met de hoofdklasse opsomt
Dynasty: Geeft de hoofdklasse weer.
SuperClass: Geeft bovenliggende klasse weer.
WMI ondersteunt ook associaties. Een koppeling is een relatie tussen twee of meerdere WMI-klassen. Een werkstation heeft bijvoorbeeld een processor. De WMI-associatieklasse Win32_ComputerSystemProcessor koppelt de werkstationklasse Win32_ComputerSystem aan de processorklasse Win32_Processor. Een associatieklasse bind echter niet altijd twee afhankelijke klassen samen. Het primaire doel van een associatieklasse het weergeven van relaties tussen klassen die niet noodzakelijkerwijs van elkaar afhankelijk zijn.
WMI kent ook het het concept van schema’s. In de context van WMI is een schema een groep van klassen die een bepaalde beheeromgeving beschrijven. De Microsoft Windows Software Development Kit (SDK) gebruikt twee schema’s: het CIM-schema en het Win32-schema. De CIM-schema-klassenamen beginnen met CIM_ en de Win32-schema-klassenamen beginnen met _Win32. Het CIM-schema bevat de definities voor de hoofd- en algemene klassen, terwijl het Win32-schema de definities bevat voor de uitgebreide klassen die in de Win32-omgeving voorkomen. Een externe leverancier kan echter zijn eigen schema’s maken om leverancier specifieke vereisten te beschrijven. Omdat schema’s oneindig uitbreidbaar zijn, kan een ontwikkelaar altijd nieuwe klassen toevoegen om nieuwe beheerde objecten in een bestaande omgeving te beschrijven. Voor de eenvoud kiezen de meeste leveranciers ervoor om schema’s te maken die eigenschappen van de CIM- of Win32-schema’s overnemen.
Tot zover het technische gedeelte. Bottomline is dus dat WMI een afgeleide is van o.a. de CIM en dat er relaties zijn tussen WMI en de CIM. WMI beschrijft echter alleen maar Windows schema’s. Op zich prima, WMI beschrijft Windows objecten en wordt beheerd door Microsoft. Ook is er een sterke groei van WMI providers en zijn veel beheerders gewend om WMI te gebruiken. Voor Windows management zou WMI dan ook perfect moeten zijn. Echter…
De CIM ontwikkeld zich ook steeds verder. CIM is ondertussen beter in staat om Windows volledig te beheren (uiteraard o.a. door effort van Microsoft). CIM commando’s zijn gemakkelijker en de uitkomst is meer voorspelbaar. Dan rijst de vraag… waarom zou je nog WMI gebruiken. WMI is een standaard welke een afgeleide is van de CIM en WMI is ook gedeeltelijk afhankelijk van de CIM. Het is in dat geval beter om alles te beheren volgens een standaard met minder afhankelijkheden. Dat dacht Microsoft ook! Daarom is Microsoft v.a. Windows Server 2012 begonnen met het uitfaseren van WMI. V.a. 2012R2 zijn de volgende WMI services deprecated en worden dus niet verder ontwikkeld:
- WMI SNMP (SNMP is ook deprecated)
- WMI Win32_ServerFeature API
- WMI Active Directory Provider
- WMI Namespace V1.0
- Wmic – WMI Command-line tool
V.a. 2016 zijn er nog meer WMI onderdelen deprecated zoals IIS6 WMI Compatibility (Web-WMI). WMI zal dus langzaal volledig uitgefaseerd worden. Microsoft raad aan om in plaats van WMI de CIM cmdlets (in Powershell) te gebruiken.). De syntax van CIM cmdlets is gemakkelijker en de output is duidelijker. Het “PowerShell Project” is zelfs ooit gestart als een vervanger voor WMI.
Microsoft zet dus in op de ontwikkeling van CIM cmdlets. Een ander voordeel van de CIM cmdlets is dat deze MS-MAN (WinRM) gebruiken voor toegang tot remote machines. Dus wanneer “Powershell Remoting” enabled is dan heb je toegang tot die machine via een CIM sessie. WMI gebruikte DCOM (Distributed Component Object Model) welke door de Windows firewalls en vele andere firewalls geblokkeerd wordt. Met CIM cmdlets dus minder configuratiewerk voordat je een machine v.a. afstand kunt beheren. De enige reden om nog WMI te gebruiken is wanneer een machine nog Powershell V2 (maar die had natuurlijk al lang geupgrade moeten zijn). Powershell V6 ondersteund alleen nog maar CIM cmdlets en geen WMI cmdlets meer.
