Accès à WMI par Delphi [Résolu/Fermé]

Messages postés
2
Date d'inscription
lundi 20 octobre 2003
Dernière intervention
22 octobre 2003
- - Dernière réponse : cs_fjohnny
Messages postés
49
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
18 septembre 2006
- 28 mars 2006 à 11:30
Quelqu'un peut-il m'éclairer sur la façon d'accèder à WMI par Delphi ? 8-)
Afficher la suite 

3 réponses

Meilleure réponse
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
3
Merci
Même si les exemples sont donnés en C++ (comme à l'accoutumée chez MSDN), celà reste lisible : Windows Management Instrumentation.

Bon courage, débutants s'abstenir...
May Delphi be with you

Merci cs_Delphiprog 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cs_Delphiprog
Messages postés
49
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
18 septembre 2006
3
Merci
Voilà en glannant des infos à droite et à gauche sur le net, je me suis constitué une petite fonction permettant de faire des requêtes WMI :

Function SWBempropertyToStr(Variable:SWbemProperty): String;
Var Count: Integer;
begin
if VarIsNull (Variable.Get_Value) then Result:=' < Null > ' else
begin
Try
case Variable.CIMType of
wbemCimtypeSint8,
wbemCimtypeUint8,
wbemCimtypeSint16,
wbemCimtypeUint16,
wbemCimtypeSint32,
wbemCimtypeUint32,
wbemCimtypeSint64:
if VarIsArray(Variable.Get_Value) then
begin
if VarArrayHighBound(Variable.Get_Value, 1) > 0 then
for Count := 1 to VarArrayHighBound(Variable.Get_Value, 1) do
Result := Result + ' ' + IntToStr(Variable.Get_Value[Count]);
end
else Result := IntToStr(Variable.Get_Value);

wbemCimtypeReal32,
wbemCimtypeReal64:
Result := FloatToStr(Variable.Get_Value);

wbemCimtypeBoolean:
if Variable.Get_Value then Result := 'True' else Result := 'False';

wbemCimtypeString,
wbemCimtypeUint64:
if VarIsArray(Variable.Get_Value) then begin
if VarArrayHighBound(Variable.Get_Value, 1) > 0 then
for Count := 1 to VarArrayHighBound(Variable.Get_Value, 1) do
Result := Result + ' ' + Variable.Get_Value[Count];
end
else
Result := Variable.Get_Value;

wbemCimtypeDatetime:
Result := Variable.Get_Value;
end;
Result:={Variable.Name+' = '+}Result;
except
Result:={Variable.Name+}' = Type de donnée inconnue';
end;
end;
end;


Function WMIExecuteSQL (NomPC,RequeteSQL : String): TStringList;
var
wmiLocator: TSWbemLocator;
wmiServices: ISWbemServices;
wmiObjectSet: ISWbemObjectSet;
wmiObject: ISWbemObject;
propSet: ISWbemPropertySet;
wmiProp: ISWbemProperty;
propEnum,
Enum: IEnumVariant;
ovVar: OleVariant;
lwValue: LongWord;
sValue: String;
begin
wmiLocator := TSWbemLocator.Create(nil);
try
wmiServices := wmiLocator.ConnectServer(NomPC,'root\cimv2','','','', '', wbemConnectFlagUseMaxWait, nil);
wmiObjectSet := wmiServices.ExecQuery(RequeteSQL,'WQL',wbemFlagReturnImmediately+ wbemFlagForwardOnly, nil);
Result := TStringList.Create;
Enum := (wmiObjectSet._NewEnum) as IEnumVariant;
while (Enum.Next(1, ovVar, lwValue) = S_OK) do begin
wmiObject := IUnknown(ovVar) as SWBemObject;
propSet := wmiObject.Properties_;
propEnum := (propSet._NewEnum) as IEnumVariant;
Try
while (propEnum.Next(1, ovVar, lwValue) = S_OK) do begin
wmiProp := IUnknown(ovVar) as SWBemProperty;
if wmiProp.Get_Value <> Null then
begin
try
sValue := VarToStr(wmiProp.Get_Value);
if sValue='' then sValue := SWBempropertyToStr(wmiProp);
except
Try
sValue := SWBempropertyToStr(wmiProp);
except
sValue := '<Null>';
end;
end;
end
else sValue := '<Null>';
Result.Add(wmiProp.Name + ' = ' + sValue);
end;
except
end;
end;
finally
wmiObject:=nil;wmiObjectSet:=nil;wmiServices:=nil;Enum :=nil;
wmiLocator.Disconnect;propSet:=nil;wmiProp:=nil;propEnum:=nil;ovVar:='';
wmiLocator.Free;
end;
end;


Pour l'utilisation :

Procedure Test;
begin
//Par exemple :
Showmessage (WMIExecuteSQL ('.',select * from Win32_OperatingSystem').Text );
end;

Merci cs_fjohnny 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cs_fjohnny
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
0
Merci
Locas : il n'est pas nécessaire de poster un message vide pour être informé des réponses à cette question. Regarde bien en haut des pages du forum et tu verras le message suivant :
(NOUVEAU) Ce sujet vous interesse ? Vous souhaitez recevoir mail lorsque qu'une réponse est faite sur ce sujet ?
[# Alors cliquez ici pour être averti]

C'est tout ce qu'il y a à faire.
Cela dit, comme la demande date d'octobre 2003, les chances d'obtenir une réponse sont bien minces


<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.pourflorenceethussein.org
Commenter la réponse de cs_Delphiprog

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.