Announcement

Collapse
No announcement yet.

Problem mit String Array aus Win32_NetworkAdapterConfiguration (WMI)

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

  • Problem mit String Array aus Win32_NetworkAdapterConfiguration (WMI)

    Hallo,

    ich bin (auch dank der Beispiele von hier) in die WMI - Programmierung eingestiegen. Plattform: W2000, D5 Enterprise.

    Viele Beispiele konnte ich auch erfolgreich nachvollziehen aber nun bin ich hängengeblieben:

    Es geht um das Auslesen der IP- und MAC-Adressen (plus Art der Netzkarte = Description) unserer Rechner im Netzwerk über WMI. Da einigen Rechnern mehrere IP-Adressen (auf einer Netzkarte) zugeordnet sind brauchte ich eine Darstellung (in einer Listbox) "IP: ---> MAC: ---> Netzkarte:".

    Ausgestiegen bin ich bei der Tatsache, das "IPAddress" in Form eines String Arrays kommt - wie kann ich das auslesen?

    Mein Versuch:
    --------------------
    <PRE>
    procedure TForm1.Button1Click(Sender: TObject);
    var aSrv : ISWbemServices;
    aObjSet : ISWbemObjectSet;
    vNVS : OleVariant;
    aNVSDummy : IDispatch;
    pEnum : IEnumVARIANT;
    vOut : OleVariant;
    dwRetrieved : LongWord;
    hRes : HResult;
    vValue : OleVariant;

    begin
    SWbemLocator1 := CoSWbemLocator.Create;
    aSrv := SWbemLocator1.ConnectServer('192.168.1.12','root/cimv2','administrator','MeinPasswort','','',0,vNVS );
    ListBox1.Items.Add('-- Computer --');
    aObjSet := aSrv.ExecQuery('SELECT Name, UserName FROM Win32_ComputerSystem', 'WQL',0,aNVSDummy);
    pEnum := aObjSet.Get__NewEnum as IEnumVARIANT;
    while (TRUE) do
    begin
    hRes := pEnum.Next(1, vOut, dwRetrieved);
    if hRes <> S_OK then Break;
    ListBox1.Items.Add(Format('Computername %s - Angemeldet: %s',
    [VarToStr(vOut.Name), VarToStr(vOut.UserName)]));
    end;
    aObjSet := aSrv.ExecQuery('SELECT IPAddress,MACAddress,Description FROM Win32_NetworkAdapterConfiguration', 'WQL',0,aNVSDummy);
    pEnum := aObjSet.Get__NewEnum as IEnumVARIANT;
    while (TRUE) do
    begin
    hRes := pEnum.Next(1, vOut, dwRetrieved);
    if hRes <> S_OK then Break;
    begin
    ListBox1.Items.Add(Format('IP: %s - MAC: %s | Karte: %s',
    [ VarToStr(vOut.Ipaddress[0]),
    VarToStr(vOut.MACAddress),
    VarToStr(vOut.Description)]));
    end;
    end;
    //ListBox1.Items.Add('-- Drucker --');
    end;

    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    CoReleaseServerProcess;
    CoDisconnectObject(SWbemLocator1, 0);
    end;
    </PRE>
    --------------------
    bringt mir ab der zweiten IP-Adresse "Ungültige Variant-Typumwandlung".

    Kann mir jemand weiterhelfen?

    Grüße
    Knut

  • #2
    Hallo,

    &gt;...das "IPAddress" in Form eines String Arrays kommt - wie kann ich das auslesen?

    über <b>VarArrayHighBound</B> und <b>VarArrayLowBound</b> kann die Anzahl der Elemente im Variant-Array ermittelt werden, so dass dann der direkte Zugriff auf jedes einzelne Element möglich ist. Das folgende Beispiel für <i>'Win32_LogicalFileSecuritySetting</i> demonstriert dies:

    <pre>
    <b>uses</b> ActiveX;
    <br>
    <b>procedure</b> TForm1.Button1Click(Sender: TObject);
    <b>var</b>
    aSrv : ISWbemServices;
    vObj : OleVariant;
    iRet : Integer;
    vObjDesc : OleVariant;
    vDACL : Variant;
    vDACLEnum : OleVariant;
    vNVS : OleVariant;
    iHigh, iLow, i : Integer;
    <b>begin</b>
    aSrv := SWbemLocator1.ConnectServer(<font color="#9933CC">''</font>,<font color="#9933CC">''</font>,<font color="#9933CC">''</font>,<font color="#9933CC">''</font>,<font color="#9933CC">''</font>,<font color="#9933CC">''</font>,0,vNVS);
    vObj := aSrv.Get(<font color="#9933CC">'Win32_LogicalFileSecuritySetting= '</font><font color="#9933CC">'C:\trace.txt'</font><font color="#9933CC">''</font>, 0, vNVS);
    iRet := vObj.GetSecurityDescriptor(vObjDesc);
    <b>if</b> iRet &lt;&gt; 0 <b>then</b>
    <b>begin</b>
    ShowMessage(IntToStr(iRet));
    Exit;
    <b>end</b>;
    <font color="#003399"><i>// Siehe &quot;GetSecurityDescriptor&quot; in Platform SDK Hilfe </i></font>
    <font color="#003399"><i>// Ergebnis ist ein Variant-Array </i></font>
    vDACL := vObjDesc.DACL;
    <font color="#003399"><i>// Variant-Array auswerten </i></font>
    iHigh := VarArrayHighBound(vDACL, 1);
    iLow := VarArrayLowBound(vDACL, 1);
    <b>for</b> i := iLow <b>to</b> iHigh <b>do</b>
    <b>begin</b>
    ListBox1.Items.Add(vDACL[i].Trustee.Name);
    ListBox1.Items.Add(vDACL[i].AccessMask);
    <b>end</b>;
    <b>end</b>;
    </pre&gt

    Comment


    • #3
      Hallo Herr Kosch,

      Danke für die Antwort, so funktionierts.

      Vielleicht können Sie mir noch bei folgendem Verständnisproblem helfen:

      ich kann mit dem Parameter "Namespace" (...ConnectServer('',<B>'root/cimv2'</B>,...)) nichts anfangen.
      Können Sie mir erklären, was er bewirkt (einschränkt?) und wo ich die unterschiedlichen Belegungen für ihn finden kann?

      Danke

      Knu

      Comment


      • #4
        Hallo,

        am Anfang der Bemühungen Stand das <i>Web Based Enterprise Management</i> (WBEM), bei mehr verschiedene Firmen einen gemeinsamen Zugriffsweg vorgesehen haben, indem alle Beteiligten sich ein <i>Common Information Model</i> (<b>CIM</b>) und somit auf eine objektorientierte Herangehensweise geeinigt haben. CIM-Klassen werden in Textdateien im <i>Managed Object Format</i> (MOF) gespeichert (siehe ab Windows 2000: Verzeichnis C:\WINNT\system32\wbem).

        WMI ordnet die Klassen logischen Unterteilungen zu - den sogenannten Namespaces. Der WMI-Namespace <b>root\cimv2</b> ist nur ein Bereich von vielen (siehe angehängte Abbildung).

        Unter Windows XP steht das <b>Testprogramm für Windows-Verwaltungsinformation</b> (WBEM.EXE) zur Verfügung, ansonsten ist die Hilfedatei vom MS Platform SDK oder die DVD der MSDN-Library eine ergiebige Informationsquelle

        Comment

        Working...
        X