Hi zusammen,
ich würde gerne in meinem Lan die aktiven IPs scannen und den dazugehörigen Hostnamen erhalten. Ist das mit AutoIt möglich? Google hat mir leider nicht geholfen.
Besten Dank im voraus.
Hi zusammen,
ich würde gerne in meinem Lan die aktiven IPs scannen und den dazugehörigen Hostnamen erhalten. Ist das mit AutoIt möglich? Google hat mir leider nicht geholfen.
Besten Dank im voraus.
Wer lesen kann ist klar im Vorteil, danke. Hatte das schon gefunden, aber TCPStartup vergessen ... =/
#include <Array.au3>
$LanPCs = _NetServerEnum(0xFFFFFFFF)
_ArrayDisplay($LanPCs)
Func _NetServerEnum ($iSrvType = -1, $sDomain = '')
Local $uBufPtr = DllStructCreate("ptr;int;int"), $res[1]=[0], $i
Local $uRecord = DllStructCreate("dword;ptr"), $iRecLen = DllStructGetSize($uRecord)
Local $uString = DllStructCreate("char[16]")
Local $uDomain = DllStructCreate("byte[32]"), $pDomain = 0
If Not ($sDomain='' Or $sDomain='*') Then
DllStructSetData($uDomain, 1, StringToBinary($sDomain,2))
$pDomain = DllStructGetPtr($uDomain)
EndIf
Local $ret = DllCall ("netapi32.dll", "int", "NetServerEnum", _
"ptr", 0, "int", 100, _
"ptr", DllStructGetPtr($uBufPtr,1), "int", -1, _
"ptr", DllStructGetPtr($uBufPtr,2), _
"ptr", DllStructGetPtr($uBufPtr,3), _
"int", $iSrvType, "ptr", $pDomain, "int", 0 )
If $ret[0] Then Return SetError(1, $ret[0], '')
Local $res[DllStructGetData($uBufPtr,3)+1]=[DllStructGetData($uBufPtr,3)]
For $i=1 To DllStructGetData($uBufPtr,3)
Local $uRecord = DllStructCreate("dword;ptr", DllStructGetData($uBufPtr,1)+($i-1)*$iRecLen)
Local $sNBName = DllStructCreate("byte[32]", DllStructGetData($uRecord,2))
DllStructSetData($uString,1,BinaryToString(DllStructGetData($sNBName,1),2))
$res[$i] = DllStructGetData($uString,1)
Next
$ret = DllCall ("netapi32.dll", "int", "NetApiBufferFree", "ptr", DllStructGetData($uBufPtr,1))
Return $res
EndFunc
thx, das ist verdammt schnell, allerdings ohne IP und der Hostname ist ein anderer als über TCPIpToName.
Ja das stimmt, jedoch ist der Hostname einfach der Computername bei meinem (finde ich fast besser, denn der andere ist meistens ein Router orientierter Name also z.B. Speedportw504.Phil-IT oder sowas) und die IP kannst du einfach auslesen indem du folgenden Zusatz nimmst. Ich habe noch eine Funktion geschrieben, jetzt bekommst du Computernamen und IP in einem Array. Lg Phil
#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]$LanPCs = _SetIP(_NetServerEnum(0xFFFFFFFF))
[/autoit] [autoit][/autoit] [autoit]; $Anzahl = $LanPCs[0][0]
; $ErsterComputername = $LanPCs[1][0]
; $ErsteIP = $LanPCs[1][1]
; $ZweiterComputername = $LanPCs[2][0]
; $ZweiteIP = $LanPCs[2][1]
_ArrayDisplay($LanPCs)
[/autoit] [autoit][/autoit] [autoit]Func _NetServerEnum ($iSrvType = -1, $sDomain = '')
Local $uBufPtr = DllStructCreate("ptr;int;int"), $res[1]=[0], $i
Local $uRecord = DllStructCreate("dword;ptr"), $iRecLen = DllStructGetSize($uRecord)
Local $uString = DllStructCreate("char[16]")
Local $uDomain = DllStructCreate("byte[32]"), $pDomain = 0
If Not ($sDomain='' Or $sDomain='*') Then
DllStructSetData($uDomain, 1, StringToBinary($sDomain,2))
$pDomain = DllStructGetPtr($uDomain)
EndIf
Local $ret = DllCall ("netapi32.dll", "int", "NetServerEnum", _
"ptr", 0, "int", 100, _
"ptr", DllStructGetPtr($uBufPtr,1), "int", -1, _
"ptr", DllStructGetPtr($uBufPtr,2), _
"ptr", DllStructGetPtr($uBufPtr,3), _
"int", $iSrvType, "ptr", $pDomain, "int", 0 )
If $ret[0] Then Return SetError(1, $ret[0], '')
Local $res[DllStructGetData($uBufPtr,3)+1]=[DllStructGetData($uBufPtr,3)]
For $i=1 To DllStructGetData($uBufPtr,3)
Local $uRecord = DllStructCreate("dword;ptr", DllStructGetData($uBufPtr,1)+($i-1)*$iRecLen)
Local $sNBName = DllStructCreate("byte[32]", DllStructGetData($uRecord,2))
DllStructSetData($uString,1,BinaryToString(DllStructGetData($sNBName,1),2))
$res[$i] = DllStructGetData($uString,1)
Next
$ret = DllCall ("netapi32.dll", "int", "NetApiBufferFree", "ptr", DllStructGetData($uBufPtr,1))
Return $res
EndFunc
Func _SetIP($aPCs)
Dim $aReturn[$aPCs[0]+1][2]
$aReturn[0][0] = $aPCs[0]
TCPStartup()
For $i = 1 To $aPCs[0]
$aReturn[$i][0] = $aPCs[$i]
$aReturn[$i][1] = TCPNameToIP($aPCs[$i])
Next
TCPShutdown()
Return $aReturn
EndFunc
Das hast du natürlich recht, ist bei mir auch so.
Aber noch eine Frage. Er findet bei mir 2 Geräte, obwohl noch 3 Router und 1 Smartphone im Netzwerk sind. Woran liegt das?
Welche 2 Geräte findet er denn? Wahrscheinlich dein Smartphone, aber wieso hast du 3 Router im Netz? Die sollte das Programm ja eigentlich nicht erkennen, da sie andere Gateways nutzen.
Es findet den Laptop, auf dem ich das Script ausführe und meinen Gigablue-Receiver (um den es übrigens geht). Ich habe 1 Hauptrouter mit DHCP-Server und 2 APs. Mein Handy wurde nicht gefunden.
Woran sind die APs angebunden? An deinen 'normalen' / Hauptrouter? Stimmt das Smartphone ist ja auch nicht Windows/Bit-fähig, nicht das gleich Protokol vielleicht. Besteht jetzt eigentlich noch ein Problem oder sind das nur noch zusätzliche Fragen?:D
sagen wir mal so, dein Script gefällt mir, ich verlasse mich allerdings noch immer auf mein Ping-Script, da mir bei dir nur 2 von X Geräten angezeigt werden. Da ist mir einfach zu viel Verlust dabei.
Die Router hängen beide am Hauptrouter.