Ermitteln der eingerichteten DNS-Server, des Adapters und der IP-Adresse eines Servers, ohne WMI...

  • Hallo,

    ich habe da ein Problem die eingetragenen DNS-Server, das Adapter und die IP-Adresse eines Servers (oder auch Clients) auszulesen.
    Diese Daten sollen dann, neben noch ein paar anderen Info's (ping results...) als einfacher auslebarer Wert in die Registry geschrieben werden.

    Nun funktioniert meine Lösung eigentlich Das Auslesen der Werte klappt, der Ping klappt und das Schreiben in die Registry auch.
    Aber leider nur unter Windows XP, Vista, W7 und W2K3 (meistens), weil ich dort WMI nutzen kann. Es muss aber auch auf (bitte nicht lachen!!!) Windows 2000 Servern 8| funktionieren und dort ist mit WMI nix... ?(

    Nun kann ich die IP-Adresse(n) des Rechners ermitteln (solange die OS-Sprache mitspielt)
    Beispiel für einen deutschen Client: ("IP-Adresse" anstelle von "IP Address")

    Code
    #include <Constants.au3>
    
    
    Local $PID = Run(@ComSpec & ' /c ipconfig /all|find "IP-Adresse"', "", @SW_HIDE, $STDOUT_CHILD)
    Local $line
    While 1
    	$line &= StdoutRead($PID)
    	If @error Then ExitLoop
    Wend
    MsgBox(0, "IP-Adresse:", $line)

    Auch die erste DNS-Server-Adresse bekomme ich noch heraus,
    Beispiel für einen deutschen Client: ("DNS-Server" anstelle von "DNS Server")

    Code
    #include <Constants.au3>
    Local $PID = Run(@ComSpec & ' /c ipconfig /all|find "DNS-Server"', "", @SW_HIDE, $STDOUT_CHILD)
    Local $line
    While 1
    	$line &= StdoutRead($PID)
    	If @error Then ExitLoop
    Wend
    MsgBox(0, "DNS-Server:", $line)

    ABER:
    Den zweiten DNS Server (oder Dritten?) den es ggfs. gibt (bei uns meistens), den bekomme ich nicht.

    Die Beschreibung/Description des Adapters bekomme ich auf die gleiche Art, wie die IP, allerdings empfinde ich das dann doch als etwas "anstrengend",
    zumal die Zuordnungen Adapter - IP-Adresse - DNS-Server so nicht mehr erkennbar sind.

    Also, Alles in einen Array, doch:

    • wie füllt man diesen Array am geschicktesten, die Ausgabe von z. B. IPCONFIG /ALL oder netsh... zeilenweise als Arrayelement? (kann man die Ausgabe überhaupt so umbiegen?)
    • wie geht man diesen Array dann durch? Schließlich sind die einzelnen Werte nicht immer vorhanden...die Positionen können verschoben sein

    Oder habt ihr vielleicht noch eine Idee, wie man das Problem lösen kann ohne WMI zu benutzen?

    mfg
    Axel

    (etwas gefrustet, weil eigentlich letzte Nacht schon fertig...)

    There exist 10 different kind of people on earth.
    Those who understand binary, and those who don't.

  • Danke für die Antwort...;(

    ok, harter Tobak... :)

    Du erstellst eine XML Datei/Ausgabe mit diversen Info's, die der Ausgabe von ipconfig /all ähneln, darüber aber hinausgehen. Nur die DNS-Einträge kann ich nicht finden...

    Wenn ich es jetzt richtig verstanden habe, muss ich "nur" die geeignete Funktion in der IPHLPAPI.DLL finden, die mir meine DNS-Server zurückgibt.

    Ich habe jetzt versucht mit dem DependencyWalker die Funktionen der IPHLPAPI.DLL anzuschauen und die Verweise auf der MS Seite zu verstehen, konnte jedoch bislang nix zu den DNS Settings finden.
    http://msdn.microsoft.com/en-us/library/…28VS.85%29.aspx

    Beim Regkey $NETWORK_REG_KEY bin ich mir nicht sicher, ob alle Unterkeys und Einträge vorhanden sind, speziell z. B. MediaSubType ist nicht unter W2K vrohanden(zumindest auf dem Server, auf dem ich nachgesehen habe)

    Aber mir reicht es ja schon, wenn ich die DNS-Server der Adapter hätte...

    Das wird dann wohl ein "Such"-Abend...

    mfg
    Axel

    There exist 10 different kind of people on earth.
    Those who understand binary, and those who don't.

  • Hi,
    also ich würde das über IPCONFIG /all versuchen.
    Ich nutze das auch oft. Mit StringInString und StringMid kommt man super weiter und man ist Betriebssystem (Win) relativ unabhängig.

    So könnte man sogar Linuxrechner auslesen.

    MfG
    Der_Doc

  • Kannst mal das hier versuchen, weiß aber nicht ob es wirklich auch unter 2000 läuft

    Spoiler anzeigen
    [autoit]

    ;######################################################################################################
    ;# Function Name: _GetAllNetAdapterInfo()
    ;# Description:: Auslesen aller vorhandenen Netzwerkadapter und deren Konfiguration
    ;# Parameter(s): keine
    ;# Requirement(s): keine
    ;# Return Value(s): Erfolg Array[0][0] Anzahl der Adapter
    ;# Array[n][0] Adapter Name (wie in Systemsteuerung ==> Netzwerkverbindungen)
    ;# Array[n][1] Adapter Beschreibung
    ;# Array[n][2] IP-Adresse
    ;# Array[n][3] SubNetMask
    ;# Array[n][4] DHCP-Enabled (0/1)
    ;# Array[n][5] DHCP IP-Adresse
    ;# Array[n][6] DHCP SubNetMask
    ;# Array[n][7] DHCP Default Gateway
    ;# Array[n][8] DHCP Server
    ;# Array[n][9] DNS Server (kommagetrennt)
    ;# Fehler Array[0][0] Leerstring (kein Adapter vorhanden)
    ;# Author(s): Bitboy, nach einer Idee von BugFix ([email='bugfix@autoit.de'][/email])
    ;######################################################################################################
    Func _GetAllNetAdapterInfo()
    Local $infoarr[1][10], $keyarr[1], $i=0, $x=0, $counter=0, $tmp, $tmp2, $short

    ;Registrierte Adapter zählen
    While 1
    $i = $i + 1
    $tmp = RegEnumKey("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services", $i)
    If @error <> 0 then ExitLoop

    ;Adapter sind in den einzigen Schlüsseln die mit "{" beginnen
    If StringInStr($tmp,"{") Then
    $short = 1 ;Merker zum Verkürzen der Schleife da Keys alphabetisch sortiert
    $counter = $counter + 1
    Redim $keyarr[$counter+1]
    $keyarr[$counter] = $tmp ;Speichern der Adapterschlüssel
    $keyarr[0] = $counter
    Else
    If $short = 1 Then ExitLoop
    EndIf
    WEnd

    ;Funktion verlassen wenn kein Adapter gefunden wurde
    If $counter = 0 Then
    $infoarr[0][0] = 0
    Return $infoarr
    EndIf

    ;Rückgabearray an Adapterzahl anpassen
    Redim $infoarr[$counter+1][10]
    $infoarr[0][0] = $counter

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

    ; TCP-Informationen auslesen
    For $i = 1 to $counter
    $infoarr[$i][2] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $keyarr[$i] & '\Parameters\Tcpip', 'IPAddress')
    $infoarr[$i][3] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $keyarr[$i] & '\Parameters\Tcpip', 'SubnetMask')
    $infoarr[$i][4] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $keyarr[$i] & '\Parameters\Tcpip', 'EnableDHCP')
    $infoarr[$i][5] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $keyarr[$i] & '\Parameters\Tcpip', 'DhcpIPAddress')
    $infoarr[$i][6] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $keyarr[$i] & '\Parameters\Tcpip', 'DhcpSubnetMask')
    $infoarr[$i][7] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $keyarr[$i] & '\Parameters\Tcpip', 'DhcpDefaultGateway')
    $infoarr[$i][8] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $keyarr[$i] & '\Parameters\Tcpip', 'DhcpServer')
    $infoarr[$i][9] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\' & $keyarr[$i], 'NameServer')
    Next

    ;Adapternamen auslesen
    $i = 1
    $short = 0
    While 1
    $tmp = RegEnumKey("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}",$i)
    If @error <> 0 then ExitLoop

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

    $tmp2 = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\" & $tmp, "NetCfgInstanceId")
    For $x = 1 To $counter

    ;Zugeordnete Verbindung auslesen
    $infoarr[$x][1] = RegRead('HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\' & $keyarr[$x] & '\Connection', 'Name')
    If $tmp2 = $keyarr[$x] Then
    $infoarr[$x][0] = RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\" & $tmp, "DriverDesc")
    $short = $short +1 ;gefundene Namen zählen
    EndIf
    Next

    If $short = $counter Then ExitLoop ;Alle Adapternamen gefunden

    $i = $i +1
    WEnd

    Return $infoarr
    EndFunc ;==> _GetAllNetAdapterInfo

    [/autoit]
  • Danke Bitboy, danke Der_Doc,

    probier' ich morgen aus. Habe hier keinen W2K-Server... :)

    Bitboy: Unter Vista funktioniert das Skript ohne Änderung nicht, da die Registrypfade nicht die Einträge enthalten, wie erwartet:
    Diesen Eintrag gibt es auf meinem Vista-Rechner nicht... (schaue ich mir aber morgen noch einmal etwas genauer an...)

    Code
    HKLM\SYSTEM\CurrentControlSet\Services\' & $keyarr[$i] & '\Parameters\Tcpip
    [autoit]


    #include <Array.au3>
    $aAdapter = _GetAllNetAdapterInfo()
    _ArrayDisplay($aAdapter)
    . . .

    [/autoit]

    Ausgabe des obigen codes, s. angehängtes Bild.


    Ich habe eben gelesen, dass WMI bereits in W2K integriert war, es muss nur aktiviert werden. Bei NT 4.0 und W95 mußte man es erst installieren.
    Morgen frage ich den zuständigen Admin, ob es Absicht war, WMI nicht zu aktivieren... vielleicht ist damit dann das Problem ohnehin gefixt (hoffe ich 'mal...)

    mfg
    Axel

  • Hm, dass es unter Vista nciht funktioniert hab ich mir fast gedacht. Hab nur eben auch kein Vista um es zu testen.
    Geschrieben hab ich es ja für XP und da XP und 2000 doch sehr ähnlich sind...

    Bei uns funktioniert übrigens wmi unter Windows 2000 Clients

  • Hallo,

    kaum ist WMI auf dem W2K eingeschaltet, schon funktioniert es.

    Jetzt muss ich nur noch die Server verartzen, die ein Teaming der Netzwerkkarten eingerichtet haben.

    mfg
    Axel

    P.S.: die WMI lose Lösung schaue ich mir dennoch noch genauer an...

    There exist 10 different kind of people on earth.
    Those who understand binary, and those who don't.