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

cs_plexus 2 Messages postés lundi 20 octobre 2003Date d'inscription 22 octobre 2003 Dernière intervention - 22 oct. 2003 à 18:01 - Dernière réponse : cs_fjohnny 49 Messages postés lundi 16 décembre 2002Date d'inscription 18 septembre 2006 Dernière intervention
- 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

cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 23 oct. 2003 à 23:28
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Delphiprog
cs_fjohnny 49 Messages postés lundi 16 décembre 2002Date d'inscription 18 septembre 2006 Dernière intervention - 28 mars 2006 à 11:30
+3
Utile
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;
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_fjohnny
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 29 mars 2005 à 23:19
0
Utile
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.