Computernamen über IP im Lan ausgeben lassen

  • Hi,
    die Überschrift sagt eigentlich schon alles. Ich möchte gerne von PC's im Lan den Computernamen, bzw. "hostname" reicht, herausgegeben bekommen. Hab schon einmal gegoogelt und soll angeblich über die CMD Konsole gehen (ping [IP] /a), klappt bei mir aber nicht. Die IP Adresse habe ich vorher durch anpingen bekommen.
    Ich hoffe ihr könnt mir weiterhelfen
    Vielen Dank
    Aquapalant

    2 Mal editiert, zuletzt von Aquaplant (20. Dezember 2009 um 21:24)

  • Super, vielen Dank. :)
    EDIT: Es kommt immer der Fehler "gethostbyaddr fehlgeschlagen, WSAGetLastError = @Extended"
    Mein Script sieht an dieser Stelle so aus:

    Spoiler anzeigen
    [autoit]

    If $ping > 0 Then
    $name = _TCPIpToName($ipstart & $ip)
    If @error = 0 Then
    FileWrite(@ScriptDir & "/IP.txt", @CRLF & @CRLF & "=============================" &@CRLF & "IP: "& $ipstart & $ip & @CRLF & "Ping: " & $ping & @CRLF & "Hostname: " & $name & @CRLF & "=============================" & @CRLF)
    EndIf
    Endif

    [/autoit]


    EDIT2: Liegt es daran, dass es a) ein Router und b) mein eigener PC ist?

    2 Mal editiert, zuletzt von Aquaplant (19. Dezember 2009 um 16:24)

  • Hier die WMI Version:

    [autoit]


    ;Coded by UEZ 2009
    #AutoIt3Wrapper_Change2CUI=y
    #AutoIt3Wrapper_UseUpx=n
    Global $ip = "192.168.178.201"
    If $CmdLine[0] > 0 Then $ip = $CmdLine[1]

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

    $objWMIService = ObjGet("winmgmts:{impersonationLevel = impersonate}!\\" & $ip & "\root\cimv2")

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

    MsgBox(0, "Computer Name", "IP: " & $ip & @CRLF & @CRLF & "Computer Name: " & GetName($ip))

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

    Func GetName($srv)
    Local $name, $colItems, $colItem, $ping
    $ping = Ping($srv)
    If $ping Then
    $colItems = $objWMIService.ExecQuery("Select Name from Win32_ComputerSystem", "WQL", 0x30)
    If IsObj($colItems) Then
    For $objItem In $colItems
    $name = $objItem.Name
    Next
    SetError(0)
    Return $name
    Else
    SetError(1)
    Return "Error!"
    EndIf
    Else
    SetError(1)
    Return "Host not reachable"
    EndIf
    EndFunc

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Hmm, wie bau ich das denn jetzt in mein Script? Ich kann z.B. überhaupt nichts mit dieser Zeile anfangen: "If $CmdLine[0] > 0 Then $ip = $CmdLine[1]". Wäre nett, wenn du mir dabei helfen könntest. Mein Script sieht so aus:

    Spoiler anzeigen
    [autoit]

    #include <iNet.au3>

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

    TraySetIcon("Shell32.dll", -19)

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

    $ipstart = "192.168.0."
    $ip = 1
    $a = 0
    FileWrite(@ScriptDir & "/IP.txt", "Starte Suche: " & @HOUR & ":" & @MIN & ":" & @SEC & @CRLF)
    While 1
    $ping = Ping($ipstart & $ip, 250)
    If $ping > 0 Then
    $name = _TCPIpToName($ipstart & $ip)
    If @error = 0 Then
    FileWrite(@ScriptDir & "/IP.txt", @CRLF & @CRLF & "=============================" &@CRLF & "IP: "& $ipstart & $ip & @CRLF & "Ping: " & $ping & @CRLF & "Hostname: " & $name & @CRLF & "=============================" & @CRLF)
    EndIf
    If @error = 1 Then
    FileWrite(@ScriptDir & "/IP.txt", @CRLF & @CRLF & "=============================" &@CRLF & "IP: "& $ipstart & $ip & @CRLF & "Ping: " & $ping & @CRLF & "Hostname: " & "inet_addr DllCall fehlgeschlagen" & @CRLF & "=============================" & @CRLF)
    EndIf
    If @error = 2 Then
    FileWrite(@ScriptDir & "/IP.txt", @CRLF & @CRLF & "=============================" &@CRLF & "IP: "& $ipstart & $ip & @CRLF & "Ping: " & $ping & @CRLF & "Hostname: " & "inet_addr fehlgeschlagen" & @CRLF & "=============================" & @CRLF)
    EndIf
    If @error = 3 Then
    FileWrite(@ScriptDir & "/IP.txt", @CRLF & @CRLF & "=============================" &@CRLF & "IP: "& $ipstart & $ip & @CRLF & "Ping: " & $ping & @CRLF & "Hostname: " & "gethostbyaddr DllCall fehlgeschlagen" & @CRLF & "=============================" & @CRLF)
    EndIf
    If @error = 4 Then
    FileWrite(@ScriptDir & "/IP.txt", @CRLF & @CRLF & "=============================" &@CRLF & "IP: "& $ipstart & $ip & @CRLF & "Ping: " & $ping & @CRLF & "Hostname: " & "gethostbyaddr fehlgeschlagen, WSAGetLastError = @Extended" & @CRLF & "=============================" & @CRLF)
    EndIf
    If @error = 5 Then
    FileWrite(@ScriptDir & "/IP.txt", @CRLF & @CRLF & "=============================" &@CRLF & "IP: "& $ipstart & $ip & @CRLF & "Ping: " & $ping & @CRLF & "Hostname: " & "gethostbyaddr fehlgeschlagen, WSAGetLastError fehlgeschlagen" & @CRLF & "=============================" & @CRLF)
    EndIf
    If @error = 6 Then
    FileWrite(@ScriptDir & "/IP.txt", @CRLF & @CRLF & "=============================" &@CRLF & "IP: "& $ipstart & $ip & @CRLF & "Ping: " & $ping & @CRLF & "Hostname: " & "strlen/sZStringRead fehlgeschlagen" & @CRLF & "=============================" & @CRLF)
    EndIf
    If @error = 7 Then
    FileWrite(@ScriptDir & "/IP.txt", @CRLF & @CRLF & "=============================" &@CRLF & "IP: "& $ipstart & $ip & @CRLF & "Ping: " & $ping & @CRLF & "Hostname: " & "Fehler beim Lesen des Aliases Array" & @CRLF & "=============================" & @CRLF)
    EndIf
    $a = $a + 1
    TrayTip("IP Lan", $a & " Router/Computer gefunden", 0, 1)
    EndIf
    If $ping = 0 Then
    If @error = 1 Then
    FileWrite(@ScriptDir & "/IP.txt", @CRLF & "IP: "& $ipstart & $ip & @CRLF & "Der Computer ist offline")
    EndIf
    If @error = 2 Then
    FileWrite(@ScriptDir & "/IP.txt", @CRLF & "IP: "& $ipstart & $ip & @CRLF & "Der Computer ist nicht erreichbar")
    EndIf
    If @error = 3 Then
    FileWrite(@ScriptDir & "/IP.txt", @CRLF & "IP: "& $ipstart & $ip & @CRLF & "Falsche Adresse")
    EndIf
    If @error = 4 Then
    FileWrite(@ScriptDir & "/IP.txt", @CRLF & "IP: "& $ipstart & $ip & @CRLF & "Andere Fehler")
    EndIf
    EndIf
    $ip = $ip + 1
    If $ip = 256 Then
    FileWrite(@ScriptDir & "/IP.txt", @CRLF & "Starte Suche: " & @HOUR & ":" & @MIN & ":" & @SEC)
    MsgBox(0, "Vorgang abgeschlossen", "IP Log erstellt")
    ExitLoop
    EndIf
    WEnd

    [/autoit]


    Vielen Dank

  • Dein Skript verfolgt einen ganz anderen Ansatz, deshalb macht es keinen Sinn mein Skript in dein Skript zu integrieren.

    Zeile 5 oder If $CmdLine[0] > 0 Then $ip = $CmdLine[1] ist dafür gedacht, dass du aus der CMD Box einen Parameter mitgeben kannst, wie z.B. GetName.exe 10.10.10.10

    Dadurch würdest du die Build-in IP Adresse (192.168.178.201) übergehen und anstelle die 10.10.10.10 benutzen.
    Wichtig dabei ist, dass Zeile 2 (#AutoIt3Wrapper_Change2CUI=y) existiert, so dass das Skript somit CMD fähig wird!

    WMI hat den Vorteil, dass du eine Menge von den Systemen abfragen kannst, auch von Remote Systemen! Der WMI Dienst muss nur laufen. Nachteil: relativ langsam.

    Ein Klasse Tool ist Scriptomatic von MS! WBEMTest (Build-in Tool) ist nett zum reinschauen!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Ok danke. Ich würd das mit dem Namen aber gerne in mein Script integrieren und kein externes Programm benutzen. Dann ist das beides gleich auf einen Schlag gemacht und ich wieder etwas mehr an Autoiterfahrung gesammelt :)
    EDIT: Ok ping -a [IP] geht doch, hab es nur falschrum gehabt. Leider weiß ich nicht wie ich jetzt mit Autoit in die DOS Konsole schreiben, und das auswerten kann und auch nach einer Stunde Suche nichts im Forum daüber gefunden :( Wäre nett wenn mir da nochmal wer helfen könnte

    Einmal editiert, zuletzt von Aquaplant (21. Dezember 2009 um 00:19)

  • Um alle (nehme ich mal an) Namen zu bekommen versuche mla den CMD Befehl NET VIEW.
    Da solltest du auch was bekommen. ICh kann das im Moment leider nur in einer Domaine testen und da bekomme ich einiges zurück.
    Das dann mit StringMid / StingInStr dann wird das super. Nutze das sehr oft.

    MfG
    Der_Doc

    • Offizieller Beitrag

    Hier mal die Version von Der_Doc als Funktion:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <Constants.au3>
    $aComputer = _GetLANComputer()
    _ArrayDisplay($aComputer)

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

    Func _GetLANComputer()
    Local $sPID, $sOut = ''
    $sPID = Run(@ComSpec & ' /c net view', @SystemDir, @SW_HIDE, $STDOUT_CHILD)
    Do
    $sOut &= StdoutRead($sPID)
    Until @error <> 0
    Return StringRegExp($sOut, '(?s).+?(\\\\\H+)\h*(\H+)', 3)
    EndFunc ;==>_GetLANComputer

    [/autoit]
    • Offizieller Beitrag

    Die Funktion gibt pro Computer zwei Werte (Computername und Computerbeschreibung) aus. Musst Du bei Dir mal nachsehen, was dort eingetragen ist.

    Edit: Wenn nur der Computername ausreicht, dann kann man das RegExp etwas verkürzen:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <Constants.au3>
    $aComputer = _GetLANComputer()
    _ArrayDisplay($aComputer)

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

    Func _GetLANComputer()
    Local $sPID, $sOut = ''
    $sPID = Run(@ComSpec & ' /c net view', @SystemDir, @SW_HIDE, $STDOUT_CHILD)
    Do
    $sOut &= StdoutRead($sPID)
    Until @error <> 0
    Return StringRegExp($sOut, '(?s).+?(\\\\\H+)', 3)
    EndFunc ;==>_GetLANComputer

    [/autoit]
    • Offizieller Beitrag

    Wenn bei "net view" nur der Name angezeigt wird, dann ist bei Computerbeschreibung nichts eingetragen.
    Und wenn das "\\" davor stört, dann halt so (jetzt zusätzlich mit IP-Adressen):

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <Constants.au3>
    $aComputer = _GetLANComputer()
    _ArrayDisplay($aComputer)

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

    Func _GetLANComputer()
    Local $sPID, $sOut = '', $aComputer
    $sPID = Run(@ComSpec & ' /c net view', @SystemDir, @SW_HIDE, $STDOUT_CHILD)
    Do
    $sOut &= StdoutRead($sPID)
    Until @error <> 0
    $aComputer = StringRegExp($sOut, '(?s).+?\\\\(\w+)', 3)
    If Not IsArray($aComputer) Then Return SetError(1, 0, 0)
    Local $aOut[UBound($aComputer)][2]
    TCPStartup()
    For $i = 0 To UBound($aComputer) - 1
    $aOut[$i][0] = $aComputer[$i]
    $aOut[$i][1] = TCPNameToIP($aComputer[$i])
    Next
    TCPShutdown()
    Return $aOut
    EndFunc ;==>_GetLANComputer

    [/autoit]
  • Ok danke. Ich würd das mit dem Namen aber gerne in mein Script integrieren und kein externes Programm benutzen. Dann ist das beides gleich auf einen Schlag gemacht und ich wieder etwas mehr an Autoiterfahrung gesammelt :)

    Was für ein externes Programm? WMI ist intern! Für eine Namensauflösung brauchst du ein DNS oder du musst deine hosts Datei editieren, damit du die IP Adressen auflösen kannst.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Hi, vielen Dank für die Lösungen.
    Allerdings habe ich noch drei Fragen zum Script.
    Kann man die Do-Schleife nicht einfach weglassen? Es wird zich Mal der selbe Wert ausgegeben($sOUT)
    Was genau macht diese Zeile: "$aComputer = StringRegExp($sOut, '(?s).+?\\\\(\w+)', 3)" Ich hab mir das zwar in der Hilfe angesehen aber nicht ganz verstanden. Filtert das die Zeichen, die hinten angegeben sind raus oder prüft das nur ob sie vorhanden sind?
    Wofür ist die Zeile da:"If Not IsArray($aComputer) Then Return SetError(1, 0, 0)"?
    UEZ: Mit intern meinte ich im Script selbst und extern ein weiteres Programm, dass neben dem Script läuft

  • Jetzt ist noch ein weiterer PC im Lan. Es wird trotzdem nur meiner angezeigt - wieso?
    bzw. habe in meinem Script jetzt TCPstartup/shutdown ergänzt und bekomme den Fehler gethostbyaddr fehlgeschlagen, WSAGetLastError = @Extended. Nur bei meinem eigenen PC funktioniert es jetzt (mit beiden Scripts) den Namen zu erhalten

  • Äm das ganze wird über NETBIOS und der Browsinglist verteilt.
    Das kann etwas dauern bis sich die Rechner alle eingefunden haben. Wenn du die Rechner in der Windows Netzwerkumgebung siehst sollte auch Net View gehen.

    Oscar danke für die Funktion.
    Die werde ich mal wegpacken ;)

    MfG
    Der_Doc