Lokale Ip mit Batch Script ändern?

3 Antworten

netsh interface ip set address "LAN-Verbindung" static 192.168.178.41 255.255.255.0 IP-GW X

Musst halt den namen der "Lan-verbindung" wissen und die jeweilige GW-IP.

Das X braucht halt dann noch den Wert für die Metrik. Müsste man ausprobieren, ob die Metrik übernommen wird, wenn da nix eingetragen wird.

Ich möchte definitiv kein Schaden verursachen

Das glaube ich Dir gern.

Erst gestern hatten wir hier jemanden, der sich das Gateway weggeschossen hatte. (sowas passiert nicht von selbst)

Theorethisch kannst Du das auch Script kopieren. Besser wäre es jedoch zu begreifen was diese Batch tut. Das akquirieren der nötigen Daten ist das wichtigste für ein Programm welches weitgehend automatisch ablaufen soll.

Hier eine nahezu narensichere Batch... .diese legt sogar eine zweite Batch an, um wieder auf automatischen Bezug der Adresse zu schalten.

Die Anderen haben wunderbar aus dem weiten Netz abgeschrieben...Beifall.

Ganz so einfach kopieren is auch nicht!!! Ich habe zusätzlich dafür gesorgt, das die getätigten Einstellungen nur bis zum nächsten Neustart existieren. Danach ist alles wie zuvor. (zusätzliche Sicherheit gegen Dummheit.)

Das ist Batch und der code liegt vor Dir wie ein offenes Buch . Wenn Du soweit bist zu verstehen was da so alles abläuft. Wirst Du auch in der Lage sein die Veränderungen persistent zu machen.

@echo off
chcp 65001 >nul
setlocal enableDelayedExpansion
  rem  Verbindungsnamen und MAC holen (letztere zum spezifizieren des richtigen Adapters)
for /f "tokens=2,3 delims=," %%a in ('"wmic nic where NetEnabled=True get NetConnectionID,MACAddress,TimeOfLastReset /format:csv"') do (
    set "__nicMACAddress=%%a"
    set "__nicNetConnectionID=%%b"
)


  rem Adressrohdaten holen  (wmic macht weniger arbeit als  das filtern der eingedeutschten Ipconfigausgabe)
for /f "usebackq tokens=*" %%. in (`"wmic nicconfig where MACAddress='%__nicMACAddress%' get DefaultIPGateway,DNSServerSearchOrder,GatewayCostMetric,IPAddress,IPSubnet,SettingID /format:csv"`) do (
      rem leere Felder mit "n/a" auffüllen  (eines  der Dinge  die passieren  können, wenn man nicht konsequent alle Paramater setzt )
    set "__dummyLine=%%."
    for /f " tokens=2-6 delims=," %%a in ("!__dummyLine:,,=,n/a,!") do (
        set "__nicConfigDefaultIPGateway=%%~a"
        set "__nicConfigDNSServerSearchOrder=%%~b"
        set "__nicGatewayCostMetric=%%~c"
        set "__nicConfigIPAddress=%%~d"
        set "__nicConfigIPSubnet=%%~e"
    )
)


  rem !!!!!!!!!!!!!!!!Der ganze Aufwand, dass der Nutzer  sich nicht  selbst abschießt!!!!!!!!!!!!!!!!!!!!
  rem nicht jedes System  muss zwangsläufig IPv6 gesetzt haben (zB ältere Router aus vor 2007;  ja  die sind noch immer am Netz)
  rem Ipv4 adressen einzeln ausfiltern , mögliche unterschiedliche Anzahl von Feldern macht sonst die Selektion zum Russischroulett)
  rem  Gatway zuerst.
for /f "tokens=1 delims=;{} " %%a in ("%__nicConfigDefaultIPGateway%") do (
    set "__localNetworkIPv4Gateway=%%~a"
)
  rem 2 DNS sind Standard ,Länge von DNS kann vareiren!(andere verwerfen)
for /f "tokens=1,2 delims=;{} " %%a in ("%__nicConfigDNSServerSearchOrder%") do (
    set "__localNetworkDNS1=%%~a"
    set "__localNetworkDNS2=%%~b"
)
  rem  wir  brauchen nur die SubnetMaske
for /f "tokens=1 delims=;{} " %%a in ("%__nicConfigIPSubnet%") do (
    set "__localNetworkSubnetMask=%%~a"
)
  rem und zu guter letzt die aktuelle eigene IPv4Adresse
for /f "tokens=1 delims=;{} " %%a in ("%__nicConfigIPAddress%") do (
    set "__localNetworkIPv4=%%~a"
)
  rem Gatewaymetrik
for /f "tokens=1 delims=;{} " %%a in ("%__nicGatewayCostMetric%") do (
    set "__localNetworkGatewayMetric=%%~a"
)
set "__localNetworkConnectionID=%__nicNetConnectionID%"


echo:
echo Nur die  sind erstmal wichtig
set __localNetwork
  rem bis zu diesem Punkt ging es nur um das sammeln der aktuellen Daten


  rem dafür sorgen, das der Nutzer im Netzwerkbereich des Gateways bleibt  (es gibt neben gebräuchlichen 8bit-IP-Raum sind auch 16,20 und 24Bit gebrächlich)
  rem die folgenden Testroutine  unterstützten der Einfachheithalber nicht den 20 Bit UserAdressRaum!!!!
  rem zerlege IPv4 und SubnetMask
for /f "tokens=1-4 delims=." %%a in ("%__localNetworkIPv4%") do (
    set "__IPv4Spilt_1=%%a"
    set "__IPv4Spilt_2=%%b"
    set "__IPv4Spilt_3=%%c"
    set "__IPv4Spilt_4=%%d"
)
for /f "tokens=1-4 delims=." %%a in ("%__localNetworkSubnetMask%") do (
    set "__SubnetMaskSpilt_1=%%a"
    set "__SubnetMaskSpilt_2=%%b"
    set "__SubnetMaskSpilt_3=%%c"
    set "__SubnetMaskSpilt_4=%%d"
)


  rem filtere IPv4 Basisbereich aus (hier siehst Du wozu die Subnetmaske dient!)
set "__BaseIP="
for /l %%a in (1,1,4) do (
    if !__SubnetMaskSpilt_%%a! neq 0 (
        set "__BaseIPv4=!__BaseIPv4!!__IPv4Spilt_%%a!."
    ) else (
        set "__BaseIPTail=!__BaseIPTail!x."
    )
)
set "__BaseIPTail=%__BaseIPTail:~0,-1%"


:reask
echo:
echo Dein verfügbarer Adressbereich ist %__BaseIPv4%%__BaseIPTail%
echo Bitte  vervollständige die Adresse zu Deiner gewünschten IP.
set /p "__newIP=%__BaseIPv4%"
set "__newIP=%__BaseIPv4%%__newIP%"


  rem in den meisten Netzwerken sind die Adressen x.x.x.0 und >254 reserviert!
  rem diese vermeiden! (könnte böse enden)
  rem also prüfen was der  User  da tut
for /f "tokens=1-4 delims=." %%a in ("%__newIP%") do (
    set /a "__dummy=%%d+0"
    if !__dummy! lss 1 (
        echo Die Adresse %%a.%%b.%%c.!__dummy! ist reserviert oder ungültig  ^^!
        goto :reask
    )
    if !__dummy! geq 254 (
        echo Die Adresse %%a.%%b.%%c.!__dummy! ist reserviert oder ungültig ^^!
        goto :reask
    )
)


  rem das Gateway auf den eigenen Rechner zu setzen ist erlaubt ,
  rem dies ist jedoch eine extrem  dumme Idee, wenn der Rechner kein Server ist!!! (in der Regel  muss danach auch der Router zurückgesetzt werden -- ganz schlecht)
  rem also prüfen was der  User  da tut 
if "%__newIP%"=="%__localNetworkIPv4Gateway%" (
    echo Die Adresse %__newIP% ist für das lokale Gateway reserviert ^^!
    goto :reask
)


  rem Vorsicht ist die Mutter des Elefanten im Porzelanladen:
echo erzeuge eine Reset-Batch "reset DHCP.cmd" falls  irgendwas schiefgegangen ist!
@(
    echo netsh interface ip set address name="%__localNetworkConnectionID%" dhcp
    echo ipconfig /renew >nul
    echo ipconfig /all
    echo pause
)>"reset DHCP.cmd"
  rem bis hier alles nur um dumme Nutzer von dummen Dingen abzuhalten!


  rem wenn ich das an meinem Rechner mache  brauche ich  nur diese  eine Zeile,
  rem das oberhalb weiß ich aus dem Kopf und muss auch nicht darauf  achten, das ich etwas dummes mache
netsh interface ip set address name="%__localNetworkConnectionID%" source=static address=192.168.0.20 mask=%__localNetworkSubnetMask% gateway=%__localNetworkIPv4Gateway% gwmetric=%__localNetworkGatewayMetric%  store=active


ipconfig /all
pause
exit /b


Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Es gibt gute Gründe weshalb einige Sachen Administratorberechtigungen benötigen.

Jemandem der keine Ahnung hat eine Batch zu bauen, welche fähig ist komplexe Systemeinstellungen beinhaltet wäre unverantwortlich.

Es ist ja nicht nur das ändern der Ipv4 ebenso müssen auch ander Parameter angepasst werden (DNS-Server, ipv6-Addressen) usw.

Natürlich könnte ich das ganze in einem automatisierten script erledigen...keine Frage. Wenn ich das an unseren Rechnern wirklich mal von Hand machen muss bin ich jedoch zugegen und kann gegebenenfalls Korrekturen vornehmen. Lasse ich ein solches Script auf einen fremden Rechner los, dessen Einstellungen ich nicht kenne habe ich keine Kontrolle über die Vorgänge.

Das ganze möchte ich für ein Programm nutzen.

Wie muss ich das verstehen? Du hast keine Ahnung von Netzwerken und Rechnern und möchtest ein fremdes Script in ein eigenes Programm einbauen?

@DominikPrinz hat Dir de bereits den Namen des Programms mitgeteilt, mit welchem man Netzwerkadaptereinstellungen vornimmt (netsh)

Beschäftige dich damit , dann trägst Du die Verantwortung für Dein eigenes Programm und den Schaden, welchen es unter Umständen verursacht.

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren