Hallo Leute,
ich habe eine Frage, welche mich schon länger plagt und ich nach zig
Stunden Internetrecherche keine Lösung oder einen Ansatz finde.
Ich möchte gerne (einfach denke ich) alle MAC-Adressen innerhalb meines
lokalen Netzwerkes auslesen (Auf meinem Router werden mir alle angezeigt
als Vergleich).
1
Public Sub GetMacAdresses()
2
Dim nics() As NetworkInterface = NetworkInterface.GetAllNetworkInterfaces()
3
4
MsgBox(nics(1).GetPhysicalAddress.ToString)
5
End Sub
Das habe ich bis jetzt zusammengebastelt, mithilfe des Netzes. Es zeigt
mir schonmal eine MAC an, aber nur die meines PCs. Ich verstehe da auch
nicht ganz warum ich 1 nehmen muss, wenn ich alle durchlaufe, bekomme
ich irgendwas, was nicht existiert als MAC.
Wenn ich alle MAC Adressen hätte, wäre es cool, wenn ich den Namen
direkt mit auslesen könnte und dann anschließend daran entscheiden kann
was ich brauche (das bekomme ich dann schon hin, sobald ich MAC und
Namen habe).
Wenn ich die 2 gesuchten Teile habe kann ich von der MAC auf die IP
schließen? Oder diese ggf. direkt mit auslesen, wenn ich weiß das MAC XY
korrekt ist?!
Freue mich auf Hilfe, vielen Dank schon mal im Vorraus!
hmmm, das wird so vermutlich nichts.
Ich bin zwar kein .net'ler aber wenn ich lese
"NetworkInterface.GetAllNetworkInterfaces()"
bezieht sich das sicherlich bloß auf alle (konfigurierten) Interfaces
auf dem PC; also die WLAN-Karte, die Ethernetkarte, das Localloop-device
etc.
Alles das was man sieht wenn man in einer Console "ipconfig /all"
eingibt.
Der TE will aber die MACs in seinem NETZWERK nicht PC ermitteln.
Wie man das jetzt in XY.net macht habe ich keine Ahnung. Aber aus der
Console würde ich mal ein ping auf die Broadcastadresse machen und
danach mit arp -av die MACs anzeigen lassen.
P.S.: dein Router hat es einfacher, da er zum einen die IPs per DHCP an
MACs vergibt und ausserdem den ganzen Verkehr im Netzwerk mitbekommt.
Das Problem ist, dass längst nicht alle MACs in deinem ARP-Chache
stecken, die in deinem Netz verfügbar sind, es muss auch bereits eine
Kommunikation stattgefunden haben.
Man muss also vorher im schlimmsten Falle alle möglichen IP des
Subnetztes anpingen, damit ggf. ein Arp-Request losgetreten wird, um die
MAC zur IP in Erfahrung zu bringen. Man muss danach nichtmal auf die
Ping-Antwort warten, denn bereits die Tatsache, dass der Ping rausging
zeigt, dass die zugehörige MAC bekannt ist. Dann aber schnell den
ARP-Cache auslesen, bevor die Einträge wieder gelöscht werden ... :-)
> Wie man das jetzt in XY.net macht habe ich keine Ahnung. Aber aus der> Console würde ich mal ein ping auf die Broadcastadresse machen und> danach mit arp -av die MACs anzeigen lassen.
Längst nicht alle Geräte reagieren auf Pings, die nicht direkt
adressiert sind ... besser einzeln, ist natürlich mehr Arbeit bzw.
dauert länger.
Hi ..
habe deinen Code getestet, allerdings gibt er mir NUR meinen
Realtek-Adapter aus, was hat der Code bei dir gemacht? Das ist nicht so
wirklich das was ich wollte
Marius D. schrieb:> habe deinen Code getestet, allerdings gibt er mir NUR meinen> Realtek-Adapter aus
Natürlich. Hast du den Code vor dem ausprobieren nicht gelesen?
der läuft über die Lokalen (=in deinem Computer verbauten)
Netzwerkkarten und zeigt deren MACs an.
Was du willst ist ein Zugriff auf den ARP-Cache, und ggfs. eine Methode
um das Befüllen des ARP-Caches zu erzwingen (z.B: Ping an alle IPs im
Subnetz)
Hallo Frank,
ich kenne mich jetzt in PC Programmierung nicht so gut aus, hast du ggf.
einen Lösungsvorschlag für mich? Weil ich kann mir bei dir zwar was
vorstellen, aber keine Ahnung wie ich das umsetzten soll.
Ich möchte ja letzendlich alle MACs aller Geräte (bspw. PC, Drucker,
NAS, ESP8266 WiFi Module, etc...)
Wenn ich das habe, dann brauche ich die IPs (da diese sich ja ändern).
Das ist letztendlich das, was ich benötige, die IP um sich mit dem
entsprechendem Gerät zu verbinden - aber vorher muss ich das erstmal
identifizieren.
Geht das nicht vll. mit diesem WMI? Ja, ist korrekt, ggf. müsste man
einmal alle IPs (0-255) durchpinnen - aber wie kann ich dann MAC und
Name daraus entnehmen?! Weil notfalls würde ich das machen, je nach dem
wie lange das dauert - ich suche ja nen speziellen Namen und oder die
spezielle MAC.
Genau das, MAC Adressen und zugeghörige IPs, zeigt dir "arp -a" an.
Ja, das ist ein Windows-Kommando, auch wenn es das unter Linux genauso
gibt.
=> Rausfinden wie arp.exe funktioniert & nachbauen, oder, KISS, einfach
aus VB.NET "arp.exe -a" ausführen, die Ausgabe einfangen und parsen.
Planlos schrieb:> Genau das, MAC Adressen und zugeghörige IPs, zeigt dir "arp -a" an.
Eben nicht, sondern nur, wenn es mit dem jeweiligen Gerät schon mal eine
Kommunikation gab, sonst ist die Liste unvollständig!
Diese Kommunikation muss man vorher provozieren - mit einem Ping oder
einem Connect-Versuch auf einen x-beliebigen Port. Eine Idee war der
Ping auf die Broadcastadresse (.255) oder aufs Netz (.0) - aber es gibt
definitiv auch Geräte, die nur auf Pings antworten, wenn sie an die
korrekte Adresse gerichtet sind.
Was die Programmierung betrifft: Jede halbwegs brauchbare
Programmiersprache erlaubt es, Shellkommados mit Parametern auszuführen
und die Ergebnisse "abzugreifen", da muss man garnix nachbauen, nur
parsen ...
Frank E. schrieb:> Diese Kommunikation muss man vorher provozieren -
Exakt das hatte ich vorher (17:11) auch schon geschrieben ... wurde
ignoriert.
Darum habe ich in diesem Post versucht mich kürzer zu halten.
Nachdem der TE aber lieber 50 Zeilen VB.NET Code aus dem Internet
kopiert und ausführt, ohne zu verstehen was sie machen, anstatt mal 6
Zeichen in die Eingabeaufforderung zu tippen, seh ich sowieso schwarz.
Vielleicht lässt er sich ja so überreden:
1
Process.Start("arp.exe","-a")
:)
RedirectStandardOutput=true,
StreamReader dafür, usw. als Übungssaufgabe gFrank E. schrieb:> Ping auf die Broadcastadresse (.255)
wird nicht reichen. Das geht dann auch an die Broadcast-MAC 0xFFFFF...
Wenn nicht alle Geräte auf das Broadcast-Ping antworten, ist der
ARP-Cache trotzdem unvollständig.
Marius D. schrieb:> Ich möchte gerne (einfach denke ich) alle MAC-Adressen innerhalb meines> lokalen Netzwerkes auslesen (Auf meinem Router werden mir alle angezeigt> als Vergleich).
Sicher nicht. Bestenfalls werden auf dem Router die MAC-Adressen aller
Geräte angezeigt, die jemals mit dem Router kommuniziert haben.
Nun gibt es aber längst nicht für jedes Gerät im LAN die Notwendigkeit,
mit irgendeinem verschissenen Router zu kommunizieren.
Und noch viel weniger existiert die Notwendigkeit, ausgerechnet mit dem
PC zu kommunizieren, auf dem du dein grenzdeb... ähem... geniales
Hackertool laufen läßt...
Kurz: du hast absolut keine Chance, dein Ziel zu erreichen, selbst wenn
du auch nur irgendeines oder sogar jedes der verwendeten Protokolle
tatsächlich verstehen würdest...
Wenn du allerdings diese Protokollkenntnisse hättest, wäre dir bereits
vor der ersten Codezeile klar gewesen, wie begrenzt deine Möglichkeiten
sind, Geräte aufzuspüren, die keinen Wert darauf legen, aufspürbar zu
sein oder die sogar explizit möglichst nicht aufspürbar sein wollen...
Schlagt mich nicht, falls mein Hinweis nicht weiter hilft:
Ich würde den DHCP-Server fragen, welche IP-Adressen er an welche
MAC-Adressen "verliehen" hat.
Torsten C. schrieb:> Schlagt mich nicht, falls mein Hinweis nicht weiter hilft:>> Ich würde den DHCP-Server fragen, welche IP-Adressen er an welche> MAC-Adressen "verliehen" hat.
Die Idee ist schon nicht schlecht, aber längst nicht jedes Gerät im Netz
ist gezwungen, seine IP beim DHCP zu holen ...
Frank E. schrieb:> Torsten C. schrieb:>> Schlagt mich nicht, falls mein Hinweis nicht weiter hilft:>>>> Ich würde den DHCP-Server fragen, welche IP-Adressen er an welche>> MAC-Adressen "verliehen" hat.>> Die Idee ist schon nicht schlecht, aber längst nicht jedes Gerät im Netz> ist gezwungen, seine IP beim DHCP zu holen ...
die idee ist schon (fast ) gut - denn der TO sagt ja
"(Auf meinem Router werden mir alle angezeigt als Vergleich).
also dann den router abfragen,
manche router lassen sich über telnet abfragen z.b.
der ansatz ist schon richtig.
ob der router dann DHCP dienst hat oder ob sich das device static mit
dem router verbindet, müsste der TO detailierter beschreiben.
;-)
Marius D. schrieb:> Ich möchte gerne (einfach denke ich) alle MAC-Adressen innerhalb meines> lokalen Netzwerkes auslesen
Was genau ist mit dem "lokalen Netzwerk" gemeint? Die Subnetmaske?
Frank E. schrieb:> nicht jedes Gerät im Netz ist gezwungen, seine IP beim DHCP zu holen
Das stimmt. Ich spreche nur mal für mich: Meine FritzBox (DHCP-Server)
kennt alle MAC-Adressen im Subnet, auch die statischen.
Vielleicht habe ich mich nicht korrekt ausgedrückt.
c-hater schrieb:> Sicher nicht. Bestenfalls ..>> ..mit irgendeinem verschissenen Router>> auf dem du dein grenzdeb...>> selbst wenn du .. Protokolle ..tatsächlich verstehen würdest...>> Wenn du .. Protokollkenntnisse hättest, wäre dir bereits> vor der ersten Codezeile klar gewesen, wie begrenzt... deine
sei mir nicht böse - einer muss es dir ja sagen:
deine ständig geballte negativität auf die poster in deinen postings ist
einfach nur noch zum kot*en
..
Torsten C. schrieb:> Das stimmt. Ich spreche nur mal für mich: Meine FritzBox (DHCP-Server)> kennt alle MAC-Adressen im Subnet, auch die statischen.>> Vielleicht habe ich mich nicht korrekt ausgedrückt.
Schön. Wenn es nur darum geht, die MAC Adressen aller per DHCP
angemeldeten Geräte zu finden, dann lies das aus dem DHCP aus.
Wenn es noch statisch konfigurierte Geräte gibt, die regelmäßig mit dem
Internet kommunizieren, dann lies zusätzlich den ARP-Cache des Routers
aus.
Wenn es dann noch statisch konfigurierte Geräte gibt, die nicht von sich
aus mit dem Router sprechen, aber auf Ping (oder arping) reagieren:
Subnetz komplett durchpingen.
Was dann noch übrigbleibt will nicht gefunden werden. Die Chancen
stehen groß, dass du das dann auch nicht in deinem Netzwerk haben
willst.
Viel Erfolg bei der Suche :)
.. schrieb:> deine ständig geballte negativität
Geh mal zum Autoschrauber deines Vertrauens:
Ich hab mir ein Wrack vom Schrottplatz geholt, das will ich
instandsetzen.
Ich hab schonmal Benzin in den Kühler gekippt, die Gangschaltung ist
aber seltsamerweise immer noch kaputt.
Wie gehts weiter, was muss ich als nächstes machen?
Planlos schrieb:> .. schrieb:>> deine ständig geballte negativität>> Wie gehts weiter, was muss ich als nächstes machen?
vieleicht kippst du dir einfach nur die luft der reifen rein,
wenn du glück hast ist gas drin, einfach dann nur entladen.
Planlos schrieb:> Subnetz komplett durchpingen.
Fein. Und wenn man das eh tut, braucht man die anderen Methoden m.E.
nicht mehr. Vielleicht ist das die einfachste und beste Lösung für
Marius?
Marius D. schrieb:> Wenn ich alle MAC Adressen hätte, wäre es cool, wenn ich den Namen> direkt mit auslesen könnte und dann anschließend daran entscheiden kann> was ich brauche (das bekomme ich dann schon hin, sobald ich MAC und> Namen habe).>> Wenn ich die 2 gesuchten Teile habe kann ich von der MAC auf die IP> schließen? Oder diese ggf. direkt mit auslesen, wenn ich weiß das MAC XY> korrekt ist?!
Das ist eigentlich die falsche Reihenfolge. Wenn du den Namen hast,
kannst du damit die IP ermitteln und mit dieser wiederum die
MAC-Adresse.
Der erste Schritt geht über (M)DNS oder die hosts-Datei, der zweite über
ARP.
Frank E. schrieb:> Man muss also vorher im schlimmsten Falle alle möglichen IP des> Subnetztes anpingen, damit ggf. ein Arp-Request losgetreten wird, um die> MAC zur IP in Erfahrung zu bringen. Man muss danach nichtmal auf die> Ping-Antwort warten, denn bereits die Tatsache, dass der Ping rausging> zeigt, dass die zugehörige MAC bekannt ist. Dann aber schnell den> ARP-Cache auslesen, bevor die Einträge wieder gelöscht werden ... :-)
Es gibt auch arping.
https://en.wikipedia.org/wiki/ArpingMarius D. schrieb:> Ich möchte ja letzendlich alle MACs aller Geräte (bspw. PC, Drucker,> NAS, ESP8266 WiFi Module, etc...)
Das ist nicht das, was du möchtest, sondern das, was du glaubst zu
brauchen, um das zu tun, was du eignentlich möchtest.
> Wenn ich das habe, dann brauche ich die IPs (da diese sich ja ändern).> Das ist letztendlich das, was ich benötige, die IP um sich mit dem> entsprechendem Gerät zu verbinden - aber vorher muss ich das erstmal> identifizieren.
Dazu sind eigentlich die Namen da. Gib also jedem Gerät einen
vernünftigen Namen und benutze den, um das Gerät zu finden.
Geräte wie Drucker oder NAS sollten außerdem heutzutage eigentlich alle
DNS-SD unterstützen, so daß sie im Netz auch gleich als das gefunden
werden, was sie tatsächlich sind.
Marius D. schrieb:> Hallo Rolf,>> ja mit dem Namen wäre schön, leider geht das beim ESP-Modul nicht, das> ist immer unknown.... leider.
wie wäre es damit?
Du kannst eigentlich schon einiges machen, nur was willst du machen?
Dein Konzept ist nch nicht so schlüssig.
Wer vergibt die IP
und an wem welche
Wer spielt DNS oder gibt es eine Static Liste.
Eigene FW oder Standard AT, welche Version.
usw.
Da gibt es viele Ansätze.
Wenn es dir nur um VB.Net geht, eine SUbRoutine zu erstellen, die dir
alle MACS, NAMES, IPS einsammelt, dann brauchst du einen Ansprechpartner
der dir das mitteilt. Du könntest selber in der FW auf eine Anfrage
Routine Agieren.
z.B. über UDP
Du musst nicht mal die Subnetze und Hauptnetze kennen,
es wäre aber von Zeit Vorteil, wenn du da Einschränkungen machst,
einen Adressraum vorzugeben:
Du sendest eine UDP Broadcast Message und erhälst von jedem erreichbaren
Teilnehmer im Netz deine Infos. Das setzt aber voraus, dass du dem ESP
z.B. auch eine Callback Routine mitgibst, seine IP, MAC ect zu senden.
Eine eigene Liste ( siehe oben ) fertigst du dann zentral an, wo jeder
dann über eigenen Namen erreichbar ist. usw.
Nur auf die Standard Firmware bezogen, kannst du dem ESP neben MAC, IP
auch einen Namen vergeben.
;-)
lesenswert:
http://hackaday.com/2015/07/01/dns-tunneling-with-an-esp8266/http://bbs.espressif.com/viewtopic.php?f=21&t=232