Netzwerkeinstellungen (remote) ändern mit netsh und PowerShell

    Powershell-LogoMeistens ändert man die Einstellungen für einen Netzwerkadapter über die grafische Oberfläche. Möchte man diese Anpassungen über ein Script oder die Kommandozeile vornehmen, dann bieten sich dafür netsh und PowerShell an. Letztere kann man auch auf Remote-Computer anwenden.

    Die häufigsten Änderungen der IP-Konfiguration betreffen den Wechsel zwischen DHCP und statischen Einstellungen sowie die Festlegung von IP-Adresse, Standard-Gateway und DNS-Server.

    IP-Konfiguration mit netsh.exe

    Für die Anwendung in Batch-Dateien und in der Eingabeaufforderung ist netsh.exe vorgesehen. Dieses Dienstprogramm ist zwar mächtig, aber mit seiner umständlichen Syntax und den daraus resultierenden Parameter-Rattenschwänzen nicht leicht zu bedienen.

    Im Fall der IP-Einstellungen sind die Hürden indes relativ niedrig. Im ersten Schritt ruft man die Einstellungen aller vorhandenen Adapter ab, so dass man aus dem Ergebnis entnehmen kann, welchen davon man konfigurieren möchte:

    netsh interface ipv4 show interface

    Anschließend kann man einen bestimmten Adapter über seinen Namen so konfigurieren, dass er die IP-Adresse über DHCP bezieht:

    netsh interface ipv4 set address name="LAN-Verbindung" source=dhcp

    Der umgekehrte Weg ist ebenfalls möglich, wobei sich feste Werte für IP-Adresse, Maske und Gateway in einem Aufruf setzen lassen:

    netsh interface ipv4 set address source=static address=192.168.0.55 mask=255.255.255.0 gateway=192.168.0.1

    Anschließend fügt man noch die DNS-Server nach folgendem Muster hinzu:

    netsh interface ipv4 set dnsservers "LAN-Verbindung" static 192.168.0.1 primary

    Limitierte Remote-Fähigkeiten von netsh

    Glaubt man der Online-Hilfe von netsh.exe, dann wäre das Programm auch in der Lage, über den Schalter -r einen Remote-PC zu konfigurieren. In der Praxis besitzt es diese Fähigkeit aber nicht, weil remote eine Reihe von Kontexten fehlt. Man rufe dazu

    netsh -r <remote-pc> interface ipv4 show

    auf und vergleiche das Ergebnis mit der entsprechenden lokalen Abfrage. Leider gibt das Programm keinen Hinweis auf dieses Manko und liefert statt einer Fehlermeldung beim Remote-Aufruf nur die IP-Einstellungen des lokalen Rechners.

    PowerShell plus WMI

    In PowerShell muss man bis Windows 7 den Weg über WMI gehen, um Adaptereinstellungen abzurufen und zu ändern. Zuständig ist dafür das Cmdlet Get-WMIObject (Alias gwmi). Die aktuellen Einstellungen erhält man mit

    Get-WMIObject Win32_NetworkAdapterConfiguration -filter IPenabled=true

    Hier werden nur die Werte für Adapter abgerufen, bei denen IP aktiviert ist. Dieser Vorgang lässt sich auch auf Remote-PCs anwenden, wenn man diese über den Parameter -ComputerName angibt.

    Aus dem Ergebnis des obigen Aufrufs entnimmt man den Index des gewünschten Adapters und speichert seine Eigenschaften in einer Variablen (im folgenden Beispiel für den Index '0'):

    $MyNic = gwmi -ComputerName <remotePC> Win32_NetworkAdapterConfiguration -filter "index='0'"

    Anschließend kann man auf die Eigenschaften und Methoden des Objekts zugreifen, um die gewünschten Änderungen auszuführen. So würde man den Adapter mit

    $MyNic.EnableDHCP

    für DHCP konfigurieren. Umgekehrt kann man mit der Methode EnableStatic eine feste IP-Adresse zuweisen:

    $MyNic.EnableStatic("192.168.0.2", "255.255.255.0")

    Im nächsten Schritt legt man das Gateway mit einem Befehl nach dem Muster

    $MyNic.SetGateways("192.168.0.1")

    fest. Den bzw. die DNS-Server trägt man schließlich über die Methode SetDNSServerSearchOrder ein:

    $MyNic.SetDNSServerSearchOrder("192.168.0.10")

    Möchte man mehrere DNS-Server festlegen, dann muss man sie als Liste von Komma-separierten Zeichenketten in einer Variablen speichern und dann diese an SetDNSServerSearchOrder übergeben.

    PowerShell ab Windows 8 und Server 2012

    Die neuesten Windows-Versionen bringen eine Vielzahl von neuen Cmdlets für Netzwerk-Adapter und IP- sowie DNS-Einstellungen mit. Get-NetAdapter eignet sich, um sich eine Übersicht über die installierten Adapter zu verschaffen und deren Index bzw. InterfaceAlias zu ermitteln:

    Get-NetAdapter|select ifDesc, ifAlias, ifIndex, MediaType | fl

    Wenn man erst die aktuelle IP-Konfiguration eines Adapters abrufen möchte, bevor man sie verändert, dann ist dafür Get-NetIPConfiguration eine Alternative zu ipconfig. Man erhält damit Angaben zu IP-Adressen, DHCP oder DNS-Server:

    Get-NetIPConfiguration -ifAlias "Ethernet" -Detailed

    Das als Filter angegebene ifAlias entspricht dem InterfaceAlias, das man dem Output von Get-NetAdapter entnehmen kann.

    Adapter-Einstellungen ändern

    Nun kann man die IP-Einstellungen ändern, vorausgesetzt man hat PowerShell mit administrativen Rechten gestartet. Der Wechsel zwischen DHCP und statischer Konfiguration erfolgt mit Hilfe von Set-NetIPInterface:

    Set-NetIPInterface -ifAlias Ethernet -DHCP Enabled

    Dieser Aufruf aktiviert DHCP für den Adapter mit dem InterfaceAlias "Ethernet". Der Verwendung des Werts Disabled ist dagegen der erste Schritt zu einer Konfiguration mit festen Adressen, die man dann mit

    New-NetIPAddress -ifAlias Ethernet -IPAddress 192.168.0.15 -PrefixLength 24 -DefaultGateway 192.168.0.1

    vergibt. Der Parameter -PrefixLength legt die Netmask fest, und zwar in der CIDR-Notation, so dass der Wert 24 für 255.255.255.0 steht (siehe dazu unseren Beitrag zu Subnetting und Supernetting).

    Schließlich ist für den Eintrag des bzw. der DNS-Server noch ein weiteres Cmdlet namens Set-DnsClientServerAddress zuständig:

    Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ServerAddresses ("192.168.0.10", "192.168.0.1")

    Im Gegensatz zu den anderen Cmdlets akzeptiert Set-DnsClientServerAddress für den Parameter -InterfaceAlias nicht die Kurzform -ifAlias. Möchte man mehrere DNS-Server eintragen, dann erfolgt dies wieder in Form von Zeichenketten, die durch Kommata getrennt werden.

    Alle genannten Operationen unter Windows 8 und Server 2012 lassen sich auch auf Remote-PCs anwenden, wenn man deren Namen über den Parameter -CimSession mitteilt. Im Übrigen funktioniert die deutlich einfachere Vorgehensweise mit Get-WMIObject auch weiterhin.

    2 Kommentare

    Bild von Kevin Brandenstein
    Kevin Brandenstein sagt:
    30. Juli 2014 - 12:06

    Kleiner Fehler:
    - 'netsh interface ipv4 set dnsservers "LAN-Verbindung" static 192.168.0.1 primary'

    muss heißen 'netsh interface ipv4 set dnsservers name="LAN-Verbindung" static 192.168.0.1 primary'
    und könnte z.B. auch heißen
    'netsh interface ipv4 set dnsservers name="LAN-Verbindung" dhcp'

    Bild von Wolfgang Sommergut
    30. Juli 2014 - 13:17

    Beides geht, den Namen des Parameters muss man in diesem Fall nicht unbedingt angeben.