format-c
Goto Top

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.
for /f %a in ('arp -a ^| find /I "ff-ff-ff-ff-ff-ff" ^| find /V "255.255.255.255"') do @echo %a
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
netsh interface ipv4 show addresses <Index-Nr.>
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:
netsh interface ipv4 show route
Hier muss man wieder tricksen, um die Nummer des gewünschten Netzwerkadapters zu isolieren. Z.B. mit
for /f "tokens=5" %i in ('netsh interface ipv4 show route ^| find "0.0.0.0/0"') do @echo %i
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
for /f "tokens=2 delims=" %a in ('ping -n 1 -4 %COMPUTERNAME% ^| find /I "%COMPUTERNAME%"') do @echo %a
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).
ipconfig | findstr "<meineIP-Adresse> Subnet"
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.
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
)
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.
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%
Jetzt bleibt uns nur, alle Host-Bits der IP-Adresse auf "1" zu setzen. Dazu nehmen wir den OR-Operator.
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%
Oder man erledigt beides in einem Schritt und spart sich unnötige Umgebungsvariablen.
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

Content-Key: 208222

Url: https://administrator.de/contentid/208222

Ausgedruckt am: 28.03.2024 um 19:03 Uhr