Mise en oeuvre de wmi (via wql)

Description

Exemple de code permettant l'utilisation de WMI sous Windows 2000/XP/2003. Il est également possible de l'utiliser sous Win98 à condition d'installer WMI.
L'intérêt majeur d'utiliser WMI est double car il permet d'uniformiser l'appel aux API d'une part et d'autre part il permet de faire des requêtes sur des ordinateurs distants.
Evidemment, il va s'en dire que la plupart des opérations nécessitent les droits administrateurs.

Plusieurs fonctions sont disponibles :
  • WMIExecuteWQL : Permet de faire une requête WQL dans un espace de nom donné et de trouver les propriétés des classes WMI.

Par ex: Showmessage(WMIExecuteWQL('.','root\cimv2','Select * from Win32_Processor').Text); {Va afficher les différentes informations disponibles sur le processeur ou les processeurs, si il y en a plusieurs}.
  • WMIServiceControl : Permet d'Arrêter/Démarrer/Mettre en pause un service grâce à son nom.

Par exemple : if WMIServiceControl ('.','Avertissement',WMI_SERVICE_STOP) then Showmessage('Le service "Avertissement" a été arrêté !');
  • WMIArretPC : Permet d'arrêter/Redémarrer/Fermer la session sur un ordinateur local ou distant !

Par exemple: if WMIArretPC ('.',WMI_LOGOFF+WMI_FORCED) then Showmessage ('Vous venez de forcer la fermeture de session !');
  • WMIArretProcess : Permet de "killer" un processus grâce son PID (Process Identifier).

Par Exemple: If WMIArretProcess ('.',2563) then Showmessage ('Vous venez d''arrêter le processus dont le PID est :'+IntToStr(PID));
  • EnnumereClasseWMI : Permet d'énumérer les classes de l'espace de nom spécifié.

Par exemple: ListBox1.Items := EnnumereClasseWMI('root\cimv2');

Dans l'exemple du fichier ZIP, j'ai implémenté uniquement 2 de ces fonctions : EnnumereClasseWMI et WMIExecuteWQL mais les autres sont dans l'unité WMI.pas.

Bonne programmation.

Source / Exemple :


Function WMIExecuteWQL (NomPCDistant,EspaceNom,RequeteWQL : String): TStringList;Overload;
var
  WMILocator:          TSWbemLocator;
  WmiService:          SWbemServices;
  WmiObject:           SWbemObject;
  wmiObjectSet:        SWbemObjectSet;
  WmiProperty:         SWbemProperty;
  WmiPropertySet:      SWbemPropertySet;
  PropertyEnumerator,
  ObjectEnumerator:    IEnumVariant;
  ArrayVariant:        OleVariant;
  NumberItem:          LongWord;
begin
Try
 try
   WMILocator:= TSWbemLocator.Create(nil);Result := TStringList.Create;
   WmiService:= WMILocator.ConnectServer(NomPCDistant, EspaceNom,'','','','', wbemConnectFlagUseMaxWait, nil);
   WmiObjectSet := wmiService.ExecQuery(RequeteWQL,'WQL',wbemFlagReturnImmediately, nil);

   ObjectEnumerator:= (WmiObjectSet._NewEnum) as IEnumVariant;

   while (ObjectEnumerator.Next(1, ArrayVariant, NumberItem) = S_OK) do
     begin
     	 WmiObject := IUnknown(ArrayVariant) as SWBemObject;
	 WmiPropertySet:= WmiObject.Properties_;
         PropertyEnumerator:= (WmiPropertySet._NewEnum) as IEnumVariant;
         while (PropertyEnumerator.Next(1, ArrayVariant, NumberItem) = S_OK) do
           begin
      	     WmiProperty := IUnknown(ArrayVariant) as SWBemProperty;
             Result.Add(WmiProperty.Name+' = '+SWbempropertytostr(WmiProperty));
           end;
     End;
 except
    LogEvenement('!!!Echec de l''exécution de la requête WMI.');
 end;
Finally
  WMILocator.Disconnect; WMILocator.Free;
end;
end;

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.