![]() |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 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