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
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
Comment