Automatische Aktualisierung der Windows-Hosts-Datei mit FritzBox-DHCP-Namen
Warum brauche ich das?
Wer mit virtuellen Maschinen (VMs) auf einem Notebook arbeitet, kennt das Problem: Zuhause sind die VMs problemlos per Hostnamen erreichbar, weil die FritzBox als DHCP-Server die Namensauflösung übernimmt. Doch unterwegs oder in einem fremden Netzwerk klappt das nicht mehr – die Hostnamen werden nicht aufgelöst, und der Zugriff auf die VMs ist nur noch per IP-Adresse möglich.
Die manuelle Lösung besteht darin, die Datei C:\Windows\System32\drivers\etc\hosts zu pflegen und die Namen samt IP-Adressen der VMs einzutragen. Doch das ist mühsam und fehleranfällig. Die bessere Lösung? Ein PowerShell-Skript, das diese Datei automatisch mit den aktuellen DHCP-Geräten aus der FritzBox synchronisiert.
In diesem Artikel zeige ich, wie ich meine Windows-Hosts-Datei so automatisiere, dass meine VMs immer erreichbar bleiben – egal, ob ich zu Hause oder unterwegs bin.
Die Lösung: Ein PowerShell-Skript
Die FritzBox stellt über ihr Webinterface eine Liste aller im Netzwerk registrierten Geräte bereit, inklusive IP-Adressen und Hostnamen. Das PowerShell-Skript ruft diese Daten ab, filtert die relevanten Einträge heraus und aktualisiert die hosts-Datei auf meinem Windows-Notebook.
Hier ist das Skript, das ich in C:\Scripts\Update-Hosts.ps1 speichere:
# FritzBox URL
$fritzBoxUrl = "http://fritz.box"
$hostsFile = "C:\Windows\System32\drivers\etc\hosts"
$tempFile = "C:\Scripts\hosts_fritz.tmp"
# Hole die DHCP-Geräteliste von der FritzBox
$deviceList = Invoke-WebRequest -Uri "$fritzBoxUrl/data.lua?page=netDev" -UseBasicParsing | Select-Object -ExpandProperty Content
# Extrahiere IP-Adressen und Hostnamen
$matches = [regex]::Matches($deviceList, '"ip":"(?<ip>[\d\.]+)","name":"(?<name>[^\"]+)"')
# Sicherstellen, dass eine Datei existiert
New-Item -ItemType File -Path $tempFile -Force | Out-Null
# Header für die neue Hosts-Datei
"### FritzBox-DHCP-Hosts ###" | Set-Content -Path $tempFile
# Füge jedes Gerät in die Hosts-Datei ein
foreach ($match in $matches) {
$ip = $match.Groups["ip"].Value
$name = $match.Groups["name"].Value
"$ip`t$name" | Add-Content -Path $tempFile
}
# Backup der aktuellen Hosts-Datei anlegen
Copy-Item -Path $hostsFile -Destination "$hostsFile.bak" -Force
# Aktualisiere die Hosts-Datei (mit Admin-Rechten)
Get-Content $hostsFile | Where-Object { $_ -notmatch "### FritzBox-DHCP-Hosts ###" } | Set-Content $hostsFile
Get-Content $tempFile | Add-Content -Path $hostsFile
Automatische Ausführung als geplante Aufgabe
Damit das Skript regelmäßig läuft, richte ich es in der Windows-Aufgabenplanung ein:
Schritt 1: Skript mit Admin-Rechten testen
- PowerShell als Administrator öffnen
- Skript manuell ausführen:
powershell -ExecutionPolicy Bypass -File C:\Scripts\Update-Hosts.ps1 - Falls die Hosts-Datei korrekt aktualisiert wird, ist alles bereit für die Automatisierung.
Schritt 2: Geplante Aufgabe erstellen
- Windows-Taste + R drücken,
taskschd.msceingeben und Enter. - Neue Aufgabe erstellen:
- Name:
FritzBox DHCP Hosts aktualisieren - Haken setzen bei Mit höchsten Rechten ausführen (weil
hosts-Datei Admin-Rechte braucht).
- Name:
- Trigger hinzufügen:
- „Bei Anmeldung“ oder „Alle 30 Minuten“ (je nach Bedarf).
- Aktion hinzufügen:
- Programm:
powershell.exe - Argumente:
-ExecutionPolicy Bypass -File C:\Scripts\Update-Hosts.ps1
- Programm:
- Speichern & Testen:
- Aufgabe manuell starten → Rechtsklick → „Ausführen“.
- Prüfen, ob die FritzBox-Namen in
C:\Windows\System32\drivers\etc\hostseingetragen wurden.
Ergebnis
✔ Hostnamen meiner FritzBox-DHCP-Geräte werden automatisch aktualisiert.
✔ Windows kann meine VMs per Hostnamen ansprechen, auch ohne FritzBox-DNS.
✔ Läuft im Hintergrund als geplante Aufgabe, keine manuelle Pflege nötig.
Jetzt kann ich meine VMs unterwegs einfach per Hostnamen erreichen, egal in welchem Netzwerk ich mich befinde. Problem gelöst! 🚀
0 Kommentare