Zuverlässig eigene IP auslesen?

  • Hey Leute,

    ich habe mal eine Frage zum zuverlässigen Auslesen der eigenen IP. Kein großes Problem, aber ein nerviges Thema für mich.

    @IPAddress1 gibt ja die erste Netzwerkverbindung aus. Bei mir wird darunter aber die virtuelle Netzwerkkarte vom installierten VMware angezeigt. Daher hielt ich das für zu unsicher und lasse Nutzer die IP Adresse des eigenen Rechners eintragen, was mir das ein oder andere belustigte Schmunzeln einbringt.

    Weiß jemand eine Methode, mit der ich die IP des genutzten Netzwerkadapters zuverlässig ermitteln kann?

    Grüße autoiter

  • Ich hab nicht wirklich genau verstanden was jetzt die VM an der IP ändert? aber vielleicht geht ja das hier:

    Spoiler anzeigen
    [autoit]

    TCPStartup()
    MsgBox(0, "IP Adresse:", TCPNameToIP(@ComputerName))
    TCPShutdown()

    [/autoit]

    LG Phil

  • Scheinbar zeigt die @IPAddress1 immer auf die IP-Adresse, des 'ersten' dem System bekannten Adapters.
    Wenn zum Beispiel das System aus einem Image installiert wurde welches bereits VMWare enthielt, sind dessen Adapter aber scheinbar in der Reihenfolge vorn. Habe ich auch bei einigen unserer Systeme bemerkt.

    Nur zur möglichen Ursache ... Eine Lösung fällt mir jetzt aber auch nicht ein.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Mithilfe von PHP kannst du die letztendlich sichtbare IP Adresse ausgeben lassen. Dafür gibt's schon Seiten. Googel einfach mal nach "Wie ist meine IP" oder so. Du brauchst dann lediglich von dem AutoIt Skript die Seite aufrufen und die IP Adresse im Quelltext der Seite auslesen. Ich hoffe ich habe dich nicht missverstanden. LG :)

  • Danke dir ShitDown,
    Da habe ich mich vielleicht auch undeutlich ausgedrückt. Es geht mir aber leider um die (netzwerk)interne IP Adresse des Computers.

    Grüße autoiter

  • Ich habe eben mal die Registry durchsucht. Da gibt es unter
    "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\Tcpip\Parameters\Interfaces\" den Schlüssel "DhcpIPAddress".
    Ich werde mal testen, wie das bei festen IPs aussieht. Vielleicht ist es eine Alternative, den Registry Schlüssel abzufragen, falls das auf allen Systemen klappt.

    Grüße autoiter

  • Möglicherweise ist es brauchbar, die IP-Adresse mit dem Std-Gateway zu verwenden ?! z.B. so:

    Spoiler anzeigen
    [autoit]

    MsgBox(0,"Active IP", _ActiveIP())

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

    Func _ActiveIP($sHost = ".")
    Local $objAdapter
    Local $objWMIService = ObjGet("winmgmts:{impersonationLevel = impersonate}!\\" & $sHost & "\root\cimv2")
    If Not IsObj($objWMIService) Then Return SetError(1, 0, 0)
    Local $colAdapter = $objWMIService.ExecQuery("Select * From Win32_NetworkAdapterConfiguration WHERE IPEnabled = True", "WQL", 0x30)
    If IsObj($colAdapter) Then
    For $objAdapter In $colAdapter
    If IsString($objAdapter.IPAddress(0)) Then
    If IsString($objAdapter.DefaultIPGateway(0)) Then
    Return $objAdapter.IPAddress(0)
    Endif
    EndIf
    Next
    EndIf
    Return SetError(1, 0, 0)
    EndFunc

    [/autoit]

    Wobei: Existieren mehrere aktive Adapter mit eingetragenem (oder DHCP) Gateway, wird bei obigem Besipiel auch nur die erste zurückgegeben !

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    3 Mal editiert, zuletzt von Micha_he (19. Februar 2015 um 14:47)

  • Das Problem mit den virtuellen Adaptern der VMs hatte ich hier auch schon des Öfteren. Aber wieso ignoriert ihr denn Phil-IT' Antwort so? Bei mir funktioniert das perfekt...

    Spoiler anzeigen
    [autoit]

    ConsoleWrite(@IPAddress1 & @LF)
    ConsoleWrite(@IPAddress2 & @LF)
    ConsoleWrite(@IPAddress3 & @LF)
    ConsoleWrite(@IPAddress4 & @LF)
    ConsoleWrite("-" & @LF)
    TCPStartup()
    ConsoleWrite(TCPNameToIP(@ComputerName) & @LF)
    TCPShutdown()

    [/autoit]

    LG
    Christoph :)

  • @Christoph54
    Danke dir und auch Phil-IT. Bei dir funktioniert das perfekt. Allerdings gibt bei dir @IPAddress1 sicher auch das erhoffte Ergebnis aus, oder?
    In meinem Fall ist das nicht so. Mein genutzter Netzwerkadapter ist @IPAdress3 und der wird auch über Phil-ITs Weg nicht ausgespuckt..

    @Micha_he
    Das funktioniert! Ich hatte auch über das Standardgateway nachgedacht, da wenigstens die VMs das ja nicht nutzen. Dein Skript hätte ich aber nicht ansatzweise fabriziert. Vielen Dank. Ich werde das jetzt mal auf verschiedenen Rechnern testen und hoffe, dass es hier eine ausreichend gute Lösung ist. :thumbup:

    Grüße autoiter

    • Offizieller Beitrag

    Hier noch eine Möglichkeit, den Benutzer die Auswahl zu überlassen:

    Spoiler anzeigen
    [autoit]


    #include <ComboConstants.au3>
    #include <WindowsConstants.au3>

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

    $sIPAdress = _IPAdressUserInput()
    ConsoleWrite($sIPAdress & @CR)

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

    Func _IPAdressUserInput($hParent = 0)
    Local $sIPAdress = '', $hGui, $idCombo, $idOk, $iOldGuiMode
    $sIPAdress &= @IPAddress1 <> '0.0.0.0' ? @IPAddress1 & '|' : ''
    $sIPAdress &= @IPAddress2 <> '0.0.0.0' ? @IPAddress2 & '|' : ''
    $sIPAdress &= @IPAddress3 <> '0.0.0.0' ? @IPAddress3 & '|' : ''
    $sIPAdress &= @IPAddress4 <> '0.0.0.0' ? @IPAddress4 & '|' : ''
    $sIPAdress = StringTrimRight($sIPAdress, 1)
    ;~ If Not StringInStr($sIPAdress, '|') Then Return $sIPAdress ; <- diese Zeile aktivieren, wenn man bei nur einer IP-Adresse die Auswahlbox nicht anzeigen lassen will
    $hGui = GUICreate('IP-Adresse auswählen', 290, 150, -1, -1, BitOR($WS_CAPTION, $WS_POPUP), -1, $hParent)
    GUISetBkColor(0xDDDDDD)
    GUICtrlCreateGroup('Bitte die richtige IP-Adresse auswählen:', 10, 20, 270, 80)
    GUICtrlSetFont(-1, 10, 400, 0, 'Tahoma', 5)
    $idCombo = GUICtrlCreateCombo('', 50, 50, 190, 36, $CBS_DROPDOWNLIST)
    GUICtrlSetData(-1, $sIPAdress, StringRegExpReplace($sIPAdress, '(\d+\.\d+\.\d+\.\d+).*', '$1'))
    GUICtrlSetFont(-1, 14, 800, 0, 'Courier New', 5)
    $idOk = GUICtrlCreateButton('Ok', 110, 110, 70, 28)
    GUICtrlSetFont(-1, 12, 400, 0, 'Arial', 5)
    GUISetState()
    $iOldGuiMode = Opt('GUIOnEventMode', 0)
    Do
    Until GUIGetMsg() = $idOk
    $sIPAdress = GUICtrlRead($idCombo)
    GUIDelete($hGui)
    Opt('GUIOnEventMode', $iOldGuiMode)
    Return $sIPAdress
    EndFunc

    [/autoit]
  • Stimmt. Das ist sicher das Beste. Super Oscar. Wieder einmal meinen Dank :)

    EDIT: Das kann man noch gut mit dem Skript von Micha_he verbinden, um die für mich wahrscheinlichste IP zu Anfang zu stellen (falls die Auswahl überhaupt nötig ist und mehrere Adapter gefunden wurden).
    Vielen Dank Leute!

    Grüße autoiter

  • Kannst ja dies mal testen:

    [autoit]


    $sHost = @ComputerName
    MsgBox(0, "Test", "IP: " & WMI_GetIPFromActiveNetworkAdapters($sHost))

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

    Func WMI_GetIPFromActiveNetworkAdapters($sHost)
    Local $objWMIService = ObjGet("winmgmts:\\" & $sHost & "\root\cimv2")
    If @error Then Return SetError(1, 0, 0)
    $colItems = $objWMIService.ExecQuery("SELECT IPAddress FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=True AND IPConnectionMetric=25", "WQL", 0x30)
    If IsObj($colItems) Then
    For $objItem in $colItems
    With $objItem
    If IsArray(.IPAddress) Then Return .IPAddress[0]
    EndWith
    Next
    Else
    Return SetError(2, 0, 0)
    EndIf
    EndFunc

    [/autoit]

    Auf meiner Kiste mit WLAN, LAN, VMware und VirtualBox funktioniert es, wobei die WLAN nur aktiv ist.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Es scheint, als ob bei dir die IPConnectionMetric nicht 25 ist.

    Bei mir sind 4 Adapter gelistet, wobei nur die Aktive auf 25 steht und der Rest auf 20.

    Du kannst ja mal Scriptomatic anschmeißen und sehen, was bei dir gelistet wird.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Ja, scheinbar habe ich andere Werte. Aber meinen Ergebnissen vertraue ich nicht. Ich habe das Tool zum ersten Mal benutzt. Ausgewählt habe ich Win32_NetworkAdapterConfiguration. Dabei kam bei mir zweimal der Wert 20 und zweimal nichts..

    Siehe zweite Zeile im Bild.

    Grüße autoiter

  • Alternativ probiere mal dies aus:

    [autoit]

    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=True AND NOT Description LIKE '%Virtual%' AND DNSDomain<>''", "WQL", 0x30)

    [/autoit]

    Hier werden die virtuellen Adapter ausgelassen und DNSDomain darf nicht leer sein.

    IPConnectionMetric scheint nicht akkurat zu sein.

    Edit: habe noch DNSDomain<>'' hinzugefügt.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    Einmal editiert, zuletzt von UEZ (19. Februar 2015 um 22:36)

  • Noch eine Variante von UEZ's Idee mit 'IPConnectionMetric'. Suchen wir einfach die kleinste...

    Spoiler anzeigen
    [autoit]

    MsgBox(0,"Low Metric IP", _LowMetricIP())

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

    Func _LowMetricIP($sHost = ".")
    Local $objAdapter, $iMetric = 500, $sActualIP
    Local $objWMIService = ObjGet("winmgmts:{impersonationLevel = impersonate}!\\" & $sHost & "\root\cimv2")
    If Not IsObj($objWMIService) Then Return SetError(1, 0, 0)
    Local $colAdapter = $objWMIService.ExecQuery("Select * From Win32_NetworkAdapterConfiguration WHERE IPEnabled = True", "WQL", 0x30)
    If IsObj($colAdapter) Then
    For $objAdapter In $colAdapter
    If $objAdapter.IPConnectionMetric < $iMetric And IsString($objAdapter.DefaultIPGateway(0)) Then ; ggf. kann auch die Gateway-Prüfung entfallen !
    $sActualIP = $objAdapter.IPAddress(0)
    $iMetric = $objAdapter.IPConnectionMetric
    EndIf
    Next
    If $sActualIP Then Return $sActualIP
    EndIf
    Return SetError(2, 0, 0)
    EndFunc

    [/autoit]

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    2 Mal editiert, zuletzt von Micha_he (19. Februar 2015 um 23:57)

  • Hallo Leute,

    beides funktioniert beim ersten Test. Also sowohl das angepasste $colItems von UEZ, als auch das Skript von Micha_he. Ich muss das erst weiter testen, aber es sieht super aus.
    Vielen Dank. :)

    Grüße autoiter