Powershell: Netzwerkadapter-Konfiguration ändern

Viele Dinge lassen sich wunderbar mit der Powershell automatisieren. So kann man beispielsweise auch die IP-Adresse eines Netzwerkadapters per Skript anpassen. Dies könnte beispielsweise sinnvoll sein, wenn jemand sich in der manuellen Konfiguration nur nach Anleitung zu Recht findet. Dann kann man ihm vorher die Powershell-Datei bereitstellen. Er braucht sie dann nur als Admin starten. Leider gibt es bei der IP-Konfiguration per Powershell aber ein paar unschöne Fallstricke, über die ich gestolpert bin.

IP-Einstellungen ändern

Als erstes benötigt man den Adapter, den man konfigurieren will. Für meine Zwecke war es ausreichend den aktiven Adapter mit Hilfe eines Filters zu ermitteln und das WMI-Objekt in eine Variable zu stecken:

Anschließend lassen sich die Einstellungen des Netzwerkadapters (IP-Adresse, Subentzmaske, DNS-Server, Gateway)  über entsprechende Funktionen setzen. Dies wendet man auf die Variable mit dem WMI-Objekt an:

In diesem Beispiel kommen die zu setzenden IP-Adressen aus Variablen, die in meinem Skript an einer anderen Stelle festgelegt werden.

Möchte man stattdessen von einer statischen Konfiguration zu einer automatischen Konfiguration per DHCP wechseln, benötigt man folgenden Befehl:

 

Problem

Vielen Leuten ist es wahrscheinlich gar nicht bewusst, aber man kann einem Adapter grundsätzlich mehr als ein Standardgateway zuweisen. Ebenso kann man ihm auch einen ganzen Haufen IP-Adressen zuweisen. Dies funktioniert auch über die GUI:

 

Bei der Konfiguration via Powershell gibt es aber einen wirklich unschönen Unterschied zur Konfiguration mittels des guten alten Tools „netsh“ oder über die GUI. Denn ein einmal gesetztes Standardgateway wird durch das Ändern der Adaptereinstellungen nicht wieder entfernt. Nicht einmal dann, wenn man den Adapter auf DHCP umschaltet! Der Befehl „EnableDHCP“ ist also nicht gleichbedeutend mit einem Klick auf „IP-Adressen automatisch beziehen“ in der GUI. Bei diesem wird der Eintrag für das Standardgatewy bekanntermaßen einfach geleert.

Stattdessen wird durch den Befehl „SetGateways“ immer nur ein Wert zu den vorhandenen Gateways hinzugefügt. Auch das Auführen von „SetGateways()“ ohne Angabe von Parametern löscht bereits vorhandene Werte nicht aus der Konfiguration.

 

Lösung

Da sich Standardgateway nicht durch das Anlegen eines neuen Gateways ändern lässt, kam ich am Ende nur bei einer möglichen Lösung aus. Da das Gateway letzt endlich nur als die Default Route im System hinterlegt ist, schmeiße ich diese Default Route einfach weg:

Mit diesem Befehl braucht man die als Standard-Gateway hinterlegte IP-Adresse nicht  zu kennen um dieses los zu werden. Problematisch ist dies allerdings, wenn mehrere Standardgateways genutzt werden sollen. Diese werden dann alle gelöscht und müssen auch alle neu angelegt werden.

Der Zusatz „confirm:$false“ wird innerhalb eines Skriptes benötigt. Denn es handelt sich um einen „Remove“-Befehl, bei welchen standardmäßig eine manuelle Nachfrage durch Powershell verlangt wird.

 

Schreibe einen Kommentar