Windows Management Instrumentation (WMI), première partie

Laurent Dardenne

Cet article a pour objectif d'aborder les principes de base de WMI et sa mise en œuvre sous Delphi. ♪

- Titre : Windows Management Instrumentation (WMI), première partie

- Auteur : Laurent Dardenne

- Parution : 26 juin 2004

- Public visé :

- Licence : Copyright ® 2004 Laurent Dardenne. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Avant-propos

- II. Introduction

- III. Définitions diverses

- III-A. Espace de nom

- III-B. Chemin d'objet d'un espace de nom WMI

- III-C. Chemin d'objet de classe

- III-D. Chemin d'objet d'instance

- III-D-1. Complet

- III-D-2. Relatif

- III-D-3. Relatif avec un simple nom

- III-D-4. Relatif avec de multiples valeurs

- III-D-5. Relatif pour une classe singleton

- III-E. Instance

- III-F. Provider

- III-G. Modes d'appel des méthodes

- III-G-1. Mode synchrone

- III-G-2. Mode asynchrone

- III-G-3. Mode semi-synchrone

- III-H. Événement

- III-H-1. Réception d'un évènement de WMI

- III-H-2. Réception d'évènements

- III-H-2-a. Client d'évènement provisoire

- III-H-2-b. Client d'évènement permanent

- III-H-2-c. Mise à disposition d'évènements et utilisation de clients standards

- III-I. Authentification

- III-J. Impersonation

- III-J-1. Utilisation de la base de registre pour définir le niveau d'usurpation d'identité

- III-K. Windows Management Instrumentation Query Language

- III-L. Fichier MOF

- IV. Meta-schémas

- IV-A. Types de Classe CIM

- IV-A-1. Classes abstraite (abstract class)

- IV-A-2. Classe statique

- IV-A-3. Classe dynamique

- IV-A-4. Classe d'association

- IV-B. Propriétés

- IV-C. Méthodes

- IV-D. Trigger

- IV-E. Qualificateur de propriété WmiEventTrigger(" data-item-name")

- IV-F. Indication

- IV-G. Référence

- IV-H. Schéma

- IV-I. Qualificateurs

- IV-J. Quel genre d'information les qualificateurs fournissent-ils ?

- IV-J-1. Qualificateurs de classe

- IV-J-2. Qualificateurs de propriété

- IV-J-3. Qualificateurs de méthode

- IV-K. Extension du schéma

- IV-L. WMI Tester

- IV-L-1. Requête WQL

- V. Paramétrage WMI et outils divers

- V-A. Configurer les paramètres de WMI

- V-A-1. Accorder des autorisations à des utilisateurs ou à des groupes, et définir des niveaux d'autorisation

- V-A-2. Configurer l'enregistrement des erreurs

- V-A-3. Effectuer une sauvegarde de l'espace de stockage

- V-A-4. Modifier l'espace de noms de script

- V-A-5. Se connecter en tant qu'un autre utilisateur

- V-B. Outils

- V-C. WMI et ODBC

- V-D. Contrôles ActiveX additionnels

- V-E. WbemDump

- V-F. WMIC

- VI. Delphi

- VI-A. Configurer la palette de composants Delphi 5

- VI-B. Créer une application WMI

- VII. Interface IEnumVARIANT

- VIII. Objet SWbemlocator

- VIII-A. ConnectServer

- VIII-B. Security

- IX. Objet SWbemSecurity

- X. Objet SWbemServices

- X-A. GET

- X-B. InstancesOf

- X-C. ExecQuery

- XI. Objet SWbemObject

- XII. Objet SWbemObjectSet

- XIII. Objet SWbemXXXXXSet

- XIV. Objet SWbemProperty

- XV. Objet SWbemObjectPath

- XVI. Objet SWbemDateTime

- XVII. Objet ISWbemNamedValue

- XVIII. Objet SWbemPrivilege

- XIX. Objet SwbemQualifier

- XX. Objet SWbemMethod

- XXI. Objet SWbemEventSource

- XXII. Objet SWbemLastError

- XXII-A. Codes d'erreur

- XXIII. Objet SwbemSink

- XXIII-A. Cancel

- XXIII-B. Évènements

- XXIV. Objet SWbemServicesEx

- XXV. Objet SWbemObjectEx

- XXVI. Objet SWbemRefresher

- XXVII. Objet SWbemRefreshableItem

- XXVIII. Annexe

- XXVIII-A. Exemple

- XXVIII-B. Références d'ouvrages

- XXIX. WMI, seconde partie

I - Avant-propos

Testé avec Delphi 5 sous XP pro.
Version 1.1
Dernière mise à jour, le 06/07/2004

II - Introduction

Vous trouverez une introduction sur le principe de WMI ici.

Cet article contient de nombreux liens vers la documentation du SDK WMI.

WMI est basé sur la technologie COM, l'accès et la manipulation de WMI se font par l'intermédiaire des objets de scripting SWbemxxxx qui encapsulent les appels COM et par certaines interfaces IWbemxxxx.

Web-Based Enterprise Management (WBEM) est une initiative de différents constructeurs afin de développer des moyens normalisés et non- propriétaires permettant d'accéder et de partager l'information liée à l'infrastructure (matériel et logiciel) d'un réseau d'entreprise.

(c) Microsoft, SDK.

Nous utiliserons sous Delphi le scripting qui facilite la mise en œuvre de WMI.

III - Définitions diverses

III-A - Espace de nom

Les classes CIM (Commun Information Model) sont organisées dans des espaces de nom. Les espaces de nom représentent le mécanisme de structuration des informations employées dans le référentiel CIM, ils contrôlent la portée et la visibilité des définitions de classe des ressources gérées.

Chaque espace de nom du référentiel CIM contient un groupe logique de classes représentant une technologie spécifique ou un domaine de gestion.

Les espaces de nom ne sont pas des emplacements physiques; ce sont plutôt des bases de données logiques. Ils contiennent des classes et des instances spécifiques.

Chaque installation de WMI contient un espace de nom Root, qui contient uniquement d'autres espaces de nom. L'espace de nom Root contient les espaces de nom Default, Security, CIMv2, et tous les espaces de nom définis par l'utilisateur.

Exemple de classe : Win32_ComputerSystem dans l'espace de nom CIMV2 accessible via Root\CIMV2.

Toutes les classes dans un espace de nom doivent avoir un nom unique de classe, et des classes dans un espace de nom ne peuvent pas être dérivées dans un autre espace de nom, c'est pourquoi vous trouverez dupliquées les classes system, core, et les common class dans de multiples espaces de nom.

En d'autres termes, si vous voulez définir une classe Camion dérivée d'une classe Véhicule, la classe Véhicule doit être définie dans le même espace de nom.

La plupart des classes que Windows gère résident dans l'espace de nom root\CIMv2. Cependant, root\CIMv2 n'est pas le seul espace de nom auquel vous devez prêter attention, comme suggéré sur le schéma suivant.

(c) Microsoft, SDK.

Par exemple les providers de l'event log, de Windows Installer, et de Win32 stockent toutes leurs définitions de classe des ressources gérées dans l'espace de nom Root\CIMV2.

D'autre part, le provider de la base de registre stocke ses définitions de classe dans l'espace de nom Root\Default. Et le nouveau provider du serveur DNS de Windows 2003 stocke ses définitions de classe des ressources gérées dans l'espace de nom Root\MicrosoftDNS.

Àvoir

III-B - Chemin d'objet d'un espace de nom WMI

Un chemin d'objet d'un espace de nom décrit l'emplacement d'un espace de nom particulier sur un serveur. Il contient un nom de serveur et un nom d'espace de nom, et est formaté soit en utilisant le slash ou le backslash. Le nom de serveur spécifie le nom réseau de l'ordinateur où l'espace de nom est situé :

1. \\Serveur\EspaceDeNom ou //Serveur/EspaceDeNom

Si Serveur est l'ordinateur local, vous pouvez utiliser un simple point à la place du nom de serveur : \\.\EspaceDeNom

Le nom EspaceDeNom spécifie un espace de nom valide. Un espace de nom est représenté par une chaîne hiérarchique contenant les éléments délimités par un simple backslash, tel que root\cimv2. Vous ne pouvez pas utiliser le slash dans un nom d'espace de nom, la syntaxe suivante n'est pas autorisée : root/cimv2.

III-C - Chemin d'objet de classe

Un chemin d'objet de classe décrit l'emplacement d'une classe dans un espace de nom.

Vous pouvez utiliser soit un nom de chemin complet soit un nom de chemin relatif.

Un chemin complet de classe ajoute le nom de la classe à un chemin d'espace de nom.

1. \\Admin\Root\CimV2:Win32_LogicalDisk

L'exemple précédent décrit l'emplacement de la classe Win32_LogicalDisk dans l'espace de nom \root\cimv2 sur le serveur nommé Admin.

Un chemin de classe relatif représente une classe qui se trouve dans l'espace de nom courant.

Un chemin de classe relatif d'une classe contient seulement le nom de classe.

1. Win32_LogicalDisk

Cet exemple suppose que la classe Win32_LogicalDisk se trouve dans l'espace de nom courant.

III-D - Chemin d'objet d'instance

Un chemin d'objet d'instance décrit l'emplacement d'une instance d'une classe donnée dans un espace de nom spécifique. Vous pouvez avoir plusieurs types de chemin d'objet

III-D-1 - Complet

Un chemin complet d'objet d'instance ajoute le nom et la valeur d'une propriété de la classe à un chemin complet d'objet de classe.

1. \\Server\Namespace:Class.KeyName=" KeyValue"

Exemple  : "\\Machine\root\cimv2:Win32_Directory.Name="c:\windows\system32\wbem"

III-D-2 - Relatif

Un chemin d'instance relatif se rapporte à une instance située dans l'espace de nom courant sur le serveur courant. Le chemin relatif comprend le nom de classe suivi des noms et des valeurs de cette instance.

1. MyClass.MyProp="e:"

III-D-3 - Relatif avec un simple nom

Pour des classes avec seulement une propriété indiquée par la valeur, vous pouvez omettre le nom de la propriété.

1. MyClass="e:"

III-D-4 - Relatif avec de multiples valeurs

Utiliser une virgule pour séparer les valeurs.

1. MyOtherClass.FirstKey=1,SecondKey=2

III-D-5 - Relatif pour une classe singleton

Le chemin relatif pour une classe singleton consiste à utiliser la notation"=@".

1. MySingletonClass=@

III-E - Instance

Une instance représente un objet ou un élément du monde réel. Une instance est toujours créée à partir d'une classe représentant le template de l'objet réel. Par exemple, une instance de disque représente un disque réel et son template est défini par la classe Disk.

III-F - Provider

Un provider (fournisseur de données) est un objet COM qui agit en tant qu'intermédiaire entre WMI et un objet géré. Au travers de WMI, une application peut demander et envoyer des informations vers l'objet géré. Il expose les classes WMI.

Par exemple, une application peut modifier et rechercher des informations de la base de registre via WMI par l'intermédiaire du provider nommé System Registry Provider.

Il existe plusieurs types de provider :

- Provider d'instance
cf. classe __InstanceProviderRegistration

- Provider de classe
cf. classe __ClassProviderRegistration

- Provider de méthode
cf. classe __MethodProviderRegistration

- Provider de propriétés
cf. classe __PropertyProviderRegistration

- Provider d'évènement
cf. classe __EventProviderRegistration

- Provider d'évènement client
cf. classe __EventConsumerProviderRegistration

III-G - Modes d'appel des méthodes

III-G-1 - Mode synchrone

Le mode synchrone se produit quand le programme ou le script attend jusqu'à ce que l'appel d'une méthode renvoie une collection d'objets de type SWbemObjectSet. WMI construit cette collection en mémoire avant de renvoyer l'objet de type collection au programme appelant.

Le mode synchrone peut avoir un impact sur les performances d'un programme ou d'un script. Par exemple, la recherche synchrone de milliers d'évènements dans l'Event log nécessite un long moment et beaucoup de mémoire, car WMI crée un objet pour chaqueévènement évènement puis insère ces objets dans une collection avant de la retourner à la méthode appelante.

Vous devriez appeler les méthodes en mode synchrone seulement si elles renvoient peu de données. Les méthodes suivantes de SWbemServices peuvent s'appeler sans risque en mode synchrone :

- SWbemServices.Delete

- SWbemServices.ExecMethod

- SWbemServices.Get

Toutes les méthodes de SwbemServices ne comportant pas le mot " Async" dans leur nom peuvent s'appeler en mode synchrone en renseignant le plus souvent le paramètre iFlags avec la valeur wbemFlagReturnWhenComplete.

III-G-2 - Mode asynchrone

Le mode asynchrone se produit quand le programme ou le script continue à s'exécuter après avoir appelé la méthode. WMI renvoie chaque objet créé vers un objet de type SwbemSink (collecteur de données), et ce, pour tous les objets de la méthode appelée. Le script ou programme appelant doit utiliser un objet de SWbemSink et un gestionnaire d'évènement de type SWbemSink.OnObjectReady pour traiter les objets retournés.

Alors que ce mode d'exécution n'a pas les impacts sur les performances et les ressources du mode synchrone, le mode asynchrone peut impacter la sécurité, car les résultats stockés dans l'objet de type SWbemSink peuvent ne pas provenir du programme ou du script appelant. WMI abaisse le niveau d'authentification sur l'objet de type SWbemSink jusqu'à ce que la méthode réussisse. Pour atténuer ces risques de sécurité

Le mode asynchrone est utilisé pour les méthodes suivantes :

- SWbemServices.AssociatorsOfAsync

- SWbemServices.DeleteAsync

- SWbemServices.ExecMethodAsync

- SWbemServices.ExecNotificationQueryAsync

- SWbemServices.ExecQueryAsync

- SWbemServices.InstancesOfAsync

- SWbemServices.ReferencesToAsync

- SWbemServices.SubclassesOfAsync

III-G-3 - Mode semi-synchrone

Le mode semi-synchrone est semblable au mode asynchrone, car le programme ou le script continue son déroulement après avoir appelé la méthode. En mode semi-synchrone, WMI recherche les objets en tâche de fond tant que votre script ou programme continue de fonctionner. WMI renvoie chaque objet retourné par la méthode appelé, juste après que l'objet soit créé.

Puisque WMI contrôle l'objet, le mode semi-synchrone est plus sécurisé que le mode asynchrone. Cependant si vous employez le mode semi-synchrone avec plus de 1000 instances, la récupération des instances peut monopoliser les ressources disponibles et donc dégrader les performances du programme ou du script et de l'ordinateur l'exécutant. Chaque objet utilise les ressources nécessaires jusqu'à ce que la mémoire soit libérée.

Pour travailler dans ce mode, vous pouvez appeler la méthode en renseignant le paramètre iFlags avec wbemFlagForwardOnly + wbemFlagReturnImmediately pour signaler à WMI de renvoyer une collection appelée 'forward-only'. Une collection de ce type élimine le problème de performance provoqué par un grand nombre de données, en libérant la mémoire après que l'objet soit énuméré.

À la différence d'une collection SwbemObjectSet standard, WMI ne maintient pas de références sur les objets de la collection. L'inconvénient étant que l'on ne peut plus appeler la méthode SwbemObject.Clone sur cet objet.

N'importe quelle méthode de SWbemServices qui ne peut pas s'appeler soit en mode synchrone soit en mode asynchrone s'appellera en mode semi-synchrone.

Les méthodes suivantes sont appelées en mode semi-synchrone :

- SWbemServices.AssociatorsOf

- SWbemServices.Delete

- SWbemServices.ExecMethod

- SWbemServices.ExecNotificationQuery

- SWbemServices.ExecQuery

- SWbemServices.Get

- SWbemServices.InstancesOf

- SWbemServices.ReferencesTo

- SWbemServices.SubclassesOf

- SWbemServices.Put

III-H - Événement

Les évènements de WMI sont des occurrences qui correspondent aux situations qui surviennent soit dans le monde réel, soit lors de changements dans le référentiel CIM géré par le manager d'objet CIM (CIMOM , Common Information Model Object Manager).

Après un évènement, une notification le concernant est générée soit par un provider d'évènement, soit par le manager d'objet CIM lui-même. Les notifications sont fournies par le manager d'objet CIM à un ou plusieurs destinataires enregistrés connus comme clients d'évènements.

- Les providers d'évènement envoient des notifications en réponse aux occurrences d'évènement, que des clients soient ou non enregistrés.

- Les clients d'évènement s'enregistrent pour recevoir des notifications sans savoir comment et par qui les évènements et leurs notifications correspondantes sont fournis. Les clients s'enregistrent pour recevoir des notifications en indiquant un filtre, créé en utilisant le langage d'interrogation WQL de WMI. La requête décrit les conditions dans lesquelles le client est configuré pour recevoir une notification.

III-H-1 - Réception d'un évènement de WMI

WMI contient une infrastructure d'évènement qui génère des notifications lors de changements de données et de services de WMI.

Par exemple, si une application crée un nouvel objet dans le référentiel CIM de WMI, WMI génère un évènement nommé '__ InstanceCreationEvent'.

Vous pouvez créer une requête semi-synchrone ou asynchrone pour surveiller les changements dans l' Event logs, la création de processus, le statut d'un service, la disponibilité d'un ordinateur ou l'espace libre d'un disque, etc.

La notification d'un changement sur les données standard de WMI s'appelle un évènement intrinsèque.

Par exemple les évènements '__ InstanceCreationEvent' ou '__ NamespaceDeletionEvent' sont des évènements intrinsèques.

La notification d'un changement qu'un provider fait pour définir un évènement le concernant s'appelle un évènement extrinsèque.
Par exemple, les providers System Registry, Power Management Event, et Win32 définissent leurs propres évènements.

Typiquement, une classe qui définit un évènement a un nom se terminant par le mot 'Event '. Par exemple, le provider Win32 a la classe Win32_NTLogEvent. Quand un provider possède une classe d'évènement, vous effectuez une requête pour un évènement intrinsèque.

La requête suivante

SELECT all FROM __InstanceCreationEvent
WHERE TargetInstance ISA 'Win32_NTLogEvent'

est une requête sous Windows NT et 2000 pour l'évènement intrinsèque '__InstanceCreationEvent' de la classe d'évènement Win32_NTLogEvent.

Notez que le privilège SeSecurityPrivilege doit être positionné.

La requête suivante

SELECT * FROM RegistryValueChangeEvent
WHERE Hive='HKEY_LOCAL_MACHINE' and
Keypath='SYSTEM\\ControlSet001\\Control' and
Valuename = 'CurrentUser'"

montre l'évènement extrinsèque '__ RegistryValueChangeEvent' du provider de base de registre. Le script crée un client provisoire en appelant la méthode SWbemServices.ExecNotificationQueryAsync, et reçoit des évènements seulement lorsque le script est exécuté.

Notez que cet appel est asynchrone et peut être sécurisé seulement sous Windows Server 2003.

III-H-2 - Réception d'évènements

Vous pouvez surveiller ou utiliser des évènements de manière temporaire ou permanente tant qu'un script ou une application fonctionne.

III-H-2-a - Client d'évènement provisoire

Un client d'évènement provisoire (Temporary event consumers) est une application WMI cliente qui reçoit un évènement de WMI. WMI inclut une interface unique que vous pouvez utiliser pour indiquer les évènements que WMI envoie à une application cliente. Un client d'évènement provisoire est considéré comme provisoire parce que cela fonctionne seulement à partir du moment où l'application est exécutée par un utilisateur.

Pour plus d'information

III-H-2-b - Client d'évènement permanent

Un client d'évènement permanent est un objet COM qui peut recevoir un évènement de WMI à tout moment. Un client d'évènement permanent emploie un ensemble d'objets persistants et de filtres pour capturer un évènement de WMI. Comme pour un client d'évènement provisoire, vous initialisez une série d'objets et de filtres WMI qui capturent un évènement de WMI. Quand un évènement correspondant à un filtre se produit, WMI charge le client d'évènement permanent et l'informe au sujet de l'évènement. Puisqu'un client permanent est implémenté dans le référentiel WMI et qu'un fichier exécutable est enregistré dans WMI, la livraison d'un évènement lors du reboot du système d'exploitation continue tant que WMI fonctionne.

Pour plus d'information

Les scripts ou les applications qui reçoivent des évènements ont des considérations spéciales concernant la sécurité.

III-H-2-c - Mise à disposition d'évènements et utilisation de clients standards

Un provider d'évènement est un composant COM qui envoie un évènement à WMI. Vous pouvez créer un provider d'évènement pour envoyer un évènement dans une application Delphi, C++ ou C#. La plupart des providers d'évènement gèrent un objet pour WMI, par exemple une application ou un élément matériel.

Une application ou un script peut employer un provider d'évènement intégré à WMI que proposent les classes clientes standards préinstallées. Chaque classe cliente standard répond à un évènement par une action différente en envoyant un E-mail ou en exécutant un script. Vous n'avez pas à écrire le code du provider pour employer une classe cliente standard permettant de créer un client d'évènement permanent.

Un évènement synchronisé ou répétitif est un évènement qui se produit à un moment prédéterminé. WMI fournit les deux manières suivantes pour créer un évènement synchronisé ou répétitif dans vos applications.

- L'infrastructure standard d'évènement de Microsoft.

- Une classe spécialisée de timer.

III-I - Authentification

L'authentification signifie qu'un processus s'identifie à l'autre. Typiquement, l'authentification est une identification par mot de passe.

Le client doit fournir des informations d'identification pour permettre aux serveurs de vérifier cette entité. Une fois que l'identité est connue, l'application peut autoriser l'entité à accéder aux ressources du système.

III-J - Impersonation

Le principe d'usurpation d'identité (impersonation en anglais) est local, et correspond au concept de délégation, lorsqu'il s'opère entre machines physiques différentes. Il détermine les droits qu'un client accorde à un serveur pour appeler différents processus.

Comme l'emprunt d'identité (il s'agit de se faire passer pour quelqu'un d'autre, prétendre être quelqu'un d'autre), ce dispositif permet à un processus serveur de s'exécuter en utilisant les informations d'identification du client. Cependant, la délégation va plus loin en autorisant le processus serveur à appeler d'autres ordinateurs au nom du client.

L'usurpation d'identité est la capacité d'un thread de s'exécuter dans un contexte de sécurité qui est différent du contexte du processus qui possède le thread. En s'exécutant dans le contexte de sécurité du client, le serveur " est", à un certain niveau, le client.

Le thread serveur emploie un token d'accès représentant les droits du client pour obtenir l'accès aux objets auxquels le client a accès.

La principale raison de l'usurpation d'identité est d'effectuer des contrôles d'accès afin d'être exécuté avec l'identité du client. Employer l'identité du client pour des contrôles d'accès permet de réduire ou d'élargir l'accès, selon ce que le client a la permission de faire.

Par exemple, supposez qu'un serveur de fichiers possède des dossiers contenant des informations confidentielles et que chacun de ces dossiers soit protégé par un ACL. Pour empêcher un client d'obtenir l'accès non autorisé aux informations dans ces dossiers, le serveur peut se faire passer pour le client avant d'accéder aux dossiers.

Àvoir

III-J-1 - Utilisation de la base de registre pour définir le niveau d'usurpation d'identité

Si vous avez les droits sur la clé de registre suivante, vous pourrez modifier le niveau d'usurpation d'identité par défaut. Cette clé spécifie avec quel niveau d'usurpation d'identité les scripts WMI sont exécutés jusqu'à ce qu'un autre soit spécifié.

Chemin de la clé :

1. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\Scripting\Default Impersonation Level

Par défaut cette clé contient la valeur 3.

Quelques providers peuvent nécessiter un niveau de sécurité plus élevé.

III-K - Windows Management Instrumentation Query Language

Le langage d'interrogation de WMI (WQL) est un sous-ensemble du langage d'interrogation structuré SQL ANSI comportant quelques changements sémantiques mineurs. À la différence de SQL, WQL interroge des classes et non des tables, et retourne des classes et/ou des instances au lieu de lignes. Attention WQL n'est pas du SQL mais y ressemble.

WQL est un langage d'interrogation uniquement (Read-Only), on ne peut pas modifier le référentiel CIM par les instructions Insert, Update et Delete, elles ne sont donc pas permises.

WQL fournit des moyens de choisir quelles propriétés sont intéressantes et il peut être utilisé pour réduire le nombre de propriétés retournées.

Il existe trois types d'interrogations :

- Data queries  : retrouve des instances de classes et des informations concernant les associations d'instances.

- Schema queries  : retrouve des définitions de classes et des informations concernant les associations de schéma.

- Event queries  : utilisé par des clients d'évènements (temporaires ou permanents). Permet de filtrer les évènements.

Certains opérateurs WQL ne peuvent être utilisés qu'avec certains types d'interrogation, par exemple l'opérateur LIKE ne peut être utilisé qu'avec des interrogations de type Data queries.

La requête suivante interroge le fichier " Application" de l'event log de Windows NT à partir de toutes les instances de Win32_NTLogEvent.

wmiObjectSet := wmiServices.ExecQuery('SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'Application'',
'WQL',
wbemFlagReturnImmediately, nil);

Note : L'installation du produit SMS de Microsoft ajoute des opérateurs au langage WQL.

III-L - Fichier MOF

Le langage Managed Object Format (MOF) permet, entre autres, de décrire une nouvelle classe CIM, il est basé sur le langage Interface Definition Language (IDL), le langage de description d'interfaces COM.

Un développeur peut par exemple écrire une classe CIM qui décrit un bras de robot d'une chaîne de fabrication ou une nouvelle application de traitement de texte.

Une fois que le développeur à réaliser la description de classe CIM, le compilateur MOF
(C:\WINDOWS\system32\wbem\mofcomp.exe) analyse dans le fichier .mof les classes CIM respectives puis ajoute ces classes dans le référentiel WMI. De là, une application ou un provider peut accéder aux classes CIM par les interfaces COM standard.

Le compilateur MOF est intégré à la distribution de WMI et est installé par défaut sur Windows Millennium, 2000 et XP.

Core WMI :
95,98 et 98 SE
Windows NT4

Vous trouverez un exemple de fichier .mof ici

Attention certaines classes ne sont disponibles que sur certaines plateformes telles que W2K ou XP ou encore uniquement sous Windows Server 2003. Cf SDK WMI

IV - Meta-schémas

Le métaschéma est une définition formelle du modèle. Il définit les limites employées pour exprimer le modèle, son utilisation et sa sémantique. UML est employé pour définir la structure du métaschéma.

Meta-schémas issue des spécifications de CIM V2.8.1

(c) Distributed Management Task Force, Inc.

Détails du schéma sur le site de l'organisation DTMF

WMI est l'implémentation par Microsoft de CIM pour la plateforme Windows.

D'autres schémas :

CIM Schema: Version 2.8.1 (Final)
Tutorial Microsoft WMI, chapitre 'CIM Structure and Navigation'

IV-A - Types de Classe CIM

IV-A-1 - Classes abstraite (abstract class)

Une classe abstraite est un template employé pour définir de nouvelles classes.

Elles servent de classes de base à d'autres classes abstraites, statiques, et dynamiques.

Presque toutes les classes de WMI sont construites ou dérivées d'une ou plusieurs classes abstraites.

Vous pouvez identifier une classe abstraite en examinant le qualificateur Abstract de la classe.
Une classe abstraite doit définir le qualificateur Abstract et renseigner sa valeur à True.

L'utilisation la plus courante du type classe abstraite est la définition du noyau et des classes communes (core and common class). Elles sont rarement utilisées dans des scripts, car vous ne pouvez pas retrouver d'instances de classe abstraite.

IV-A-2 - Classe statique

Une classe statique définit les données qui sont physiquement stockées dans le référentiel CIM.

Les classes statiques sont instanciées comme les classes dynamiques. Cependant, elles sont stockées dans le référentiel CIM. De même, des instances de classe statiques sont recherchées directement dans le référentiel CIM. Elles n'emploient pas de Provider.

Vous pouvez identifier une classe statique en examinant les qualificateurs de classe. Cependant, à la différence des classes abstraites et dynamiques qui sont identifiées par la présence d'un qualificateur spécifique, les classes statiques sont identifiées par l'absence des qualificateurs Abstract et Dynamic.

L'utilisation la plus courante du type classe statique est la définition de classes système (system classes). Les classes statiques sont rarement employées dans des scripts WMI.

IV-A-3 - Classe dynamique

Une classe dynamique est une classe qui modélise une ressource gérée par WMI et qui est retrouvée dynamiquement par un provider.

Vous pouvez identifier une classe dynamique en examinant le qualificateur Dynamic de la classe. Une classe dynamique doit définir le qualificateur Dynamic et renseigner sa valeur à True.

L'utilisation la plus courante du type de classe dynamique est dans la définition de classes étendues. Les classes dynamiques sont les types de classes les plus utilisées dans les scripts WMI.

IV-A-4 - Classe d'association

Un quatrième type de classe, connu sous le nom de classe d'association, est également supporté. Une classe d'association est une classe abstraite, statique ou dynamique qui décrit un rapport entre deux classes.

La classe de Win32_SystemServices est un exemple d'une classe dynamique d'association qui décrit le rapport entre un ordinateur et les services fonctionnant sur l'ordinateur.

Vous pouvez identifier une classe d'association en examinant le qualificateur Association de la classe. Une classe d'association abstraite, statique ou dynamique doit définir le qualificateur Association et renseigner sa valeur à True.

IV-B - Propriétés

Les propriétés sont des noms qui décrivent une ressource gérée. Les classes utilisent des propriétés pour décrire des choses comme l'identité, la configuration, et l'état d'une ressource gérée. Par exemple les services (Win32_Service) ont un nom, un nom d'affichage, une description, un type de démarrage, et un statut.

Chaque propriété a un nom, un type, et des qualificateurs de propriété facultatifs.

Certaines propriétés peuvent être des clés permettant l'unicité sur des noms d'instance par exemple.

IV-C - Méthodes

Les méthodes effectuent une action sur une ressource gérée.

Exemple : Que pouvez-vous faire avec des services ? Vous pouvez les démarrer, les arrêter, les mettre en pause.

Chaque méthode a un nom, un type de retour, des paramètres facultatifs, et des qualificateurs de méthode facultatifs. Certaines classes peuvent ne pas définir de méthode.

IV-D - Trigger

Un trigger est une reconnaissance d'un changement d'état (comme la création, la suppression, la mise à jour ou l'accès) d'une instance de classe ou la mise à jour ou l'accès à une propriété.

Note  : L'implémentation de WMI n'a pas d'objet représentant explicitement un trigger.

Les triggers sont implicites soit lors d'opérations sur les objets de base du système (création, suppression, et modification de classes, d'instances et d'espaces de nom), soit lors d'évènements dans l'environnement géré.

IV-E - Qualificateur de propriété WmiEventTrigger(" data-item-name")

Indique le nom d'une donnée dans un bloc d'évènement qu'un client WMI peut renseigner pour définir la valeur du trigger d'évènement.

Exemple : si l'évènement TooHot est qualifié avec WmiEventTrigger("TooHotTemperature"), un client WMI pourrait renseigner la propriété TooHotTemperature pour indiquer au driver d'envoyer l'évènement TooHot quand le matériel a atteint la valeur définie par l'utilisateur.

IV-F - Indication

Une indication est une instance d'objet créé en raison de l'occurrence d'un évènement. Puisque les indications sont des sous-types de classe, elles peuvent avoir des propriétés et des méthodes, et être ordonnées dans un type hiérarchique.

Une indication a typiquement comme conséquence un évènement.

Dans l'exemple d'une classe Service, lorsque le service s'arrête et que le trigger s'exécute, il a comme conséquence une indication qui sert de notification indiquant que le service est arrêté.

IV-G - Référence

Une référence est :

- Un type spécial de propriété

- Un pointeur vers une autre instance

Une référence définit le rôle que chaque objet joue dans une association. La référence représente le nom de rôle d'une classe dans le contexte d'une association.

Par exemple dans la classe Win32_POTSModemToSerialPort la propriété Antecedent référence l'instance Win32_SerialPort représentant le port série utilisé par le modem.

IV-H - Schéma

Représente une collection de définitions de classe qui décrit les objets gérés dans un environnement particulier.

Un schéma est un groupe de classes avec un propriétaire unique. Les schémas sont employés pour l'administration et le nommage des classes. Les noms de classe doivent être uniques dans leurs schémas propriétaires.

Le SDK utilise deux schémas : le schéma CIM et le schéma Win32. Dans le schéma CIM le nom des classes débute par CIM_, et dans le schéma Win32 le nom des classes débute par Win32_. Le schéma CIM contient les définitions pour le noyau et pour les classes communes, tandis que le schéma Win32 contient les définitions pour les classes étendues qui sont communes à l'environnement Win32.

IV-I - Qualificateurs

Les qualificateurs sont des adjectifs qui fournissent des informations additionnelles au sujet de la classe, de la propriété ou de la méthode à laquelle ils s'appliquent. Par exemple le qualificateur de la classe nommé Dynamic répond à la question "Quel est le type de classe de Win32_Service ?".

Dans les premiers temps d'utilisation de WMI vous rechercherez simplement des informations.

Ensuite si vous souhaitez modifier des propriétés ou appeler des méthodes, les qualificateurs deviennent de plus en plus importants, car ils définissent les caractéristiques opérationnelles de la propriété que vous mettez à jour ou de la méthode que vous appelez.

IV-J - Quel genre d'information les qualificateurs fournissent-ils ?

IV-J-1 - Qualificateurs de classe

Les qualificateurs de classe fournissent des informations opérationnelles sur une classe.
Par exemple :

- Comme vous l'avez vu précédemment, les qualificateurs Abstract, Dynamic et Association vous indiquent le type de classe. Le qualificateur Provider vous indique le provider qui gère la classe. Par exemple, le qualificateur Provider pour la classe Win32_Service vous indique que la classe emploie le provider CIMWin32 (cimwin32.dll).

- D'autre part, la classe Win32_NTLogEvent utilise le provider MS_NT_EVENTLOG_PROVIDER (ntevt.dll) comme indiqué par le qualificateur Provider de la classe Win32_NTLogEvent.

- Le qualificateur Privileges vous informe des privilèges spéciaux requis pour utiliser la classe. Par exemple, le qualificateur Privileges de la classe Win32_NTLogEvent vous indique que le privilège SeSecurityPrivilege doit être positionné (enabled) avant que la classe Win32_NTLogEvent puisse gérer le log de sécurité.

IV-J-2 - Qualificateurs de propriété

Les qualificateurs de propriété fournissent des informations au sujet de chaque propriété.
Par exemple :

- Le qualificateur CIMType vous indique le type de données de la propriété. Le qualificateur Read indique que la propriété est en lecture.

- Le qualificateur Write indique si vous pouvez ou non modifier la valeur de propriété. Par exemple, la propriété ASPScriptDefaultNamespace de la classe Win32_WMISetting est indiquée comme modifiable. D'autre part, toutes les propriétés de la classe Win32_Service sont définies comme read-only, elles ne définissent donc pas le qualificateur Write.

- Le qualificateur Key indique que la propriété est une clé de classe et est employé pour identifier des instances uniques d'une ressource gérée dans une collection de ressources identiques.

IV-J-3 - Qualificateurs de méthode

Les qualificateurs de méthode fournissent des informations au sujet de chaque méthode.
Par exemple :

- Le qualificateur Implemented indique que la méthode a une implémentation fournie par un provider.

- Le qualificateur ValueMap définit un ensemble de valeurs permises pour un paramètre de méthode ou un type de retour.

- Le qualificateur Privileges vous informe des privilèges spéciaux requis pour appeler la méthode.

Note :

Il existe beaucoup plus de qualificateurs que ceux mentionnés ici. Voir la liste complète
Les qualificateurs Standard WMI (Amemdment, Deprecated, etc) ont été ajoutés par Microsoft et ne sont pas dans les spécifications CIM.

IV-K - Extension du schéma

Intel semble étendre ce schéma en ajoutant des fonctionnalités de diagnostic appelé CDM (Common Diagnostic Model).

IV-L - WMI Tester

Vous pouvez maintenant examiner les propriétés, les méthodes, et les qualificateurs d'une classe à l'aide de l'outil C:\WINDOWS\system32\wbem\wbemtest.exe.

Connexion sur 'Root\CIMV2' puis,
menu 'Ouvrir une classe', saisir 'Win32_Service' ou bien
menu 'Énumérer les classes', cliquer sur 'OK' sans renseigner le champ 'Superclasse', double-cliquer sur la classe abstraite '__SystemClass'.

(c) Microsoft, SDK.

IV-L-1 - Requête WQL

Sélectionner le menu 'Requête',
saisir ASSOCIATORS OF {Win32_LogicalDisk.DeviceID="C:"} WHERE AssocClass = Win32_SystemDevices
Résultat : Win32_ComputerSystem.Name="nom_de_votre_ordinateur"

V - Paramétrage WMI et outils divers

V-A - Configurer les paramètres de WMI

Vous pouvez utiliser MMC avec la console suivante : C:\WINDOWS\system32\wmimgmt.msc

V-A-1 - Accorder des autorisations à des utilisateurs ou à des groupes, et définir des niveaux d'autorisation

Vous pouvez autoriser l'accès à un utilisateur ou à un groupe afin qu'ils effectuent des tâches et des services WMI. Pour chaque utilisateur ou groupe autorisé, vous devez définir un niveau d'autorisation pour des espaces de noms spécifiques. Vous pouvez, par exemple, habiliter un groupe à gérer les objets CIM (Common Information Model) de l'infrastructure de gestion Windows sur l'ordinateur local de chaque membre du groupe.

V-A-2 - Configurer l'enregistrement des erreurs

Vous pouvez activer/désactiver l'enregistrement des erreurs ; si l'enregistrement est activé, vous pouvez le configurer de telle sorte qu'il rende compte uniquement des erreurs (configuration par défaut) ou de toutes les actions. L'enregistrement des erreurs peut vous aider à résoudre les problèmes WMI. Vous pouvez également définir une taille maximale des fichiers journaux et l'emplacement du dossier correspondant.

V-A-3 - Effectuer une sauvegarde de l'espace de stockage

Vous pouvez configurer le contrôle WMI de sorte qu'une sauvegarde de votre espace de stockage soit effectuée à intervalles réguliers ou vous pouvez exécuter cette sauvegarde manuellement à n'importe quel moment. On entend par espace de stockage ou référentiel, la base de données à laquelle vous pouvez accéder à l'aide de WMI. Vous avez également la possibilité de restaurer une version précédente de l'espace de stockage.

V-A-4 - Modifier l'espace de noms de script

Vous pouvez modifier l'espace de noms par défaut ciblé dans les scripts WMI.

V-A-5 - Se connecter en tant qu'un autre utilisateur

Vous pouvez ouvrir une session sous un nom d'utilisateur différent pour modifier les paramètres du contrôle WMI. Si, par exemple, vous avez défini un compte d'utilisateur administratif sur plusieurs stations de travail, vous pouvez vous connecter à celles-ci sous le nom d'utilisateur correspondant.

L'espace de nom nommé WMI permet d'effectuer les mêmes tâches d'administration.

V-B - Outils

Tutorial DTMF du Métaschémas
Tutorial Microsoft WMI
Documentation de Winmgt.exe

V-C - WMI et ODBC

Le driver ODBC disponible dans le répertoire \ VALUEADD\MSFT\MGMT\WBEMODBC du CD de NT / XP, permet par exemple à MS-Access de se connecter sur un référentiel WMI local ou distant.

V-D - Contrôles ActiveX additionnels

Le SDK WMI propose un ensemble de contrôles ActiveX. Vous pouvez les utiliser pour fournir une interface graphique (GUI) dans vos applications.

Commande

Description

Class Navigator Control

Affiche un tree view de la structure de classe du référentiel d'objet CIMOM.

CPP Wizard Control

Génère du code C++ pour les objets indiqués.

EventList Control

Montre les évènements auxquels il est inscrit.

EventRegEdit Control

Fournit une interface utilisateur simple pour définir les filtres d'évènement WMI et les clients et les lier entre eux.

HmmView Control

Montre des vues faites sur commande des objets.

MOF Compiler Control

Compile un fichier .MOF indiqué.

MOF Generator Wizard Control

Produit d'un fichier .MOF pour les objets indiqués.

Multiple Object Viewer Control

Affiche les détails dans un format de table pour un ou plusieurs objets.

Namespace Entry Control

Permet à des utilisateurs de visualiser et de sélectionner des espaces de nom.

Navigator Control

Affiche les associations entre les objets dans le référentiel de CIMOM.

RegEvent Control

Enregistre des filtres d'évènement.

Security Control

Fournit des services de login pour les contrôles activeX de WMI.

Single Object Viewer Control

Affiche les détails pour un objet indiqué.

WMI Object Viewer Control (previously called WBEM Object Viewer Control)

Fournit des dispositifs de navigation pour les contrôles Single Object Viewer and Multiple Instance Viewer.

Outils additionnels d'administration de WMI

V-E - WbemDump

Wbemdump est un outil proposé (logiquement) dans le SDK WMI, il est similaire à l'outil WMIC mais nécessite un peu plus de connaissance sur WMI. Il permet par exemple d'exécuter des méthodes de classe.

Pour obtenir la liste des options disponible : WbemDump /?

WbemDump /E /Q Root\CimV2 WQL "Select * From meta_class"

Voir en Annexe

V-F - WMIC

Le programme,WMIC disponible sous XP et 2003 uniquement, permet d'interroger WMI via la ligne de commande. WMIC /? donne la liste des commandes disponibles et des alias.

WMIC [Entrée] permet d'entrer en mode interactif, ensuite la commande /?:Full donne le détail des commandes.

WMIC Service renvoie la liste et l'état des services NT de la machine interrogée, le commutateur /Node permet de se connecter sur une machine distante.

Un alias est une instance de classe MSFT_CliAlias stockée dans l'espace de nom Root\Cli du référentiel CIM. Il est donc possible d'étendre les commandes de WMIC par la création de nouvelles classes :

Détail de la classe MSFT_CliAlias
Créer un alias pour WMIC

Sur la recopie d'écran suivante, on peut voir que la propriété Target contient la requête WQL 'Select * from Win32_Service' permettant de retrouver toutes les informations liées aux services et que la propriété FriendlyName contient le nom de l'alias Service.

La commande suivante permet de créer un fichier résultat au format HTML :

'C:\WINDOWS\system32\wbem>WMIC /Output:C:\TEMP\SERVICELIST.HTM SERVICE LIST /Translate:BASICXML /Format:HTABLE.XSL'.

Voir les fichiers C:\WINDOWS\system32\wbem\*.XSL pour connaître les différents formats.

VI - Delphi

VI-A - Configurer la palette de composants Delphi 5

Dans le menu Projet sélectionner Importer une bibliothèque de type…
Cliquer sur Ajouter puis sélectionner le fichier C:\WINDOWS\system32\wbem\wbemdisp.tlb, cette librairie de type propose les objets de scripting WMI.
Puis sur Installer.
Vous trouverez 6 nouveaux composants dans l'onglet ActiveX :

- TSWbemLocator

- TSWbemNamedValueSet

- TSWbemObjectPath

- TSWbemLastError

- TSWbemSink

- TSWbemDateTime

- TSWbemRefresher

Description : Microsoft WMI Scripting v1.1 Library (Version 1.1).
Une cinquantaine d'interfaces sont disponibles dans l'unité WbemScripting_TLB

La librairie C:\WINDOWS\system32\wbem\wbemads.tlb propose quant à elle les extensions WMI ADSI (Active Directory Services Interface) permettant de gérer les accès à Active Directory. Elle propose un seul composant : TWMIExtension

Description : WMI Extension to DS 1.0 Type Library (Version 1.0)

VI-B - Créer une application WMI

- Vous devez initialiser un objet SwbemLocator.

- Créer une connexion à un espace de nom WMI.

- Par définition, WMI est exécuté dans un processus différent de votre application. Vous devez donc créer une connexion entre votre application et WMI.

- Définir le niveau de sécurité de la connexion WMI.

- Implémenter les besoins de votre application.
WMI offre une variété d'interfaces COM qui vous permettent d'accéder et de manipuler les données de votre entreprise. C'est ici que votre application accède à WMI.

- Libérer les ressources utilisées et terminer votre application.
Après avoir exécuté vos requêtes sur WMI, vous devez vous assurer de libérer tous les objets COM alloués et terminer correctement votre application.

VII - Interface IEnumVARIANT

Cette interface propose de faciliter l'itération sur une collection de variants, par exemple pour gérer une collection de type SWbemObjectSet.

Clone

1. Crée une copie de l'état courant de l'énumération.

Next

1. Renvoie l'élément suivant dans l'ordre d'énumération.

Resets

1. Réinitialise l'ordre d'énumération au premier élément.

Skip

1. Modifie l'ordre d'énumération, saute les n prochains éléments.

Pour le détail des objets suivants, voir le SDK.

VIII - Objet SWbemlocator

Vous pouvez utiliser les méthodes d'un objet SWbemLocator pour vous connecter
à un espace de nom sur un ordinateur local ou distant.

VIII-A - ConnectServer

Cette méthode renvoie, en cas de succès, un objet de type SWbemServices qui représente une connexion à un espace de nom.

StrServer

1. Nom de machine si vous souhaitez vous connecter à un espace de nom distant.
Peut être soit '\\myserver\root\default' soit un nom DNS ou encore une adresse IP.
Pour un accès local, précisez en utilisant le point '.'.

strNamespace

1. Nom de l'espace de nom sur lequel vous souhaitez vous connecter.
Exemple : 'root\default' (espace de nom par défaut) ou 'root\CIMV2'

2. L'espace de nom par défaut est configuré dans la base de registre :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\Scripting\Default Namespace.

strUser

1. Nom du compte utilisé pour se connecter.
Renseigner ce paramètre uniquement pour une connexion à un serveur distant.
Si c'est un domaine différent utiliser le format 'Domain\\UserName' ou le format UPN 'UserName@DomainName'.

2. Ne pas renseigner ce paramètre si strAuthority est déjà renseigné.

strPassword

1. Une valeur NIL indique le contexte de sécurité courant.

2. Renseigner ce paramètre uniquement pour une connexion à un serveur distant.

strLocale

1. Indique le code de localisation (LCID), par exemple " MS_409" pour l'Américain.

strAuthority

1. Ce paramètre peut contenir le nom du domaine NT qui héberge le compte utilisé pour s'authentifier.

1. si le nom commence par " Kerberos:", l'authentification Kerberos est utilisée

2. si il commence par " NTLMDOMAIN:", l'authentification NT LAN Manager est utilisée

3. s'il est vide, l'authentification NT LAN Manager est utilisée.

iSecurityFlags

1. Une valeur zéro (0) ne termine l'appel de cette méthode qu'une fois la connexion au serveur établie. Ceci pourrait avoir comme conséquence que votre programme attende indéfiniment la connexion si le serveur ne répond pas.
Sinon utiliser le flag wbemConnectFlagUseMaxWait qui garantit un retour d'appel en 2 min ou moins.

objWbemNamedValueSet

1. Typiquement ce paramètre est indéfini (NIL).
Sinon pour une utilisation avancée, voir SwbemNamedValue

NE PAS spécifier strUser, strPassword ou strAuthority lorsque vous établissez une connexion à un espace de nom local.

VIII-B - Security

Les applications clientes utilisant des interfaces WMI peuvent spécifier le niveau de sécurité de leurs processus en utilisant cette propriété.

Elle contient un objet de type SWbemSecurity.
Une valeur NIL accorde un accès illimité.

IX - Objet SWbemSecurity

L'objet SwbemSecurity permet de lire ou modifier le niveau de sécurité assigné à un objet, tel que les privilèges, la délégation de COM, et les niveaux d'authentification.

Plus d'informations sur la sécurité WMI

X - Objet SWbemServices

Les méthodes d'un objet SWbemServices permettent d'effectuer des opérations sur un espace de nom local ou distant.

Toutes ses méthodes ne se terminant pas par " Async" peuvent être appelées en mode synchrone et semi-synchrone en renseignant le paramètre IFlags.

IFlag
Mode synchrone = wbemFlagReturnWhenComplete
Mode semi-synchrone = wbemFlagForwardOnly + wbemFlagReturnImmediately

Pour des raisons de sécurité, il est préférable d'utiliser des appels synchrones ou semi-synchrones.

Les appels asynchrones sont déconseillés par Microsoft, à moins que vous maîtrisiez parfaitement ce que vous faites.

X-A - GET

Recherche un objet, une définition de classe ou une instance, basée sur le chemin de l'objet. Cette méthode recherche seulement des objets dans l'espace de nom lié à l'objet SwbemServices courant. Cette méthode est appelée en mode synchrone.

Cette méthode renvoie, en cas de succès, un objet de type SWbemObject qui représente l'objet demandé.

strObjectPath

1. Contient le chemin d'objet de l'objet à rechercher. S'il est vide, l'objet renvoyé peut devenir une nouvelle classe.

iFlags

1. Détermine le comportement de la requête. Ce paramètre accepte la valeur suivante : WbemFlagUseAmendedQualifiers.

2. WMI renvoie des données de classe amendment avec la définition de classe de base. Pour plus d'informations sur le qualificateur amended, Exemple

objWbemNamedValueSet

1. Typiquement, n'est pas renseigné (NIL). Autrement, c'est un objet de type SWbemNamedValueSet dont les éléments représentent l'information de contexte qui peut être employée par le provider qui gère la demande.

Un provider qui permet l'utilisation ou requiert une telle information doit documenter les noms des valeurs reconnues, des types de données de la valeur, les valeurs permises, et la sémantique.

X-B - InstancesOf

Crée une collection d'objets qui renvoie les instances d'une classe indiquée selon les critères de sélection de l'utilisateur.

Cette méthode renvoie, en cas de succès, un objet de type SwbemObjectSet.

strClass

1. Contient le nom de la classe pour laquelle vous souhaitez retrouver les instances. Ce paramètre doit être renseigné.

iFlags

1. Ce paramètre détermine comment l'appel énumère les classes dans la hiérarchie et si cet appel est mode asynchrone (retour immédiat) ou pas. La valeur par défaut pour ce paramètre est wbemFlagReturnImmediately.

2. Voir le SDK pour les valeurs permises et leurs significations.

objWbemNamedValueSet

1. Voir la définition de ce paramètre dans la méthode .Get de cet objet.

X-C - ExecQuery

Exécute une requête WQL permettant de rechercher des objets.

Cette méthode renvoie, en cas de succès, un objet de type swbemobjectset, contenant les objets recherchés.

Cette méthode est appelée en mode semi-synchrone.

strQuery

1. Contient le texte de la requête WQL. Ce paramètre doit être renseigné.

strQueryLanguage

1. Contient le langage d'interrogation à utiliser. S'il est spécifié, sa valeur doit être " WQL".

iFlags

1. Voir le SDK pour les valeurs permises et leurs significations.

objWbemNamedValueSet

1. Voir la définition de ce paramètre dans la méthode .Get de cet objet.

XI - Objet SWbemObject

Vous pouvez utiliser les méthodes et les propriétés d'un objet SWbemObject pour représenter une définition de classe WMI ou une instance d'objet de n'importe quelle classe.

L'objet que vous manipulez est une copie locale, si vous souhaitez modifier l'objet dans le référentiel WMI, utilisez la méthode put_ .

Si vous voulez créer une nouvelle classe, utilisez SWbemServices.Get avec un nom de path vide. L'appel retourne un objet SWbemObject qui peut devenir une classe.

Vous pouvez renseigner un nom de classe dans la propriété de l'objet SWbemObjectPath retourné par l'appel de la méthode Path_

Vous pouvez ajouter des propriétés à la nouvelle classe par l'appel de la méthode Properties_.

Pour créer une instance d'une classe existante, appeler SWbemServices.SpawnInstance_.

XII - Objet SWbemObjectSet

Propose une collection d'objets de type SWbemObject.

Vous pouvez obtenir un objet SwbemObjectSet en appelant une des méthodes suivantes ou leur équivalent asynchrone :

- SWbemObject.Associators_

- SWbemObject.Instances_

- SWbemObject.References_

- SWbemObject.Subclasses_

- SWbemServices.AssociatorsOf

- SWbemServices.ExecQuery

- SWbemServices.InstancesOf

- SWbemServices.ReferencesTo

- SWbemServices.SubclassesOf

Puisque le call-back à un collecteur de données (Sink) pourrait ne pas avoir le même niveau d'authentification qu'exige le client, il est recommandé d'employer une communication semi-synchrone au lieu d'une communication asynchrone.

XIII - Objet SWbemXXXXXSet

Les objets se terminant par Set proposent des collections d'objets, leur type étant indiqué dans le nom de l'objet.

Par exemple l'objet SwbemPropertySet contient une collection d'objets de type SwbemProperty.

Objets de type collection (enumerators) :
SwbemPropertySet, SWbemNamedValueSet, SWbemPrivilegeSet, SWbemQualifierSet, SWbemMethodSet,

XIV - Objet SWbemProperty

Cet objet représente une propriété d'un objet géré.

CIMType

1. Type de la propriété.

IsArray

1. Indique si la propriété est un tableau.

IsLocal

1. Indique si c'est une propriété locale.

2. Une valeur False indique que la propriété est héritée d'une autre classe.

Name

1. Nom de la propriété.

Origin

1. Contient la classe d'origine de cette propriété. Recherche le nom de la classe de WMI dans laquelle cette propriété a été déclarée. Pour les classes avec des hiérarchies d'héritage profond, il est souvent souhaitable de connaître quelles propriétés ont été déclarées et dans quelle classe.

2. Si la propriété est locale (voir SWbemQualifier.IsLocal), cette valeur est identique à la classe propriétaire.

Qualifiers_

1. Objet de type SwbemQualiferSet, qui est une collection des qualificateurs de la propriété.

Value

1. Valeur actuelle de la propriété. C'est la propriété d'automation par défaut de cet objet (c'est un objet de type variant)

XV - Objet SWbemObjectPath

Utilisez cet objet pour construire et valider un chemin d'objet.

La propriété Keys permet de récupérer la ou les clés d'une classe ou d'une instance.

XVI - Objet SWbemDateTime

Utilisez cet objet pour analyser et renseigner des valeurs de type date du référentiel CIM.

Sous XP uniquement et Windows 2003

XVII - Objet ISWbemNamedValue

Représente une valeur simple nommée qui appartient à une collection SWbemNamedValueSet.
Cet objet n'a pas de méthode.

Exemple d'utilisation :

Retrouver une instance 'partielle', i.e. WMI renvoie seulement les propriétés indiquées dans l'objet SWbemNamedValueSet. Voir les restrictions.

Dans le cas où un objet SWbemSink prend en charge de multiples requêtes asynchrones, l'objet SWbemNamedValueSet permet d'identifier,lors d'un évènement OnObjectReady, la requête concernée.
Voir le code source complet dans la seconde partie, Mise en œuvre sous Delphi.

Procedure TForm1.BtExecuteClick(Sender: TObject);
//Démarre la requête de polling et la collecte des évènements par SWbemSink1
var

Query: String;
Query2: String;

Value : Olevariant;

ProcessContext,
EventLogContext : TSWbemNamedValue;

begin
...
// Ajoute un objet TSWbemNamedValue afin d'identifier un évènement.
Value:='Instances';
ProcessContext:=InitContexte('SinkName',Value);

Value:='EventLog';
EventLogContext:=InitContexte('SinkName',Value);

// Surveille les fins de process
Query:='Select * from __InstanceDeletionEvent within 1 where TargetInstance isa "Win32_Process"';

// On utilise le même Collecteur pour 2 évènements différents
WMIService.ExecNotificationQueryAsync(SWbemSink1.DefaultInterface,
Query,
'WQL',
wbemFlagSendStatus,
Nil,
ProcessContext.DefaultInterface);

// Surveille l'ajout dans le journal d'évènement
Query2:='Select * from __InstanceCreationEvent where TargetInstance isa "Win32_NTLogEvent"';

WMIService.ExecNotificationQueryAsync(SWbemSink1.DefaultInterface,
Query2,
'WQL',
wbemFlagSendStatus,
Nil,
EventLogContext.DefaultInterface);
...
end;

Procedure TForm1.SWbemSink1ObjectReady(Sender: TObject; var objWbemObject,
objWbemAsyncContext: OleVariant);
// Déclenché lorsqu'un objet fourni par l'appel asynchrone est disponible.

var WmiObjet: ISWbemObject;
WMIContext : TSWbemNamedValueSet;
Contexte : ISWbemNamedValue;
WMILastError: TSWbemLastError;

begin
Try
...
Contexte:= WMIContext.Item('SinkName',0);
If Contexte.Get_Value = 'Instances'
Then Memo1.Lines.Add('Le process '+WMIVariantToStr(WmiObjet.Properties_.Item('Name',0).Get_Value)+
' s''est terminé.')
else
If Contexte.Get_Value = 'EventLog'
then Memo1.Lines.Add('Un évènement vient d''être ajouté au journal des évènements '+#13#10+
WMIVariantToStr(WmiObjet.Properties_.Item('Message',0).Get_Value))
....
end;

XVIII - Objet SWbemPrivilege

Représente un privilège de sécurité.

Certaines opérations nécessitent d'ajouter des privilèges, si toutefois le compte utilisateur l'autorise. Cela ne permet pas à un utilisateur d'exécuter des tâches nécessitant les privilèges administrateur.

Par exemple :

- wbemPrivilegeShutdown, requis pour arrêter une machine.

- wbemPrivilegeDebug, requis pour déboguer un process.

- wbemPrivilegeSecurity, requis pour accéder au journal d'évènement (EventLog).

- …

Cet objet n'a pas de méthode.

Àvoir.

XIX - Objet SwbemQualifier

Vous pouvez utiliser les propriétés de l'objet de SWbemQualifier pour représenter un qualificateur simple d'une classe WMI, d'une instance, d'une propriété ou d'un paramètre de méthode.

Cet objet n'a pas de méthode.

XX - Objet SWbemMethod

Vous pouvez utiliser les propriétés de cet objet pour inspecter les définitions de méthode d'un objet WMI.

Pour appeler ces méthodes, vous devez employer soit l'accès direct sur un objet de type SWbemObject (c'est le mécanisme recommandé), soit par l'appel de SWbemServices.ExecMethod.

Note : Dans cette version de l'API, l'accès en écriture à l'information de méthode n'est pas supporté. Si vous voulez définir des méthodes ou modifier des définitions de méthode existantes, vous pouvez définir les changements de cette méthode dans un fichier .mof puis le compiler. Alternativement, vous pouvez employer les API COM de WMI.

Cet objet n'a pas de méthode.

XXI - Objet SWbemEventSource

L'objet SWbemEventSource retrouve des évènements d'une requête d'évènement via la méthode SWbemServices.ExecNotificationQuery.

Vous obtenez un objet de SWbemEventSource si vous faites un appel à la méthode SWbemServices.ExecNotificationQuery pour exécuter une requête d'évènement. Vous pouvez alors employer la méthode NextEvent pour retrouver des évènements dès qu'ils arrivent.

XXII - Objet SWbemLastError

Les méthodes et les propriétés de l'objet SWbemLastError contiennent et manipulent des objets d'erreur. Les méthodes et les propriétés de cet objet sont exactement identiques à ceux de l'objet SWbemObject, mais sont employées pour contenir l'information d'erreur au lieu de l'information de classe de WMI.

Vous pouvez créer un objet d'erreur SWbemLastError pour inspecter l'information étendue d'erreur liée à un précédent appel de méthode. Si l'information d'erreur n'est pas disponible, une tentative de création d'un objet d'erreur échouera. Si l'appel réussit et retourne un objet d'erreur, le statut de l'objet est remis à zéro. D'autres tentatives de création d'un objet d'erreur échoueront jusqu'à ce qu'une nouvelle erreur se produise.

Si vous faites un appel asynchrone qui échoue, un objet SWbemLastError peut vous être retourné par l'évènement SWbemSink.OnCompleted dans le paramètre objWbemErrorObject.

La classe système __ExtendedStatus est employée pour renvoyer les informations détaillées de statut et d'erreur.

class __ExtendedStatus : __NotifyStatus
{
string Description;
string Operation;
string ParameterInfo;
string ProviderName;
uint32 StatusCode;
};

Méthodes

1. Cette classe n'a aucune méthode.

Propriétés

1. Elle possède les propriétés suivantes qui sont toutes en Read-only :

Description

1. Chaîne définie par l'utilisateur, décrit une erreur ou un statut opérationnel.

Opération

1. Opération en cours au moment où a lieu l'erreur (échec ou anomalie).

2. Typiquement, WMI renseigne cette propriété avec le nom de l'API COM de la méthode WMI. Exemple : IWbemServices::CreateInstanceEnum.

ParameterInfo

1. Paramètres impliqués dans l'erreur.

2. Par exemple, si une application essaie de rechercher une classe qui n'existe pas, cette propriété est renseignée avec le nom de la classe fautive.

ProviderName

1. Identifie le provider qui provoque ou rapporte l'erreur. Si un provider n'est pas impliqué, cette propriété contient " Windows Management".

StatusCode

1. Contient un code d'erreur ou d'information pour une opération.

2. Ce peut être n'importe quelle valeur définie par le provider, mais la valeur 0 (zéro) est habituellement réservée pour indiquer le succès.

3. Cette propriété est héritée de __ NotifyStatus.

Quand des instances de cette classe sont retournées d'une méthode par un provider dynamique, les propriétés StatusCode et Description sont renseignées par le provider, et les autres propriétés sont renseignées par WMI.

Sous Delphi les erreurs rencontrées sont des exceptions de type EOleException.

Si l'information d'erreur n'est pas disponible, la création d'un objet SwbemLastError provoquera une exception de type EOleSysError.

Les erreurs débutant par $8007xxxx sont des erreurs WIN32 et celles débutant par $8004xxxx des erreurs de WMI.

XXII-A - Codes d'erreur

Codes d'erreur retournés par les appels WMI

Codes de statut retournés par les opérations WMI

Codes d'erreur retournés par les providers WMI

XXIII - Objet SwbemSink

L'objet SWbemSink (collecteur) est implémenté par des applications clientes pour recevoir les résultats des opérations asynchrones et des notifications d'évènement. Pour faire un appel asynchrone, vous devez créer une instance d'un objet de SWbemSink et le passer à une méthode l'utilisant sous le nom de paramètre ObjWbemSink.

Les évènements dans votre implémentation de SWbemSink sont déclenchés quand le statut ou les résultats sont retournés ou que l'appel est terminé.

XXIII-A - Cancel

Annule toutes les opérations asynchrones liées à cet objet.

Remarques

Un call-back asynchrone permet à un utilisateur non authentifié de fournir des données au collecteur (sink). Ceci pose des problèmes de sécurité pour vos scripts et applications. Pour éliminer les risques, employez la communication semi-synchrone ou synchrone.

XXIII-B - Évènements

Vous pouvez implémenter des sous-programmes à appeler quand des évènements sont déclenchés.

Par exemple, si vous voulez traiter chaque objet retourné par une requête asynchrone tel que SWbemServices.ExecQueryAsync, créez un sous-programme en utilisant l'évènement OnObjectReady de l'objet Sink qui est indiqué dans l'appel asynchrone.

procedure TForm1.CollecteurEvenementObjectReady(Sender: TObject;
const objWbemObject: ISWbemObject;
const objWbemAsyncContext: ISWbemNamedValueSet);

// Déclenché lorsqu'un objet fourni par l'appel asynchrone est disponible.
// objWbemObject contient l'objet retourné

var WmiObjet: SWbemObject;

begin
WmiObjet:=IUnknown(objWbemObject) as SWbemObject;
//Affiche la définition de classe au format MOF
Memo1.Lines.Add(AdjustLineBreaks(WmiObjet.GetObjectText_(0)));
end;

Utilisez la table suivante comme référence pour identifier des évènements et des descriptions de Trigger.

Description d'évènement :

- OnCompleted est déclenché quand une opération asynchrone est terminée.

- OnObjectPut est déclenché après une opération PUT asynchrone.

- OnObjectReady est déclenché quand un objet, fourni par un appel asynchrone, est disponible.

- OnProgress est déclenché pour fournir le statut d'une opération asynchrone.

Si les évènements sont produits à partir d'un provider qui implémente les mises à jour de statut, vous pouvez gérer l'évènement OnProgress pour informer les utilisateurs à propos d'un changement de statut lors d'une opération asynchrone.

XXIV - Objet SWbemServicesEx

Étend les fonctionnalités de l'objet SwbemServices.

Sous XP uniquement et Windows 2003

XXV - Objet SWbemObjectEx

Étend les fonctionnalités de l'objet SWbemObject.

Propose, entre autres, la méthode GetText_ qui permet d'extraire la représentation XML d'une classe.

Sous XP uniquement et Windows 2003

XXVI - Objet SWbemRefresher

L'objet SWbemRefresher est un conteneur d'objet qui peut rafraîchir les données des objets qu'il contient. Des instances simples et des collections d'instances peuvent être ajoutées ou enlevées du conteneur.

Dans l'ensemble des objets ajoutés, chaque élément représenté par une instance de SWbemRefreshableItem peut être traité comme une collection et être énuméré. Des instances WMI de n'importe quelle classe peuvent être ajoutées à l'objet SWbemRefresher.

Même si le provider pour les données d'instance n'est pas un provider de 'haute performance', l'objet 'refresher' peut encore mettre à jour les données par l'appel de la méthode Refresh. Si les données sont fournies par un provider de 'haute performance' et si la propriété AutoReconnect est à True, alors l'objet SWbemRefresher essaye de rétablir une connexion rompue avec le provider de données.

L'opération de refresh peut être effectuée en appelant la méthode SWbemRefresher.Refresh ou SWbemObjectEx.Refresh _.

Sous XP uniquement et Windows 2003

XXVII - Objet SWbemRefreshableItem

L'objet SWbemRefreshableItem représente un simple élément d'un objet SWbemRefresher.

Un objet SWbemRefreshableItem est obtenu par l'appel des méthodes .Add et .AddEnum de l'objet SWbemRefresher.

Sous XP uniquement et Windows 2003

XXVIII - Annexe

Alain Lissoir's home page

Propose les scripts des ouvrages cités plus bas. Contient notamment une version compilée de l'outil WbemDump.exe.

http://www.openpegasus.org/

Tutorial (C ,linux)

http://www.wbemsource.org/

Provider WMI tiers. Gestion des fichiers : ASCIFSEP

XXVIII-A - Exemple

Exemple de tâches WMI

Exemple de provider ligne de commande

Exemple de provider pour l'Event Log NT

Exemples de script VBScript

De nombreux exemples de script WMI, classés par type de tâche

XXVIII-B - Références d'ouvrages

Understanding WMI Scripting · Editeur(s) : Digital Press
· Auteur(s) : A.Lissoir
· Nb de pages : 622 pages
· Langue : Anglais
· ISBN : 1-55558-266-4

Leveraging WMI Scripting - Operating Systems · Editeur(s) : Digital Press
· Auteur(s) : A.Lissoir
· Nb de pages : 918 pages
· Langue : Anglais
· ISBN : 1-55558-299-0

Windows Management Instrumentation - WMI · Editeur(s) : New Riders
· Auteur(s) : M.Lavy A.Meggitt
· Nb de pages : 408 pages
· Langue : Anglais
· ISBN : 1-57870-260-7

XXIX - WMI, seconde partie

Mise en œuvre sous Delphi.