![]() |
Anzeigen der IPAdresse UND Name der Verbindung
Hallo, mir geht es darum in einem Windows 2000 System für sämtliche Netwerkadapter die IP UND den Namen der Verbindung anzeigen zu lassen. Eine Funktion um die IP Adresse zeigen zu lassen habe ich hier im Forum schon gefunden und erfolgreich implemetiert. Jetzt gilt es noch zusätzlich zur IP-adresse den Adapternamen oder auch Adaptertyp anzeigen zu lassen.
Der Code für das Anzeigen der IP von MathiasSimmack hier im Forum
Delphi-Quellcode:
uses
WinSock; function GetLocalIPs: string; type PPInAddr = ^PInAddr; var wsadata : TWSAData; hostinfo : PHostEnt; addr : PPInAddr; begin Result := ''; if(WSAStartUp(MAKEWORD(1,1),wsadata) = 0) then try hostinfo := gethostbyname(nil); if(hostinfo <> nil) then begin addr := pointer(hostinfo^.h_addr_list); while(addr^ <> nil) do begin Result := Result + inet_ntoa(addr^^) + ^M^J; inc(addr); end; end; finally WSACleanUp; end; end; ![]() Edit: Am besten wäre natürlich eine Methode wo man den jeweiligen LAN-Adapternamen eingeben kann und dann die jeweilige IP als Rückgabe bekommt. |
Re: Anzeigen der IPAdresse UND Name der Verbindung
Was meinst Du mit Adapternamen ?
|
Re: Anzeigen der IPAdresse UND Name der Verbindung
Zitat:
|
Re: Anzeigen der IPAdresse UND Name der Verbindung
In hostinfo^.h_name steht der Rechnername (inkl. Domainname).
Die Infos zum Adapter wirst du wohl nur über die IP Helper API bekommen. Also GetAdaptersAddresses() bzw. GetAdaptersInfo(). |
Re: Anzeigen der IPAdresse UND Name der Verbindung
Einen schönen Abend!
Sorry, habe mich wohl nicht deutlich genug ausgedrückt. Ich meinte "nur" den Namen der Netzwerkverbindung und nicht unbedingt die genaue Bezeichnung der LAN- oder WLANkarte also einfach nur z.B. LAN-1 und LAN-2. Als Hintergrund möchte ich noch erwähnen, dass ich meinen beiden Netzwerkadaptern via NETSH jeweils eine bestimmte IP zuteile. Das ganze funktioniert erstaunlich einfach. Doch ob jetzt die Zuteilung der IP auch wirklich erfolgreich war ist ja eigentlich ungewiss. Ich möchte also "einfach" nur überprüfen ob jeder LANverbindung (z.B. LAN-1/LAN-2) die richtige IP übergeben wurde. Ein Hauptproblem ist es das Auslesen der IP mit dem Netzwerkverbindungsnamen zu verbinden. Jede einzelne Funktion gibt es ja unter anderem schon hier im Forum. Ich suche allerdings eine Kombination aus beiden. |
Re: Anzeigen der IPAdresse UND Name der Verbindung
Hi,
darf es auch WMI sein? Wenn JA, dann heißt die Klasse win32_NetworkAdapter und in Verbindung mit win32_NetworkAdapterConfiguration bekommst du alles was gebraucht wird. Gruß PS Zu WMI gibt es in der DP genug Beispiele |
Re: Anzeigen der IPAdresse UND Name der Verbindung
Also WMI ist natürlich auch recht, nur dachte ich, dass es da bei Win2000 Probleme gibt weil ja so einiges erst mit WinXP dazugekommen ist. Habe allerdings auch keine wirklich treffenden Beispiele bei DP gefunden. Bei "win32_NetworkAdapterConfiguration" kommt z.B kein einziger Treffer obwohl du das Wort ja in deiner Antwort geschrieben hast. Ist wohl ein zu langes Wort.
|
Re: Anzeigen der IPAdresse UND Name der Verbindung
Zitat:
![]() ![]() |
Re: Anzeigen der IPAdresse UND Name der Verbindung
Den Adapternamen habe ich ja schon aber wie schaffe ich es zusätzlich die Ip als String zurück zu erhalten?
Wenn ich z.B. weiß dass "Intel Ethernet 100 Integrated Controller" mein Adapter zu LAN-Verbindung1 ist, soll er mir ausgeben welche IP dieser Adapter hat. Edit: In der WMI-Demo habe ich jetzt gefunden was ich brauche. In "Win32_NetworkAdapterConfiguration" gibt es "IPAdress" und "Description". Habe allerdings Probleme da ran zu kommen. Das Demo ruft ja sämtliche Klassen auf ich bräcuhte nur diese eine... |
Re: Anzeigen der IPAdresse UND Name der Verbindung
Liste der Anhänge anzeigen (Anzahl: 1)
Also ich hab mich jetzt mal ein wenig schlau gemacht und eine Methode gefunden über WMI die Adapterbezeichnug und auch die IP Adresse auszulesen. Allerdings habe ich noch ein Problem mit der Augabe der IPs. Wenn ich in meinem Testprogramm auf IP ausgeben klicke kommt die Fehlermeldung:
Zitat:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, WbemScripting_TLB, ActiveX, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; var l_Values: TStringList; implementation {$R *.dfm} function getWMIValue(WMI_CLASS:string;WMI_VALUE:string): TStringList; var l_WMILocator: ISWbemLocator; l_WMIServices: ISWbemServices; l_WMIObjectDefinition: ISWbemObject; l_WMIObjectSet: SWbemObjectSet; l_WMIObjectInstances: IEnumVariant; l_WMIObject: ISWbemObject; l_WMIPropertySet: ISWbemPropertySet; l_WMIProperty: ISWbemProperty; l_TempObj: OleVariant; l_ObjValue: Cardinal; begin result := TStringList.Create; l_WMILocator := CoSWbemLocator.Create; l_WMIServices := L_WMILocator.ConnectServer('.', 'root\CIMV2', '', '', '', '', 0, nil); l_WMIObjectDefinition := l_WMIServices.Get(WMI_CLASS, wbemFlagUseAmendedQualifiers, nil); l_WMIObjectSet := l_WMIObjectDefinition.Instances_(0, nil); l_WMIObjectInstances := (l_WMIObjectSet._NewEnum) as IEnumVariant; while (l_WMIObjectInstances.Next(1, l_TempObj, l_ObjValue) = S_OK) do begin l_WMIObject:= IUnknown(l_TempObj) as SWBemObject; l_WMIPropertySet := l_WMIObject.Properties_; l_WMIProperty := l_WMIPropertySet.Item(WMI_VALUE, 0); if not VarIsNull(l_WMIProperty.Get_Value) then result.Add(l_WMIProperty.Get_Value) else result.Add('<unbekannt>'); end; end; procedure TForm1.Button1Click(Sender: TObject); var x:integer; begin l_Values := getWMIValue('Win32_NetworkAdapterConfiguration','IPAddress'); for x:=0 to l_Values.Count-1 do begin ShowMessage(l_Values.Strings[x]); end; end; procedure TForm1.Button2Click(Sender: TObject); var x:integer; begin l_Values := getWMIValue('Win32_NetworkAdapter','Name'); for x:=0 to l_Values.Count-1 do begin ShowMessage(l_Values.Strings[x]); end; end; end. |
Re: Anzeigen der IPAdresse UND Name der Verbindung
hoi,
'IpAddress' selbst ist ne Liste mit den entsprechenden Elementen. Du müsstest also die Liste durchlaufen und dann jedes Element deiner Rückgabe-Liste hinzufügen. (Ich glaub so ists richtig) cya |
Re: Anzeigen der IPAdresse UND Name der Verbindung
Verstehe dich leider nicht ganz. Wie mache ich das mit der Liste durchlaufen? Verstehe auch nicht warum das eine Liste sein soll da es ja nur eine IP gibt und diese in der WMI Demo auch nur in einer Zeile aufgeführt ist eben genauso wie bei den Adapternamen usw.
|
Re: Anzeigen der IPAdresse UND Name der Verbindung
ein Adapter kann mehrere IpAdressen haben - alle IpAdressen werden in einer Liste gehalten, nicht in einem einzigen string
möglichkeit:
Delphi-Quellcode:
cya
if (WMI_VALUE='Name') then
begin if not VarIsNull(l_WMIProperty.Get_Value) then result.Add(l_WMIProperty.Get_Value) else result.Add('<unbekannt>'); end else // die IpAdressen begin if not VarIsNull(l_WMIProperty.Get_Value) then begin for i:=0 to VarArrayDimCount(l_WMIProperty.Get_Value) do // VarArrayDimCount müsste die Länge der Liste sein result.Add(l_WMIProperty.Get_Value[i]); end; end; |
Re: Anzeigen der IPAdresse UND Name der Verbindung
Hallo Soulis, erstmal danke für deine Geduld doch ich muss dir erneut sagen, dass ich dir leider nicht ganz folgen kann. Die "IPaddress" einer Instanz wird also nicht in einem String sondern in einem Array of Strings ausgegeben soviel habe ich glaube ich verstanden.
Ich habe mir jetzt eine andere laufende Funktion zusammengebastelt in der ich die Instanzen mit einem zuvor definierten Adapternamen "FAdapter" vergleiche. Sobald dieser gefunden wurde soll die IP-Adresse ausgelesen werden. Zum testen habe ich anstatt "IPAdress" einfach "SettingID" (ein anderes Atribut) genommen da hier ein String pro Instanz übergeben wird. Das ganze funktioniert soweit. Es gilt also "nur" nur noch das mit "Address" statt wie im Code zu sehen "SettingID" hinzubekommen. Da bräuchte eben noch Hilfe
Delphi-Quellcode:
function GetIPAddress : string;
var wmi : variant; wmiService : variant; nicstatus : variant; card : Olevariant; cnt : integer; Enum: IEnumVariant; P : IUnknown; F : Cardinal; cardCap : String; strSettingID : String; begin WMI:=CreateOleObject('WbemScripting.SWbemLocator'); wmiService := wmi.ConnectServer('.', 'root\CIMV2'); nicstatus := wmiService.InstancesOf('Win32_NetworkAdapterConfiguration'); p := nicstatus._NewEnum; p.QueryInterface(IEnumVariant, Enum); for cnt := 0 to nicstatus.Count - 1 do begin Enum.Next(1, card, F); cardCap := Copy(card.Caption, 12, MaxInt); if cardCap = FAdapter then //Wenn Adapter in der jeweiligen Instanz gleich von mir definierter Adapter begin strSettingID := card.SettingID; // statt card.SettingID müsste IPAddress stehen result := (cardCap + ' : ' + strSettingID); //hier der String mit der richtigen IP aus dem Array von IPAddress break; end end; end; |
Re: Anzeigen der IPAdresse UND Name der Verbindung
hoi,
Delphi-Quellcode:
und denn deine funktion
function getWMIValue(WMI_CLASS:string;WMI_VALUE:string;Adapter:string): string;
var l_WMILocator: ISWbemLocator; l_WMIServices: ISWbemServices; l_WMIObjectDefinition: ISWbemObject; l_WMIObjectSet: SWbemObjectSet; l_WMIObjectInstances: IEnumVariant; l_WMIObject: ISWbemObject; l_WMIPropertySet: ISWbemPropertySet; l_WMIProperty: ISWbemProperty; l_TempObj: OleVariant; l_ObjValue: Cardinal; i : integer ; begin Result := '' ; l_WMILocator := CoSWbemLocator.Create; l_WMIServices := L_WMILocator.ConnectServer('.', 'root\CIMV2', '', '', '', '', 0, nil); l_WMIObjectDefinition := l_WMIServices.Get(WMI_CLASS, wbemFlagUseAmendedQualifiers, nil); l_WMIObjectSet:= l_WMIServices.execquery('Select * from '+wmiClass+' where caption like '+#39+#37+Adapter+#39,'WQL',0,nil); l_WMIObjectInstances := (l_WMIObjectSet._NewEnum) as IEnumVariant; while (l_WMIObjectInstances.Next(1, l_TempObj, l_ObjValue) = S_OK) do begin l_WMIObject:= IUnknown(l_TempObj) as SWBemObject; l_WMIPropertySet := l_WMIObject.Properties_; l_WMIProperty := l_WMIPropertySet.Item(WMI_VALUE, 0); if not VarIsNull(l_WMIProperty.Get_Value) then begin for i:=0 to VarArrayDimCount(l_WMIProperty.Get_Value) do result := result + l_WMIProperty.Get_Value[i] + ' ; ' ; end; end; end;
Delphi-Quellcode:
function GetIPAddress : string;
var wmi : variant; wmiService : variant; nicstatus : variant; card : Olevariant; cnt : integer; Enum: IEnumVariant; P : IUnknown; F : Cardinal; cardCap : String; strSettingID : String; begin WMI:=CreateOleObject('WbemScripting.SWbemLocator'); wmiService := wmi.ConnectServer('.', 'root\CIMV2'); nicstatus := wmiService.InstancesOf('Win32_NetworkAdapterConfiguration'); p := nicstatus._NewEnum; p.QueryInterface(IEnumVariant, Enum); for cnt := 0 to nicstatus.Count - 1 do begin Enum.Next(1, card, F); cardCap := Copy(card.Caption, 12, MaxInt); if cardCap = FAdapter then //Wenn Adapter in der jeweiligen Instanz gleich von mir definierter Adapter begin result := getWMIValue('Win32_NetworkAdapterConfiguration','IPAddress',FAdapter); break; end end; end; auf die schnelle zusammen gebastelt ... cya |
Re: Anzeigen der IPAdresse UND Name der Verbindung
Hi soulies,
zunächst einmal DANKE! hätte nicht gedacht dass ich für die IP noch so eine große Funktion benötige :) Bisher lief mein Programm ohne zusätzliche Units wie WbemScripting_TLB welche ich nun eingebunden habe. Was muss denn noch eingebunden werden damit die Funktion läuft? Er bringt mir nämlich Zitat:
Delphi-Quellcode:
oder muss ich "wmiClass" noch deklarieren?
l_WMIObjectSet:= l_WMIServices.execquery('Select * from '+wmiClass+' where caption like '+#39+#37+Adapter+#39,'WQL',0,nil);
|
Re: Anzeigen der IPAdresse UND Name der Verbindung
Hi SaltJohn,
'wmiClass' sollte WMI_CLASS heißen, so wie in der Funktionsdeklaration:
Delphi-Quellcode:
Gruß
function getWMIValue(WMI_CLASS:string;WMI_VALUE:string;Adapter:string): string;
|
Re: Anzeigen der IPAdresse UND Name der Verbindung
Hallo Alter Mann, das wars vielen Dank für den Hinweis!
Das Programm läuft jetzt aber nur solange bis ich die Funktion aufrufe. Dann bricht er in der Zeile
Delphi-Quellcode:
ab
result := result + l_WMIProperty.Get_Value[i] + ' ; ' ;
mit der Meldung: Zitat:
|
Re: Anzeigen der IPAdresse UND Name der Verbindung
hi,
ich hab eben mal den code durchlaufen lassen - und bei mir hängt er sich net auf. Rückgabe der IPAdressen war OK. hab allerdings Fadapter/Adapter direkt eingetragen, da ich die variable net habe. Frage:
Delphi-Quellcode:
die zeichen davor, die du net mitkopierst entsprechen die : '[000000xx]' ?
cardCap := Copy(card.Caption, 12, MaxInt);
Was passiert wenn Du testweise auch den Adapter direkt einträgst ? cya |
Re: Anzeigen der IPAdresse UND Name der Verbindung
Moin soulies!
Zitat:
Habe es jetzt auch zum laufen bekommen. War wohl ein klassischer "off-by-one-error" bei mir. mit...
Delphi-Quellcode:
hat es dann funktioniert. Super :)
if not VarIsNull(l_WMIProperty.Get_Value) then
begin for i:=0 to VarArrayDimCount(l_WMIProperty.Get_Value)-1 do result := result + l_WMIProperty.Get_Value[i] + ' ; ' ; end; Was mir allerdings keine Ruhe läßt... Mich würde noch interessieren ob es nicht doch möglich ist die IPAdresse ohne "WbemScripting_TLB" einzubinden. Ich meine ich kann ja auf die Instanz zugreifen nur eben nicht auf den String. Edit: Leider zu früh gefreut... habe ich eben bemerkt dass es unter win2000 Probleme gibt. Es kommt die Fehlermeldung "Die Anfrage ist ungültig". Komisch... Die Klassen Caption und IPAddress sind in der WMI von Win2000 vorhanden. |
Re: Anzeigen der IPAdresse UND Name der Verbindung
hi,
Zitat:
dann damit zu arbeiten. ich mein: 1. programm start -> dos: z.B. 'ipconfig /all' -> output einfangen (funktion gibt es schon) 2. den output aufbereiten (ethernetadapter = Name der Verbindung, Adapter = Adapter Name, IpAdressen) 3. die aufbereiteten daten in einer liste halten und je nach wunsch drauf zugreifen wie gesagt, nur ne idee win2000 : wird hier wirklich alles gleich geschrieben ? testen kann ich es nicht ... cya |
Re: Anzeigen der IPAdresse UND Name der Verbindung
Leider nicht. Also eigentlich sollte es gehen habe die Klassen auf beiden Systemen mit WMI-Demo überprüft. Kannst du mir diesen Ausruck mal genauer erklären?
Delphi-Quellcode:
Was ich mit einer anderen Lösung meinte ist, dass ich immer noch nicht verstehe warum ich nicht alleine mit meiner Funktion an die IP-adresse rankomme.
'Select * from '+ WMI_ClASS +' where caption like '+#39+#37+Adapter+#39,'WQL',0,nil);
Man müsste doch nur irgendwie IPAddress so bearbeiten dass ich den String mit der IP erhalte.
Delphi-Quellcode:
function getIPAdr(nt: TNetworktype): string;
var wmi : variant; wmiService : variant; nicstatus : variant; card : Olevariant; cnt : integer; Enum: IEnumVariant; P : IUnknown; F : Cardinal; cardCap : String; IPAdresse : String begin WMI:=CreateOleObject('WbemScripting.SWbemLocator'); wmiService := wmi.ConnectServer('.', 'root\CIMV2'); nicstatus := wmiService.InstancesOf('Win32_NetworkAdapterConfiguration'); p := nicstatus._NewEnum; p.QueryInterface(IEnumVariant, Enum); for cnt := 0 to nicstatus.Count - 1 do begin Enum.Next(1, card, F); cardCap := Copy(card.Caption, 12, MaxInt); if cardCap = FAdapter[nt] then begin IPAdresse := //Hier muss irgendwie über card.IPAdress und einer umwandlung in String die IPAdresse initialisiert werden result := IPAdresse break; end end; end; |
Re: Anzeigen der IPAdresse UND Name der Verbindung
Zitat:
SQL-Code:
% = eine Wildcard, ein Platzhalter da davor ja noch [000000xx] steht - % in Verbindung mit like
Select * Win32_NetworkAdapterConfiguration Where Caption like '%SIS Ethernet Adapter'
Caption istals string abgelegt, deshalb in der anfrage das #39, man kann auch mit QuotedStr arbeiten letzlich will also alle daten haben wo der name des adapters 'SIS Ethernet ...' beinhaltet cya |
Re: Anzeigen der IPAdresse UND Name der Verbindung
ich glaub ich habs jetzt so wie du es willst ...
Delphi-Quellcode:
prüf mal ob es hinkommt, aber ob es unter w2000 läuft weiß ich net
function GetIPAddress : string;
var wmi : variant; wmiService : variant; nicstatus : variant; card : Olevariant; cnt : integer; Enum: IEnumVariant; P : IUnknown; F : Cardinal; cardCap : String; strSettingID : String; i : integer ; begin WMI:=CreateOleObject('WbemScripting.SWbemLocator'); wmiService := wmi.ConnectServer('.', 'root\CIMV2'); nicstatus := wmiService.InstancesOf('Win32_NetworkAdapterConfiguration'); p := nicstatus._NewEnum; p.QueryInterface(IEnumVariant, Enum); for cnt := 0 to nicstatus.Count - 1 do begin Enum.Next(1, card, F); cardCap := Copy(card.Caption, 12, MaxInt); if cardCap = FAdapter then //Wenn Adapter in der jeweiligen Instanz gleich von mir definierter Adapter begin //result := getWMIValue('Win32_NetworkAdapterConfiguration','IPAddress','Marvell%'); for i:=0 to vararraydimcount(card.ipaddress) do result := result + card.ipaddress[i] + ' ;' ; break; end end; end; cya |
Re: Anzeigen der IPAdresse UND Name der Verbindung
Hi, perfekt! genau das isses :) Jetzt läuft soweit alles sowohl auf XP als auch auf 2k und ganz ohne zusätzliche Units. Danke!
Noch ne Frage: Die Leerstelle mit Semikolon hast du gemacht falls es mehrere IPs gibt oder? Anstatt
Delphi-Quellcode:
ginge doch auch
result := result + card.ipaddress[i] + ' ;' ;
Delphi-Quellcode:
oder?
result := result + card.ipaddress[i];
|
Re: Anzeigen der IPAdresse UND Name der Verbindung
Zitat:
Zitat:
aber das kannst du ja bequem über vararraydimcount eingrenzen cya |
Re: Anzeigen der IPAdresse UND Name der Verbindung
Hi soulies,
läuft jetzt wirklich rund. Nochmal vielen Dank für die Hilfe und Geduld! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz