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 netshell auszulesen. Mit
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 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 ist das schnell erledigt. Nun nutzen wir die Tatsache aus, dass in der Ausgabe des 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).
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
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. Mit
netsh 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
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 | findstr "<meineIP-Adresse> Subnet"
01.
SETLOCAL EnableDelayedExpansion
02.
03.
REM # IP-Adresse holen
04.
for /f "tokens=2 delims=[]" %%a in ('ping -n 1 -4 %COMPUTERNAME% ^| find /I "%COMPUTERNAME%"') do set ip_adresse=%%a
05.
06.
for /f "tokens=2 delims=:" %%A in ('ipconfig ^| findstr "%ip_adresse% Subnet"') do (
07.
REM # IP-Adresse bereinigen (Leerzeichen entfernen) und in einer
08.
REM # temporären Variable speichern
09.
for /f %%a in ("%%A") do set gefunden=%%a
10.
REM # Die Subnetzmaske soll nur dann ausgelesen werden, wenn sie
11.
REM # unmittelbar auf die "richtige" IP-Adresse folgt,
12.
REM # ansonsten wird sie verworfen.
13.
IF '!gefunden!'=='%ip_adresse%' (
14.
set flag=1
15.
) ELSE (
16.
IF '!flag!'=='1' (
17.
set subnetz_ip=!gefunden!
18.
set flag=
19.
)
20.
)
21.
)
22.
set gefunden=
01.
for /f "tokens=1-4 delims=." %%A in ("%ip_adresse%") do (
02.
set /A ip_adresse0=%%A
03.
set /A ip_adresse1=%%B
04.
set /A ip_adresse2=%%C
05.
set /A ip_adresse3=%%D
06.
)
07.
for /f "tokens=1-4 delims=." %%A in ("%subnetz_ip%") do (
08.
set /A subnetz_ip0=%%A
09.
set /A subnetz_ip1=%%B
10.
set /A subnetz_ip2=%%C
11.
set /A subnetz_ip3=%%D
12.
)
01.
REM (subnetz_ip) XOR (255.255.255.255)
02.
set /A inv_subnetz0=%subnetz_ip0%^^255
03.
set /A inv_subnetz1=%subnetz_ip1%^^255
04.
set /A inv_subnetz2=%subnetz_ip2%^^255
05.
set /A inv_subnetz3=%subnetz_ip3%^^255
06.
@echo Invertierte Subnetzmaske: %inv_subnetz0%.%inv_subnetz1%.%inv_subnetz2%.%inv_subnetz3%
01.
REM (ip_adresse) OR (inv_subnetz)
02.
set /A broadcast0=%ip_adresse0%^|%inv_subnetz0%
03.
set /A broadcast1=%ip_adresse1%^|%inv_subnetz1%
04.
set /A broadcast2=%ip_adresse2%^|%inv_subnetz2%
05.
set /A broadcast3=%ip_adresse3%^|%inv_subnetz3%
06.
@echo Broadcast-Adresse: %broadcast0%.%broadcast1%.%broadcast2%.%broadcast3%
01.
REM ((subnetz_ip) XOR (255.255.255.255)) OR (ip_adresse)
02.
set /A broadcast0=%subnetz_ip0%^^255^|%ip_adresse0%
03.
set /A broadcast1=%subnetz_ip1%^^255^|%ip_adresse1%
04.
set /A broadcast2=%subnetz_ip2%^^255^|%ip_adresse2%
05.
set /A broadcast3=%subnetz_ip3%^^255^|%ip_adresse3%
06.
@echo Broadcast-Adresse: %broadcast0%.%broadcast1%.%broadcast2%.%broadcast3%
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:
01.
REM (ip_adresse) AND (subnetz_ip)
02.
set /A netz_id0=%ip_adresse0%^&%subnetz_ip0%
03.
set /A netz_id1=%ip_adresse1%^&%subnetz_ip1%
04.
set /A netz_id2=%ip_adresse2%^&%subnetz_ip2%
05.
set /A netz_id3=%ip_adresse3%^&%subnetz_ip3%
06.
@echo Netz-ID: %netz_id0%.%netz_id1%.%netz_id2%.%netz_id3%
Grüße
format-c
Ähnliche Inhalte
Neue Wissensbeiträge
Heiß diskutierte Inhalte