Forum: PC-Programmierung ESP8266 & Visual Basic MAC Adresse und IP


von MOBA 2. (Gast)


Lesenswert?

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!

von .. (Gast)


Lesenswert?

1
Public Shared Sub DisplayDnsConfiguration() 
2
    Dim adapters As NetworkInterface() = NetworkInterface.GetAllNetworkInterfaces()
3
    Dim adapter As NetworkInterface
4
    For Each adapter In  adapters
5
        Dim properties As IPInterfaceProperties = adapter.GetIPProperties()
6
        Console.WriteLine(adapter.Description)
7
        Console.WriteLine("  DNS suffix................................. :{0}", properties.DnsSuffix)
8
        Console.WriteLine("  DNS enabled ............................. : {0}", properties.IsDnsEnabled)
9
        Console.WriteLine("  Dynamically configured DNS .............. : {0}", properties.IsDynamicDnsEnabled)
10
    Next adapter
11
12
End Sub 'DisplayDnsConfiguration
..
1
void DisplayDnsConfiguration()
2
{
3
    NetworkInterface* adapters[] = NetworkInterface::GetAllNetworkInterfaces();
4
    System::Collections::IEnumerator* myEnum10 = adapters->GetEnumerator();
5
    while (myEnum10->MoveNext())
6
    {
7
        NetworkInterface* adapter = __try_cast<NetworkInterface*>(myEnum10->Current);
8
        IPInterfaceProperties* properties = adapter->GetIPInterfaceProperties();
9
        Console::WriteLine(adapter->Description);
10
        Console::WriteLine(S"  DNS suffix................................. :{0}",
11
            properties->DnsSuffix);
12
        Console::WriteLine(S"  DNS enabled ............................. : {0}",
13
            __box(properties->IsDnsEnabled));
14
        Console::WriteLine(S"  Dynamically configured DNS .............. : {0}",
15
            __box(properties->IsDynamicDnsEnabled));
16
    }
17
}


btw: quer.


1
using System.Management;   
2
3
4
5
    ManagementObjectSearcher query = new ManagementObjectSearcher(   
6
        "SELECT * FROM Win32_NetworkAdapterConfiguration" );   
7
    ManagementObjectCollection queryCollection = query.Get();   
8
9
    foreach (ManagementObject mo in queryCollection)   
10
    {   
11
        Console.WriteLine(mo["Description"].ToString());
12
    }


für alle anderen eigenschaften.. name, kannst du das abändern etwa so:

1
foreach (ManagementObject mo in queryCollection) 
2
            {
3
4
                foreach (PropertyData pd in mo.Properties)
5
                {
6
                    Console.WriteLine(pd.Name);
7
                }
8
            }


;-)

von .. (Gast)


Lesenswert?

1
'Declaration
2
Public Shared Function GetAllNetworkInterfaces As NetworkInterface()
3
'Usage
4
Dim returnValue As NetworkInterface()
5
6
returnValue = NetworkInterface.GetAllNetworkInterfaces()


have phun
;-)

von G. H. (schufti)


Lesenswert?

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.

: Bearbeitet durch User
von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

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.

: Bearbeitet durch User
von MOBA 2. (Gast)


Lesenswert?

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

von Planlos (Gast)


Lesenswert?

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)

von Planlos (Gast)


Lesenswert?

Versuch mal "arp -a"
(in der Eingabeaufforderung)

von MOBA 2. (Gast)


Lesenswert?

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.

von Planlos (Gast)


Lesenswert?

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.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

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 ...

: Bearbeitet durch User
von Planlos (Gast)


Lesenswert?

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 g

Frank 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.

von c-hater (Gast)


Lesenswert?

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...

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

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.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

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 ...

von .. (Gast)


Lesenswert?

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.

;-)

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

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.

von .. (Gast)


Lesenswert?

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

..

von Planlos (Gast)


Lesenswert?

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?

von r_u_d_i (Gast)


Lesenswert?

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.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

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?

von Rolf M. (rmagnus)


Lesenswert?

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/Arping

Marius 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.

von MOBA 2. (Gast)


Lesenswert?

Hallo Rolf,

ja mit dem Namen wäre schön, leider geht das beim ESP-Modul nicht, das 
ist immer unknown.... leider.

von r_u_d_i (Gast)


Lesenswert?

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?
1
MAC                    IP                  DNS              NAME
2
3
26-7F-00-00-32-32      192.168.50.101      192.168.50.1     ESP001


oder damit

1
CHIPID        MACAP            MACCLI             NAME      GATEWAY
2
3
10332031      192.168.4.1      192.168.50.101     ESP001    192.168.100.1


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

von MOBA 2. (Gast)


Lesenswert?

Wie hast du dem ESP einen Namen gegeben, ich nutze Standart-FW, SDK 1.3, 
AT 0.4.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.