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

Signaler
Messages postés
2
Date d'inscription
lundi 20 octobre 2003
Statut
Membre
Dernière intervention
22 octobre 2003
-
cs_fjohnny
Messages postés
49
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
18 septembre 2006
-
Quelqu'un peut-il m'éclairer sur la façon d'accèder à WMI par Delphi ? 8-)

3 réponses

Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
25
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
Messages postés
49
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
18 septembre 2006

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;
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
25
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