Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Broadcast-Adresse per Batch-Skript in Windows

Tipp Microsoft Windows Netzwerk

Mitglied: format-c

format-c (Level 1) - Jetzt verbinden

18.06.2013, aktualisiert 19.06.2013, 4964 Aufrufe, 1 Danke

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.
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=
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.
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.
)
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.
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%
Jetzt bleibt uns nur, alle Host-Bits der IP-Adresse auf "1" zu setzen. Dazu nehmen wir den OR-Operator.
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%
Oder man erledigt beides in einem Schritt und spart sich unnötige Umgebungsvariablen.
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%
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:
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
Firewall
Welche Firewall ? (18)

Frage von Cyberurmel zum Thema Firewall ...

Windows Server
gelöst Einzelnes Windows Update über GPO deinstallieren (16)

Frage von lordofremixes zum Thema Windows Server ...