DNS-Server bei WLAN-Wechsel unter Windows ändern

In meinem Heimnetz habe ich einen eigenen DNS-Server eingerichtet, der ein paar lokale, aber auch von extern erreichbare Domains gleich im lokalen Netz auflöst.

Diesen DNS-Server muss man in den Netzwerkeinstellungen seines Rechners dann explizit konfigurieren. Auf dem Notebook hat dies aber den Nachteil, dass die Adresse des DNS-Servers auch bei Wechsel des WLANs beibehalten wird und dort die Namensauflösung dann fehlschlägt. Jedenfalls bietet mein WLAN-Kartentreiber keine Möglichkeit, je Netzwerk die Konfiguration vorzunehmen.

Unter Windows kann man sich jedoch Abhilfe mit einem kleinen Powershell-Skript und einer Windows-Aufgabe schaffen, was ich hier erläutern möchte.

Getestet habe ich die im Folgenden beschriebene Konfiguration auf zwei aktuellen Windows 10 Pro und Home Systemen unter Windows 1511 und 1607.

Das Powershell-Skript

Name des WLAN-Interfaces

Das Skript braucht den Namen des WLAN-Interfaces, welchen man über folgenden Befehl auf der Eingabeaufforderung heraus bekommt:

netsh interface show interface

interface-nameIn diesem Fall ist der Name schlicht WLAN.

Aktivieren von Powershell-Skripten

Standardmäßig unterbindet Windows das Ausführen von Powershell-Skripten. Um das Ausführen zu aktivieren, hilft dieser Beitrag bei Superuser.com.
Kurz zusammengefasst:

  1. PowerShell als Administrator starten
  2. Den Befehl
    set-executionpolicy remotesigned

    ausführen.

Damit wird das Ausführen lokaler Skripte erlaubt.

Das DNSchanger-Skript

Folgendes Skript ist dann lokal als z.B. DNSchanger.ps1 zu speichern.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
$Logfile = "DNSchanger.log"
$targetSSID = "my-wifi-ssid"
$interface = "WLAN"
 
Function LogWrite
{
   Param ([string]$logstring)
   $cTime = Get-Date -UFormat "%Y-%m-%d %T %Z"
 
   Add-content $Logfile -value "$cTime - $logstring"
}
 
#Determine current SSID
$output = netsh wlan show interfaces | Select-String '\sSSID'
$cSSID = ($output -split ":")[-1].Trim() -replace '"'
 
LogWrite "Current SSID: $($cSSID)"
 
 
If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(`
    [Security.Principal.WindowsBuiltInRole] "Administrator"))
{
 
    Write-Warning "You do not have Administrator rights to run this script!`nPlease re-run this script as an Administrator!"
 
    Break
 
}
else {
    if ($cSSID -eq $targetSSID) {
        netsh interface ipv4 add dnsserver $interface address="192.168.xx.2" index=1
        netsh interface ipv4 add dnsserver $interface address="192.168.xx.1" index=2
        netsh interface ipv6 add dnsserver $interface address="2001:xxx:xxx::53:2" index=1
        netsh interface ipv6 add dnsserver $interface address="2001:xxx:xxx::53:1" index=2
 
        ipconfig /flushdns
    }
    else {
        netsh interface ipv4 set dns $interface dhcp
        netsh interface ipv6 set dns $interface dhcp
 
        ipconfig /flushdns
    }
}

In Zeile 1 wird mit $Logfile der Dateiname für eine Log-Datei festgelegt, in welche die neue SSID bei Wechsel geschrieben wird. Das Skript legt diese Datei im Arbeitsverzeichnis an. $targetSSID wird die SSID des gewünschten WLANs zugewiesen. Und $interface bekommt den oben bestimmten Namen der WLAN-Karte.

Das Skript bestimmt dann mit einem netsh Befehl die aktuelle SSID, stellt sicher, dass es mit Administratorrechten läuft und ändert, wenn es sich im angegebenen WLAN befindet ab Zeile 31 den DNS-Server gemäß den Vorgaben, welche an die eigenen Begebenheiten anzupassen sind. Die Einträge mit Index 1 sollten die IPv4 und v6 des eigenen DNS-Server bekommen und die Einträge mit Index 2 die IP des Routers als Backup.

Sollte das Notebook in ein anderes WLAN eingeloggt werden, stellt das Skript ab Zeile 39 sicher, dass für IPv4 und v6 der DNS-Server wieder über DHCP ermittelt wird.

So weit so schön, jetzt muss das Skript nur noch bei Wechsel des WLANs auch aufgerufen werden, womit das Thema wechselt zu

Die Windows-Aufgabe

Windows kann bei Bereitschaft des Netzwerks eine Aufgabe ausführen, was hier genutzt werden soll.

Dazu lege man eine neue Aufgabe über die Aufgabenplanung an. Der Name ist frei wählbar, bei Bedarf kann die Aufgabe unabhängig von der Anmeldung ausgeführt werden, wichtig ist jedoch, dass dies mit höchsten Privilegien passiert.

Einzustellender Trigger für die Aufgabe.
Einzustellender Trigger für die Aufgabe.

Als Trigger stellt man Bei einem Ereignis ein, siehe Bild. Dann sind einzustellen:

  • Protokoll: Microsoft-Windows-NetworkProfile/Betriebsbereit
  • Quelle: NetworkProfile
  • Ereignis-ID: 10000

Im folgenden Reiter Aktion wählt man Programm starten. Das entsprechende Programm ist schlicht PowerShell mit dem im nächsten Feld angegebenen Argument .\DNSchanger.ps1. Starten in benötigt den Speicherort des Skripts ohne abschließenden Backslash und ohne Anführungszeichen, also z.B. C:\users\myname\software\dnschanger.

Bedingungen der Aufgabenausführung
Bedingungen der Aufgabenausführung

Da das Skript wohl auf einem Notebook ausgeführt wird, sollte man im Reiter Bedingungen noch den Haken entfernen, dass die Aufgabe nur startet, falls der Computer im Netzbetrieb läuft.

Nun kann die Aufgabe gespeichert werden. Beim nächsten Wechsel des WLANs startet diese dann, was u.a. an der Logdatei überprüfbar ist.

Fazit

Dieses kleine Skript ermöglicht auf einfache Weise im eigenen Netz individuelle Domain-Namensauflösungen durchzuführen, ohne manuelle Einstellungen der Netzwerkkonfiguration bei Wechsel des Standorts erforderlich zu machen.

Die Möglichkeiten sind hier nicht auf den DNS-Server beschränkt. Auf Grundlage des obigen Skript und bei hinreichender Kenntnis von Powershell (oder Google), können somit beliebige Aktionen ausgelöst werden. Eine Idee wäre beispielsweise das automatische Stummschalten des Rechners am Arbeitsplatz.