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
Computernamen über IP im Lan ausgeben lassen
-
- [ offen ]
-
Aquaplant -
19. Dezember 2009 um 15:40 -
Geschlossen -
Erledigt
-
-
[autoit]
_TCPIpToName
[/autoit] -
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
[/autoit]
$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
EDIT2: Liegt es daran, dass es a) ein Router und b) mein eigener PC ist? -
Hier die WMI Version:
[autoit]
[/autoit][autoit][/autoit][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]$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)
[/autoit]
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
EndFuncGruß,
UEZ -
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."
[/autoit]
$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
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 -
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 -
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 -
Für _TCPIpToName musst du zuerst ein TCPStartup machen.
Spoiler anzeigen
[autoit]#include <iNet.au3>
[/autoit] [autoit][/autoit] [autoit]TCPStartup()
[/autoit]
MsgBox(0,"", _TCPIpToName(@IPAddress1))
TCPShutdown() -
- Offizieller Beitrag
Hier mal die Version von Der_Doc als Funktion:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
#include <Constants.au3>
$aComputer = _GetLANComputer()
_ArrayDisplay($aComputer)Func _GetLANComputer()
[/autoit]
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 -
Oscar : Hab nur einen PC. Im zweiten Array-Element stehen dann sowas: ⌂⌂Der
-
- 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]
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
#include <Constants.au3>
$aComputer = _GetLANComputer()
_ArrayDisplay($aComputer)Func _GetLANComputer()
[/autoit]
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 -
-
- 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]
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
#include <Constants.au3>
$aComputer = _GetLANComputer()
_ArrayDisplay($aComputer)Func _GetLANComputer()
[/autoit]
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 -
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 -
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 -
- Offizieller Beitrag
Die Do...Until-Schleife kann man nicht weglassen, denn dort wird die Ausgabe des DOS-Befehls ("net") eingelesen.
StringRegExp extrahiert aus diesem String dann die Computernamen und erstellt ein Array. Die Zeile "If Not IsArray..." sorgt dafür, dass kein Fehler auftritt, wenn kein Computer im Netz gefunden wurde. -
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 wegpackenMfG
Der_Doc -
Ok danke funktioniert jetzt alles - außer das angepingte ist ein Router
-