Ip Adresse einer bestimmten Netzwerkverbindung auslesen

  • Hallo
    Hab die frage schon in der Shoutbox gestellt, da ich hier aber meine Situation besser beschreiben kann das ganze nochmal.

    Ich suche die Ip Adressen von einer namentlich bekannten Verbindunge (sie heißt Fernwartung), insgesammt haben die PC´s auf denen das Skript laufen soll 5 verschiedene Verbindungen.
    Mit @IPAddress1 bis @IPAddress4 kann ich mir zwar die IP-Adressen der ersten 4 Verbindungen anzeigen lassen, Soweit ich weiß kann Ich jedoch nicht mit Sicherheit sagen ob meine gesuchte Verbindung bei jedem PC an der selben Stelle liegt. Sprich ich weis nicht mit Sicherheit ob auf pc A: @IPAddress2 die Adresse von Fernwartung zurückgibt und auf Pc B: vielleicht @IPAddress3 die richtige Verbindung ist

    Ich bräucht da halt ne Funktion der ich den bekannten Namen übergebe und die mir dann die IP dieser zurückgibt
    so etwa nach dem Motto:
    $GefundeneIP = getIP("Fernwartung")

    Gibt es da etwas in der Art? Und wenn nicht wie kann ich mir dann so etwas selbs machen?

    Einmal editiert, zuletzt von hanswurst (24. Juli 2008 um 10:26)

    • Offizieller Beitrag

    Ich habe Dir mal eine Funktion geschrieben:

    Spoiler anzeigen
    [autoit]


    MsgBox(0, 'Test', GetIP('Fernwartung'))

    [/autoit] [autoit][/autoit] [autoit]

    Func GetIP($AdapterName)
    Local $objWMIService = ObjGet('winmgmts:\\localhost\root\CIMV2'), $Output = 0
    Local $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapter WHERE Netconnectionstatus = 2', 'WQL', 0x30)
    If IsObj($colItems) Then
    For $objItem In $colItems
    Local $colItems2 = $objWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration', 'WQL', 0x30)
    If IsObj($colItems2) Then
    For $objItem2 In $colItems2
    If $objItem.Caption = $objItem2.Caption Then
    If $objItem.NetConnectionID = $AdapterName Then
    $Output = $objItem2.IPAddress(0)
    EndIf
    EndIf
    Next
    EndIf
    Next
    EndIf
    Return $Output
    EndFunc

    [/autoit]
  • Ohne WMI kannst du ja mal probieren, da was draus zu machen :)

    Spoiler anzeigen
    [autoit]

    #include <Memory.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $tagIP_ADDRESS_STRING = "char String[16];"
    $tagIP_MASK_STRING = $tagIP_ADDRESS_STRING
    $tagIP_ADDR_STRING = "ptr Next;" & $tagIP_ADDRESS_STRING & $tagIP_MASK_STRING & "DWORD Context;"

    [/autoit] [autoit][/autoit] [autoit]

    $tagIP_ADAPTER_INFO = "long_ptr Next; DWORD ComboIndex; char AdapterName[260];char Description[132]; UINT AddressLength; BYTE Address[8]; dword Index; UINT Type;" & _
    " UINT DhcpEnabled; ptr CurrentIpAddress; ptr NextIpAddressList; char IpAddressListADDRESS[16]; char IpAddressListMASK[16]; DWORD IpAddressListContext; " & _
    "ptr GatewayListList; char GatewayListADDRESS[16]; char GatewayListMASK[16]; DWORD GatewayListContext; " & _
    "ptr DhcpServerList; char DhcpServerADDRESS[16]; char DhcpServerMASK[16]; DWORD DhcpServerContext; " & _
    "int HaveWins; " & _
    "ptr PrimaryWinsServerList; char PrimaryWinsServerADDRESS[16]; char PrimaryWinsServerMASK[16]; DWORD PrimaryWinsServerContext; " & _
    "ptr SecondaryWinsServerList; char SecondaryWinsServerADDRESS[16]; char SecondaryWinsServerMASK[16]; DWORD SecondaryWinsServerContext; " & _
    "DWORD LeaseObtained; DWORD LeaseExpires;"

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $dll = DllOpen("Iphlpapi.dll")
    $ret = DllCall($dll,"dword","GetAdaptersInfo","ptr",0,"dword*",0)
    ;~ $adapterBuffer = _MemGlobalAlloc($ret[2],$GHND)
    ;~ $adapterBuffer_pointer = _MemGlobalLock($adapterBuffer)
    $adapterBuffer = DllStructCreate("byte[" & $ret[2] &"]")
    $adapterBuffer_pointer = DllStructGetPtr($adapterBuffer)
    $return = DllCall($dll,"dword","GetAdaptersInfo","ptr",$adapterBuffer_pointer,"dword*",$ret[2])
    $adapter = DllStructCreate($tagIP_ADAPTER_INFO,$adapterBuffer_pointer)

    [/autoit] [autoit][/autoit] [autoit]

    Do
    ConsoleWrite("-------------------------------------" & @CRLF)
    ConsoleWrite("Adapter: " & _Get($adapter,7) & @CRLF)
    ConsoleWrite("Description: " & _Get($adapter,"Description") & @CRLF)
    ConsoleWrite("IpAddressListADDRESS: " & _Get($adapter,"IpAddressListADDRESS") & @CRLF)
    ConsoleWrite("-------------------------------------" & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    $ptr = DllStructGetData($adapter,"Next")
    $adapter = DllStructCreate($tagIP_ADAPTER_INFO,$ptr)
    Until @error
    ;~ _MemGlobalUnlock($adapterBuffer)
    ;~ _MemGlobalFree($adapterBuffer)
    $adapterBuffer = ""
    $adapterBuffer_pointer = ""
    DllClose($dll)

    [/autoit] [autoit][/autoit] [autoit]

    ; zur Übersicht :)
    Func _Get(ByRef $adapter,$ID)
    Return DllStructGetData($adapter,$ID)
    EndFunc

    [/autoit]


    Und schau dir mal das an ( hab ich erst später gefunden und mir fast die ganze Arbeit nochmal gemacht :( http://www.autoitscript.com/forum/index.php?s=&showtopic=69936&view=findpost&p=513225 )

  • Erst mal Danke bis hier her,

    Oscar deine Funktion läuft Prima auf den Rechner mit dem ich Programmiere, aber aus irgend einen Grund nicht auf den Rechner auf den das Skript später ausgeführt werden soll. Die Länder und Spracheinstellungen sind bei dem auf English(US) sehe aber aus dem Skript herraus keinen Grund warum es deswegen nicht laufen sollte

    @Proandy Hab mich noch nicht mit deine Lösung beschäftigt, werd´s aber noch machen

  • Auf beiden läuft Win XP Professional mit Service Pack2.
    Auf dem wo es nicht läuft halt nur in Englisch

  • hab das mal mit verschiedene Verbindungen ausprobiert wenn Die verbindung existiert ist der Rückgabewert 0.0.0.0 wenn sie nicht existiert ist sie 0
    ach ja hab eine kleine änderung vorgenommen ohne sie war der Rückgabewert auf den zweiten Rechner immer 0


    Spoiler anzeigen
    [autoit]


    MsgBox(0, 'Test', GetIP("LAN-Verbindung"));Lan Verbindung des ersten Rechners ;Hier funktionierte es
    MsgBox(0, 'Test', GetIP("EtherCAT (4X)"));Lan Verbindung des zweiten Rechners rückgabewert 0.0.0.0
    MsgBox(0, 'Test', GetIP("EtherCAT,Reundanz (3X)"));Lan Verbindung des zweiten Rechners 0 (Hab mich beim Namen verschrieben)
    MsgBox(0, 'Test', GetIP("Fernwartung (Onboard)"));Lan Verbindung des zweiten Rechners rückgabewert 0.0.0.0
    MsgBox(0, 'Test', GetIP("RT_Ethernet Ablagen, Arcomat, AD, AM (1X)"));Lan Verbindung des zweiten Rechners rückgabewert 0.0.0.0

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func GetIP($AdapterName)
    Local $objWMIService = ObjGet('winmgmts:\\localhost\root\CIMV2'), $Output = 0
    Local $colItems = $objWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapter', 'WQL', 0x30); Hab mal diese Zeile verändert jetzt wird 0.0.0.0 ausgegeben
    If IsObj($colItems) Then
    For $objItem In $colItems
    Local $colItems2 = $objWMIService.ExecQuery('SELECT * FROM Win32_NetworkAdapterConfiguration', 'WQL', 0x30)
    If IsObj($colItems2) Then
    For $objItem2 In $colItems2
    If $objItem.Caption = $objItem2.Caption Then
    If $objItem.NetConnectionID = $AdapterName Then
    $Output = $objItem2.IPAddress(0)
    EndIf
    EndIf
    Next
    EndIf
    Next
    EndIf
    Return $Output
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]

    P.S. Werd gleich Feierabend machen kuck dann nachher zuhause noch mal rein. Danke schon mal für die Hilfe bis jetzt

  • Hallo
    Gehe jetzt einen ganz anderen weg. Ich lasse mir mit netsh die Verbindungsdaten anzeigen und lese diese als String ein.
    Jetzt muss ich aus diesen String hat nur noch irgendwie die IP Adresse separieren

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <Constants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "", IPaddress("LAN-Verbindung 2"))
    MsgBox(0, "", IPaddress("EtherCAT (4X)"))
    MsgBox(0, "", IPaddress("EtherCAT,Reundanz (3X)"))
    MsgBox(0, "", IPaddress("Fernwartung (Onboard)"))

    [/autoit] [autoit][/autoit] [autoit]

    Func IPaddress($Name)
    $foo = Run('netsh interface IP Show address name = "'&$Name&'"',"","", $STDERR_CHILD + $STDOUT_CHILD)
    $String =""
    While 1
    $String &= StdoutRead($foo)
    If @error Then ExitLoop
    Wend
    Return $String

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Di IP mit StringRegExp :) In deiner Func statt dem Return diese 3 Zeilen:

    [autoit]

    Local $reg = StringRegExp($String,"IP.*?:\h*?([0-9.]+)",1)
    If @error Then Return SetError(1,0,"0.0.0.0")
    Return $reg[0]

    [/autoit]


    Und teste doch mal das, ist um einiges schneller :)

    Spoiler anzeigen
    [autoit]

    Global Const $tagIP_ADAPTER_INFO = "ptr Next; DWORD ComboIndex; char AdapterName[260];char Description[132]; UINT AddressLength; BYTE Address[8]; dword Index; UINT Type;" & _
    " UINT DhcpEnabled; ptr CurrentIpAddress; ptr IpAddressListNext; char IpAddressListADDRESS[16]; char IpAddressListMASK[16]; DWORD IpAddressListContext; " & _
    "ptr GatewayListNext; char GatewayListADDRESS[16]; char GatewayListMASK[16]; DWORD GatewayListContext; " & _
    "ptr DhcpServerNext; char DhcpServerADDRESS[16]; char DhcpServerMASK[16]; DWORD DhcpServerContext; " & _
    "int HaveWins; " & _
    "ptr PrimaryWinsServerNext; char PrimaryWinsServerADDRESS[16]; char PrimaryWinsServerMASK[16]; DWORD PrimaryWinsServerContext; " & _
    "ptr SecondaryWinsServerNext; char SecondaryWinsServerADDRESS[16]; char SecondaryWinsServerMASK[16]; DWORD SecondaryWinsServerContext; " & _
    "DWORD LeaseObtained; DWORD LeaseExpires;"

    [/autoit] [autoit][/autoit] [autoit]

    Func _IPbyAdapterName($DisplayName)
    Local $dll, $ret, $adapterBuffer, $adapterBuffer_pointer, $return, $adapter, $ptr, $TempDisplayName,$FoundIP
    $dll = DllOpen("Iphlpapi.dll")
    $ret = DllCall($dll, "dword", "GetAdaptersInfo", "ptr", 0, "dword*", 0)

    [/autoit] [autoit][/autoit] [autoit]

    $adapterBuffer = DllStructCreate("byte[" & $ret[2] & "]")
    $adapterBuffer_pointer = DllStructGetPtr($adapterBuffer)
    $return = DllCall($dll, "dword", "GetAdaptersInfo", "ptr", $adapterBuffer_pointer, "dword*", $ret[2])
    $adapter = DllStructCreate($tagIP_ADAPTER_INFO, $adapterBuffer_pointer)
    If Not @error Then
    Do
    $TempDisplayName = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\" & DllStructGetData($adapter, "AdapterName") & "\Connection", "Name")
    If $TempDisplayName = $DisplayName Then
    $FoundIP = DllStructGetData($adapter, "IpAddressListADDRESS")
    ExitLoop
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $ptr = DllStructGetData($adapter, "Next")
    $adapter = DllStructCreate($tagIP_ADAPTER_INFO, $ptr)
    Until @error
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $adapterBuffer = ""
    $adapterBuffer_pointer = ""
    DllClose($dll)
    If $FoundIP = "" Then Return SetError(1, 0, "0.0.0.0")
    Return $FoundIP
    EndFunc ;==>_IPbyAdapterName

    [/autoit] [autoit][/autoit] [autoit]

    ;EXAMPLE ###########################################################
    MsgBox(0, '', _IPbyAdapterName("Drahtlose Netzwerkverbindung"))
    ;EXAMPLE ###########################################################

    [/autoit]

    Einmal editiert, zuletzt von progandy (24. Juli 2008 um 10:22)

  • Danke Progandy. Hatte schon versucht mir mit Stringsplit das selber hinzubiegen, Aber deine lösung ist natürlich besser.
    Verseh zwar das Suchmuster von StringRegExp nicht so ganz aber da wert ich mich wohl noch mit der AutoIt Hilfe beschäftigen.

    Danke noch mal auch an Der_Doc und Oscar

  • Das Suchmuster is folgendermaßen aufgebaut:

    Code
    IP   --> suchst nach dem String IP
    .*?  --> dann beliebige Zeichen, bis
    :    --> ein Doppelpunkt kommt
    \h*? --> dann beliebig viele horizontale whitespaces ( leerzeiche, tabs... )
    (    --> starte Gruppe, die zurückgegeben werden soll
    [0-9.]+ --> mindestens 1 Zeiche aus der Gruppe [0-9.], d.h Zahlen und Punkt,
                       jedoch so viele Zeichen wie möglich
    )    --> Ende der Grupoe