Announcement

Collapse
No announcement yet.

WMI-Problem

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • WMI-Problem

    Hallo!

    Habe folgendes Problem (muß vorrausschicken, daß ich nicht Win2000 habe, also keine ADSI-Schnittstellen)

    Ich versuche die MAC-Adressen aufzulisten. Das funktioniert in VB sehr einfach

    <PRE>
    Dim MyWBEMObjectSet As WbemScripting.SWbemObjectSet
    Dim MyWBEMObject As WbemScripting.SWbemObject
    Dim MyWBEMProperty As WbemScripting.SWbemProperty

    Set MyWBEMObjectSet = GetObject("winmgmts:root/cimv2").InstancesOf ("win32_networkadapter")
    '*** Collection
    For Each MyWBEMObject In MyWBEMObjectSet
    Set MyWBEMProperty = MyWBEMObject.Properties_("MACAddress")
    If Not IsNull(MyWBEMProperty) Then
    '*** MAC-Adresse
    MsgBox MyWBEMObject.Name & " Adresse: " & MyWBEMProperty.Value
    End If
    Set MyWBEMProperty = Nothing
    Next
    </PRE>

    Leider stehe ich in Delphi an. Ich habe da zwar einen Ansatz, aber das wars auch schon :-))

    <PRE>
    procedure TForm1.btnMACAddressClick(Sender: TObject);
    var
    pbc : IBindCtx;
    iChars : longint;
    pMk : IMoniker;
    MyWMI : Variant;
    begin
    try
    OleCheck(CreateBindCtx (0, pbc));
    OleCheck(MkParseDisplayName (pbc, 'winmgmts:root/cimv2', iChars, pMk));
    pMk.BindToObject(pbc, NIL, IDispatch,MyWMI);
    //MyWMI.InstacesOf('win32_networkadapter');
    ShowMessage('Okay');
    except
    ShowMessage('ERROR GetObject');
    end;
    end;
    </PRE>

    Wie kann ich InstancesOf aufrufen, bzw. was mache ich da alles falsch?

    Danke, auf Hilfe hoffend, Biggi

  • #2
    Hallo,

    alles das, was VB kann, steht unter Delphi ebenfalls zur Verfügung. Das VB-Beispiel greift auf die WMI-Objekte (COM-Objekte von Windows Management Instrumentation) zurück. Die gleichen COM-Objekte können auch von Delphi aus angesprochen werden, so dass man das VB-Beispiel fast 1:1 nachbauen kann.

    Damit die Programmierhilfe von Delphi auch für die WMI-Interfaces zur Verfügung steht, wird zuerst die Typbibliothek <b>Microsoft WMI Scripting V 1.1 Library</b> (Delphi-Menü: <i>Projekt | Typbibliothek importieren</i> importiert. Delphi legt dabei die 5 VCL-Wrapperkomponenten für die WMI-Objekte an.

    Der erste Schritt besteht für jede Anwendung darin, einen Interface-Zeiger für <b>IWbemLocator</b> abzufordern. Dank ver von Delphi 5 beim Import der Typbibliothek angelegten VCL-Wrapperkomponente TSWbemLocator ist das für uns überhaupt kein Problem. Das Locator-Objekt erlaubt den Verbindungsaufbau über die Methode ConnectServer, wobei ich im Beispiel weder einen Rechnernamen, einen Namespace noch Login-Daten bereitstelle. Der Zugriff geht dabei auf den eigenen Rechner und erfolgt mit den Rechten des aktuell angemeldeten Benutzers. Die Methode ConnectServer liefert einen Interface-Zeiger vom Typ ISWbemServices zurück, über den die Kommunikation mit dem CIMOM abläuft. Allerdings ist nur das erreichbar, was in dem Namespace liegt, der von ConnectServer anfgefordert wurde.

    Das ISWbemServices-Interface stellt verschiedene Wege zur Verfügung, am einfachsten geht es mit der Methode <b>Get</b> weiter. Hier kann der Klassenname als Objektpfad verwendet werden, um einen Interface-Zeiger auf ISWbemObject zu erhalten. Über dieses Interface steht der volle Zugriff auf die Methoden und Eigenschaften des Objekts zur Verfügung. Zum Beispiel kann der Client über die Interface-Methode Properties den Interface-Zeiger auf das Enumerations-Objekt dieses Objektes anfordern, um alle Eigenschaften über IEnumVariant auszulesen:
    <pre>
    uses ActiveX;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    aSrv : ISWbemServices;
    aObjSet : ISWbemObjectSet;
    aObj : ISWbemObject;
    vNVS : OleVariant;
    aPropSet : ISWbemPropertySet;
    aProp : ISWbemProperty;
    pEnum : IEnumVARIANT;
    vOut : OleVariant;
    dwRetrieved : LongWord;
    hRes : HResult;
    begin
    aSrv := SWbemLocator1.ConnectServer('','','','','','',0,vN VS);
    aObj := aSrv.Get('Win32_LogicalDisk', 0, vNVS);
    aPropSet := aObj.Properties_;
    pEnum := aPropSet.Get__NewEnum as IEnumVARIANT;
    while (TRUE) do
    begin
    hRes := pEnum.Next(1, vOut, dwRetrieved);
    if hRes <> S_OK then
    Break;
    ListBoxEnum.Items.Add(vOut.Name);
    end;
    end;
    </pre>
    Das VB-Beispiel für das Auslesen der MAC-Adresse könnte in Delphi so nachgebaut werden:
    <pre>
    procedure TForm1.Button2Click(Sender: TObject);
    var
    aSrv : ISWbemServices;
    aObj : ISWbemObject;
    vNVS : OleVariant;
    aPropSet : ISWbemPropertySet;
    aProp : ISWbemProperty;
    vOut : OleVariant;
    begin
    aSrv := SWbemLocator1.ConnectServer('','root/cimv2','','','','',0,vNVS);
    aObj := aSrv.Get('Win32_networkadapter', 0, vNVS);
    aPropSet := aObj.Properties_;
    aProp := aPropSet.Item('MACAddress',0);
    vOut := aProp.Get_Value;
    if not VarIsNull(vOut) then
    ShowMessage(vOut)
    else
    ShowMessage('MACAdress ist leer');
    end;
    </pre>
    Hinter <i>SWbemLocator1</i> verbirgt sich die beim Import der Typbibliothek von Delphi automatisch angelegte <b>TSWbemLocator</b>-Komponente, die im Formular abgelegt (aber im Objektinspektor nicht konfiguriert) wird. Delphi fügt in diesem Fall die Unit <i>WbemScripting_TLB</i> in die Uses-Anweisung ein, so dass die WMI-Interfaces beim Compilieren gefunden werden

    Comment


    • #3
      Glücklich sei!

      Herzlichen Dank für die ausführliche Hilfe, es hat mir sehr geholfen!

      lg Brigitt

      Comment

      Working...
      X