Wenn in einer Umgebung mit vielen Rechnern die DNS-Einträge angepasst werden müssen und bisher, aus welchen Gründen auch immer, kein DHCP verwendet wird kann folgendes von mir modifiziertes Batch-Skript helfen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
timeout /t 30 dir \\192.168.xyz.xyz\dns\ | find /i "%COMPUTERNAME%" if not errorlevel 1 (goto ENDE) ipconfig >> C:\ipconfig.txt for /f "tokens=*" %%f in (C:\ipconfig.txt) do ( if not exist C:\ipgefunden.txt ( echo %%f | find "Ethernet" if not errorlevel 1 (set nictemp=%%f) echo %%f | find "192.168.xyz." if not errorlevel 1 (echo IP gefunden >> C:\ipgefunden.txt) ) ) netsh interface ip add dns name="%nictemp:~17,-1%" 192.168.xyz.xyz index=1 netsh interface ip add dns name="%nictemp:~17,-1%" 192.168.xyz.xyz index=2 del C:\ipconfig.txt del C:\ipgefunden.txt echo DNS wurde umgestellt >> \\192.168.xyz.xyz\dns\%COMPUTERNAME%.txt :ENDE |
Was bewirken die einzelnen Zeilen des Skriptes?
1 2 3 4 |
timeout /t 30 dir \\192.168.xyz.xyz\dns\ | find /i "%COMPUTERNAME%" if not errorlevel 1 (goto ENDE) ipconfig >> C:\ipconfig.txt |
Zur Sicherheit habe ich ein Timeout eingebaut, da man das Skript idealerweise per Gruppenrichtlinie als Startskript verteilen sollte.
Danach wird ein Netzlaufwerk nach einer Datei durchsucht die den Namen des Computers trägt, welcher mit Hilfe der Umgebungsvariable ermittelt wird. Wenn die Datei gefunden wird springt das Skript direkt zur Marke „ENDE“ und es wird nichts weiter ausgeführt, da das Skript bereits einmal durchgelaufen ist.
Wird die Datei nicht gefunden wird per ipconfig die Netzwerkkonfiguration ausgelesen und in eine Datei umgeleitet.
1 2 3 4 5 6 7 8 |
for /f "tokens=*" %%f in (C:\ipconfig.txt) do ( if not exist C:\ipgefunden.txt ( echo %%f | find "Ethernet" if not errorlevel 1 (set nictemp=%%f) echo %%f | find "192.168.xyz." if not errorlevel 1 (echo IP gefunden >> C:\ipgefunden.txt) ) ) |
Mit dieser Schleife wird die zuvor erstellte ipconfig-Datei Zeile für Zeile ausgelesen. Es wird solange die Variable nictemp für die Zuordnung des Netzwerkadapters mit dem aktuell gefundenen Netzwerkadapter überschrieben bis der Netzwerkadapter mit dem gewünschten IP-Bereich gefunden wurde. Dies ist besonders hilfreich in Umgebungen wo es viele physische bzw. virtuelle Netzwerkadapater, z.B. von VMware oder VirtualBox, gibt.
Wurde der richtige Adapter gefunden wird eine Datei erstellt die dies symbolisiert, sodass im weiteren Schleifendurchgang die Variable nicht mehr überschrieben wird.
1 2 3 4 5 6 |
netsh interface ip add dns name="%nictemp:~17,-1%" 192.168.xyz.xyz index=1 netsh interface ip add dns name="%nictemp:~17,-1%" 192.168.xyz.xyz index=2 del C:\ipconfig.txt del C:\ipgefunden.txt echo DNS wurde umgestellt >> \\192.168.xyz.xyz\dns\%COMPUTERNAME%.txt :ENDE |
Die aktuellen Einstellungen des Netzwerkadapters können nun überschrieben werden. Der zuvor ermittelte Name des Netzwerkadapters aus der ipconfig-Datei muss dabei noch etwas umformatiert werden. Die ersten 17 Zeichen („Ethernet-Adapter“ mit folgendem Leerzeichen) und der abschließende Doppelpunkt werden entfernt.
Mit Hilfe der Angabe eines Index-Wertes kann man die Reihenfolge der neu einzutragenden DNS-Server bestimmen bzw. überschreiben.
Zu guter Letzt werden die temporären Textdateien wieder entfernt und eine Datei mit dem Computernamen wird erstellt, die am Anfang des Skriptes gesucht wurde. So erhält man gleich eine schöne Übersicht auf welchem Computer das Skript schon gelaufen ist und es wird dort der DNS-Eintrag nicht mehr angepasst.
Ob das Skript noch in älteren Windows-Versionen noch läuft habe ich nicht getestet. Unter Windows 7 und 8 funktioniert es jedenfalls problemlos.
Die Grundlage für dieses Skript habe ich hier ausgegraben. Dort gibt es auch noch eine Fallunterscheidung für Windows XP.
Goto in C#, Python, PHP, Excel VBA, Bash, PowerShell nutzen?
Batch: if und else - Syntax verstehen
While- und Until-Schleifen in PowerShell und Batch
Wie lange läuft mein PC schon? – PC Laufzeit auslesen unter Windows 10
Wochentag in einer Batch-Datei ermitteln
CMD/Powershell: Ping-Ergebnis mit Errorlevel auswerten
Skript um Zeit-basiert Dateien zu tauschen
Die Gefahr durch mit Adminrechten ausgeführte Skripte
Powershell und CMD: Clear um Konsole zu leeren?
Java-Anwendungen über CMD oder Powershell starten
Kommandozeile aus Explorer in geöffnetem Ordner
Umlaute in Batch-Dateien – immer wieder schön