Broadcast-Adresse per Batch-Skript in Windows
Wie bekommt man die Broadcast-Adresse für ein Subnetz mit Hilfe nur des CMD-Befehlsprozessors raus.
Hallo allerseits.
Neulich hatte ich das Problem, dass ich die Broadcast-Adresse in meinem IP-Netzwerk (mit Windows) ermitteln musste. Was daraus geworden ist, würde ich gerne mit euch teilen.
Um die Broadcast-Adresse herauszufinden, gibt es mehrere Möglichkeiten; sie unterscheiden sich in ihrer Zuverlässigkeit in Abhängigkeit von der Windows-Version und der Anzahl der Netzwerkadapter eines PCs, also in ihrer Portabilität zwischen unterschiedlichen Rechnern.
Nun, im einfachsten Fall kann man die Broadcast-Adresse aus der ARP-Tabelle auslesen. Wir suchen in der ARP-Tabelle nach Einträgen, die die Ethernet Broadcast-Adresse enthalten und streichen daraus die globale Broadcast-Adresse. Mit einer Zeile hat man bereits das gewünschte Ergebnis.
Das funktioniert solange gut, wie man nur eine einzige Netzwerkkarte hat. D.h., wenn man z.B. einen virtuellen Netzwerkadapter oder einfach LAN und WLAN hat, bekommt man mehrere (meistens unterschiedliche) Broadcast-Adressen.
Das Gute an dieser Methode ist lediglich, dass sie unter XP genauso gut wie unter Windows 8 funktioniert — vermutlich sogar unter Windows NT.
Wenn es uns also nicht gelingt, die Broadcast-Adresse in fertiger Form auf einmal irgendwo auszulesen, müssen wir sie selbst berechnen. Dazu werden eine IP-Adresse (z.B. die eigene) und die zugehörige Subnetzmaske benötigt. Also, machen wir uns auf die Suche.
Ab Windows Vista bietet sich die Möglichkeit an, die IP-Konfiguration aus der
bekommt man die IP-Konfiguration für einen konkreten Netzwerkadapter. Allerdings muss man dafür vorher die Indexnummer dieses Netzwerkadapters ermitteln, wofür sich die Routingtabelle anbieten würde:
Hier muss man wieder tricksen, um die Nummer des gewünschten Netzwerkadapters zu isolieren. Z.B. mit
Wie gesagt, diese Variante funktioniert unabhängig von der Anzahl der Netzwerkadapter — aber leider nicht unter XP (abwärts), weil die
Eine weitere Methode ist sowohl von der Windows-Version, als auch von der Anzahl der Netzwerkadapter unabhängig, dafür aber etwas umständlicher.
Wir versuchen nun die IP-Konfiguration aus der Ausgabe des Befehls ist das schnell erledigt. Nun nutzen wir die Tatsache aus, dass in der Ausgabe des
Im Ergebnis haben wir dann eine IP-Adresse und (mehrere) Subnetzmaske(n). Diejenige, die unmittelbar nach der IP-Adresse kommt, ist "unser Klient". Hier ist mir bisher nichts Besseres als eine Lösung mit einer Art Semaphor eingefallen.
Jetzt haben wir, was wir brauchen, und können uns der Berechnung der Broadcast-Adresse widmen. Dazu müssen wir sowohl die IP-Adresse, als auch die Subnetzmaske in einzelne Oktette zerlegen.
Die Broadcast-Adresse besteht bekanntlich aus einer Netz-ID und einer Host-ID, bei der alle Bits auf 1 gesetzt sind. Wir invertieren die Subnetzmaske bitweise und bekommen dann ein Bitmuster, bei dem alle Host-Bits Einser sind. Das geht am einfachsten mit dem XOR-Operator.
Jetzt bleibt uns nur, alle Host-Bits der IP-Adresse auf "1" zu setzen. Dazu nehmen wir den OR-Operator.
Oder man erledigt beides in einem Schritt und spart sich unnötige Umgebungsvariablen.
Fertsch!
Ich war etwas erstaunt, als ich gesehen habe, das das mit einem bloßen Batch-Skript möglich ist.
Wer anstatt der Broadcast-Adresse die Netz-ID benötigt, kann das mit dem AND-Operator erledigen:
Grüße
format-c
Hallo allerseits.
Neulich hatte ich das Problem, dass ich die Broadcast-Adresse in meinem IP-Netzwerk (mit Windows) ermitteln musste. Was daraus geworden ist, würde ich gerne mit euch teilen.
Um die Broadcast-Adresse herauszufinden, gibt es mehrere Möglichkeiten; sie unterscheiden sich in ihrer Zuverlässigkeit in Abhängigkeit von der Windows-Version und der Anzahl der Netzwerkadapter eines PCs, also in ihrer Portabilität zwischen unterschiedlichen Rechnern.
Nun, im einfachsten Fall kann man die Broadcast-Adresse aus der ARP-Tabelle auslesen. Wir suchen in der ARP-Tabelle nach Einträgen, die die Ethernet Broadcast-Adresse enthalten und streichen daraus die globale Broadcast-Adresse. Mit einer Zeile hat man bereits das gewünschte Ergebnis.
for /f %a in ('arp -a ^| find /I "ff-ff-ff-ff-ff-ff" ^| find /V "255.255.255.255"') do @echo %a
Das Gute an dieser Methode ist lediglich, dass sie unter XP genauso gut wie unter Windows 8 funktioniert — vermutlich sogar unter Windows NT.
Wenn es uns also nicht gelingt, die Broadcast-Adresse in fertiger Form auf einmal irgendwo auszulesen, müssen wir sie selbst berechnen. Dazu werden eine IP-Adresse (z.B. die eigene) und die zugehörige Subnetzmaske benötigt. Also, machen wir uns auf die Suche.
Ab Windows Vista bietet sich die Möglichkeit an, die IP-Konfiguration aus der
netshell
auszulesen. Mitnetsh interface ipv4 show addresses <Index-Nr.>
netsh interface ipv4 show route
for /f "tokens=5" %i in ('netsh interface ipv4 show route ^| find "0.0.0.0/0"') do @echo %i
netshell
dort eine komlett andere Syntax hat.Eine weitere Methode ist sowohl von der Windows-Version, als auch von der Anzahl der Netzwerkadapter unabhängig, dafür aber etwas umständlicher.
Wir versuchen nun die IP-Konfiguration aus der Ausgabe des Befehls
ipconfig
auszulesen. Dieser Befehl funktioniert ab Windows NT (aufwärts), also auf so ziemlich allen Windows-Versionen; es bleibt nur noch das Problem mit mehreren Netzwerkadaptern in den Griff zu bekommen. Hier kommt mein Vorschlag: Als Anhaltspunkt benötigt man eine zuverlässige Aussage über die IP-Adresse des Rechners. Diese lässt sich aus ipconfig
leider nicht ableiten, dafür aber aus dem ping
-Befehl. Mit for /f "tokens=2 delims=" %a in ('ping -n 1 -4 %COMPUTERNAME% ^| find /I "%COMPUTERNAME%"') do @echo %a
ipconfig
-Befehls die Subnetzmaske unmittelbar (in der nächsten Zeile) nach der IP-Adresse des Netzwerkadapters, der uns interessiert, steht. Wir fitern die Ausgabe nach der IP-Adresse und der Zeichenkette "Subnet" ("Subnet" wegen der Gemeinsamkeit mit englischen u.a. Windows-Versionen).ipconfig | findstr "<meineIP-Adresse> Subnet"
SETLOCAL EnableDelayedExpansion
REM # IP-Adresse holen
for /f "tokens=2 delims=" %%a in ('ping -n 1 -4 %COMPUTERNAME% ^| find /I "%COMPUTERNAME%"') do set ip_adresse=%%a
for /f "tokens=2 delims=:" %%A in ('ipconfig ^| findstr "%ip_adresse% Subnet"') do (
REM # IP-Adresse bereinigen (Leerzeichen entfernen) und in einer
REM # temporären Variable speichern
for /f %%a in ("%%A") do set gefunden=%%a
REM # Die Subnetzmaske soll nur dann ausgelesen werden, wenn sie
REM # unmittelbar auf die "richtige" IP-Adresse folgt,
REM # ansonsten wird sie verworfen.
IF '!gefunden!'=='%ip_adresse%' (
set flag=1
) ELSE (
IF '!flag!'=='1' (
set subnetz_ip=!gefunden!
set flag=
)
)
)
set gefunden=
Jetzt haben wir, was wir brauchen, und können uns der Berechnung der Broadcast-Adresse widmen. Dazu müssen wir sowohl die IP-Adresse, als auch die Subnetzmaske in einzelne Oktette zerlegen.
for /f "tokens=1-4 delims=." %%A in ("%ip_adresse%") do (
set /A ip_adresse0=%%A
set /A ip_adresse1=%%B
set /A ip_adresse2=%%C
set /A ip_adresse3=%%D
)
for /f "tokens=1-4 delims=." %%A in ("%subnetz_ip%") do (
set /A subnetz_ip0=%%A
set /A subnetz_ip1=%%B
set /A subnetz_ip2=%%C
set /A subnetz_ip3=%%D
)
REM (subnetz_ip) XOR (255.255.255.255)
set /A inv_subnetz0=%subnetz_ip0%^^255
set /A inv_subnetz1=%subnetz_ip1%^^255
set /A inv_subnetz2=%subnetz_ip2%^^255
set /A inv_subnetz3=%subnetz_ip3%^^255
@echo Invertierte Subnetzmaske: %inv_subnetz0%.%inv_subnetz1%.%inv_subnetz2%.%inv_subnetz3%
REM (ip_adresse) OR (inv_subnetz)
set /A broadcast0=%ip_adresse0%^|%inv_subnetz0%
set /A broadcast1=%ip_adresse1%^|%inv_subnetz1%
set /A broadcast2=%ip_adresse2%^|%inv_subnetz2%
set /A broadcast3=%ip_adresse3%^|%inv_subnetz3%
@echo Broadcast-Adresse: %broadcast0%.%broadcast1%.%broadcast2%.%broadcast3%
REM ((subnetz_ip) XOR (255.255.255.255)) OR (ip_adresse)
set /A broadcast0=%subnetz_ip0%^^255^|%ip_adresse0%
set /A broadcast1=%subnetz_ip1%^^255^|%ip_adresse1%
set /A broadcast2=%subnetz_ip2%^^255^|%ip_adresse2%
set /A broadcast3=%subnetz_ip3%^^255^|%ip_adresse3%
@echo Broadcast-Adresse: %broadcast0%.%broadcast1%.%broadcast2%.%broadcast3%
Fertsch!
Ich war etwas erstaunt, als ich gesehen habe, das das mit einem bloßen Batch-Skript möglich ist.
Wer anstatt der Broadcast-Adresse die Netz-ID benötigt, kann das mit dem AND-Operator erledigen:
REM (ip_adresse) AND (subnetz_ip)
set /A netz_id0=%ip_adresse0%^&%subnetz_ip0%
set /A netz_id1=%ip_adresse1%^&%subnetz_ip1%
set /A netz_id2=%ip_adresse2%^&%subnetz_ip2%
set /A netz_id3=%ip_adresse3%^&%subnetz_ip3%
@echo Netz-ID: %netz_id0%.%netz_id1%.%netz_id2%.%netz_id3%
Grüße
format-c
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 208222
Url: https://administrator.de/contentid/208222
Ausgedruckt am: 25.11.2024 um 07:11 Uhr