none
IP konfigurace vytvořená automaticky z MAC adresy

    Dotaz

  • Hezký den.

    Při výuce si studenti stahují jeden předpřipravený image Windows Server 2008, který spouští virtuálně. Je potřeba zajistit správnou IP konfiguraci jednotlivých strojů.

    Chceme vytvářet IP konfiguraci podle MAC adresy automaticky při startu toho počítače. Pravidla pro tu IP konfiguraci jsou násedující:

    Pro všechna ethernetová síťová rozhraní:

     - zjisti jeho MAC adresu aa:bb:cc:dd:ee:ff, D je dd v desítkové soustavě, E je ee v desítkové soustavě, F je ff v desítkové soustavě; jestliže D není 0, pak:

      IP je 10.D.E.F/16

     - nastav staticky IP tomu rozhraní (vychozí brána ani DNS servery žádné)

     - povol rozhraní

    Pokud D je rovno 0, pak nastav IP konfiguraci z DHCP.

    Lze to nějak rozumně jednoduše udělat? Je to jednorázovka, takže pokud to nepůjde nějak jednoduše, tak se na to vyprdneme a studenti si to nastaví ručně sami.

    čtvrtek 11. října 2012 8:51

Odpovědi

  • for /f "tokens=2,3,4,5,6,7 delims=-:" /f %%a in ('ipconfig /all^|find "Physical Address"^|find ": E4-"') do ( set /a MACD=0x%%d set /a MACE=0x%%e set /a MACF=0x%%f ) set IPADDR=10.%MACD%.%MACE%.%MACF% if %MACD% equ 0 ( netsh neco neco najdi si sam dle "netsh dump" wtf nastav dhcp ) ELSE ( netsh obdobne nastav pevnou )

    E4 jsem dal natvrdo protoze mam vic sitovek a vim, ze Ethernet zacina E4-

    MP



    čtvrtek 11. října 2012 9:11
    Vlastník
  • Funguje to :) Finální verze tedy vypadá takto:

    netsh interface teredo set state disabled
    netsh interface ipv6 6to4 set state state=disabled undoonstop=disabled
    netsh interface ipv6 isatap set state state=disabled
    
    setlocal ENABLEDELAYEDEXPANSION
    
    for /F "tokens=1-9 delims=,:" %%a in ('wmic nic where "MacAddress like '00:%%'" GET netconnectionid^, MACAddress^, SystemName /format:csv ^|find ":"') do (
    
     set /a MACD=0x%%e
     set /a MACE=0x%%f
     set /a MACF=0x%%g
    
    	
     if !MACD! equ 0 (
      netsh interface ip set address name="%%h" source=dhcp
     ) ELSE (
      netsh interface ip set address name="%%h" static 10.!MACD!.!MACE!.!MACF! 255.255.0.0
     )
    
    
    ) 

    Díky moc!
    • Označen jako odpověď Lukas Beran úterý 16. října 2012 14:45
    úterý 16. října 2012 14:45

Všechny reakce

  • for /f "tokens=2,3,4,5,6,7 delims=-:" /f %%a in ('ipconfig /all^|find "Physical Address"^|find ": E4-"') do ( set /a MACD=0x%%d set /a MACE=0x%%e set /a MACF=0x%%f ) set IPADDR=10.%MACD%.%MACE%.%MACF% if %MACD% equ 0 ( netsh neco neco najdi si sam dle "netsh dump" wtf nastav dhcp ) ELSE ( netsh obdobne nastav pevnou )

    E4 jsem dal natvrdo protoze mam vic sitovek a vim, ze Ethernet zacina E4-

    MP



    čtvrtek 11. října 2012 9:11
    Vlastník
  • Takže nějak takto by to mělo fungovat?

    for /f "tokens=2,3,4,5,6,7 delims=-:" /f %%a in ('ipconfig /all^|find "Physical Address"^|find ": 00-"') do (
    set /a MACD=0x%%d
    set /a MACE=0x%%e
    set /a MACF=0x%%f
    )
    
    set IPADDR=10.%MACD%.%MACE%.%MACF%
    if %MACD% equ 0 (
    netsh interface ip set address name="Local Area Connection" source=dhcp
    ) ELSE (
    netsh interface ip set address name="Local Area Connection" static %IPADDR% 255.255.0.0
    )

    čtvrtek 11. října 2012 10:28
  • No kontrolovat to nebudu, ale ano, NEJAK takto ano ;-)

    MP

    čtvrtek 11. října 2012 13:09
    Vlastník
  • Ptám se právě proto, že to nefunguje :( Uložím si to jako ipconfig.cmd, spustím (jako správce) a nic, žádná změna na adaptéru. Začátek MAC jsem upravil (začínají nám 00) a rozhraní se opravdu jmenuje Local Area Connection a stejně to nic neudělá...
    čtvrtek 11. října 2012 15:16
  • Posli vystu scriptu (co vypisuje na konzoli)

    MP


    P.S. opravdu jsi nazval script ipconfig, tedy jako interni program windows :-O ? Vzdyt se ti zrekur*uje! Mas kliku, ze nestudujes u me, to bych si te vychutnal :)


    čtvrtek 11. října 2012 15:30
    Vlastník
  • 1. Vystup ze skriptu presmerujte do log souboru.

    2. Je-li server virtualni, jak pridelujete MAC adresu?

    3. Jak je zajisteny pristup na DHCP?

    4. Proc jste zvolil tak slozity postup?

    M.

    čtvrtek 11. října 2012 15:34
    Vlastník
  • Vypadá to, že problém je už v detekci té MAC adresy.

    Mám testovací počítač s MAC 00-15-5D-10-AB-01.

    Ten má ve výchozím stavu přidělenou veřejnou IP adresu z DHCP. Když spustím ten script, měl by nastavit statickou adresu 10.16.171.1, protože D není nula. Jenže on vypíše, že už má konfiguraci z DHCP.

    C:\Users\lukasberan\Desktop>for /F "tokens=2,3,4,5,6,7 delims=-:" %a in ('ipconfig /all|find "Physical Address"|find ": 00-"') do (
    set /a MACD=0x%d  
     set /a MACE=0x%e  
     set /a MACF=0x%f 
    ) 
    C:\Users\lukasberan\Desktop>(
    set /a MACD=0x10  
     set /a MACE=0xAB  
     set /a MACF=0x01 
    ) 
    C:\Users\lukasberan\Desktop>(
    set /a MACD=0x00  
     set /a MACE=0x00  
     set /a MACF=0x00 
    ) 
    C:\Users\lukasberan\Desktop>(
    set /a MACD=0x00  
     set /a MACE=0x00  
     set /a MACF=0x00 
    ) 
    C:\Users\lukasberan\Desktop>(
    set /a MACD=0x00  
     set /a MACE=0x00  
     set /a MACF=0x00 
    ) 
    C:\Users\lukasberan\Desktop>set IPADDR=10.0.0.0 
    C:\Users\lukasberan\Desktop>if 0 EQU 0 (netsh interface ip set address name="Local Area Connection" source=dhcp )  ELSE (netsh interface ip set address name="Local Area Connection" static 10.0.0.0 255.255.0.0 ) 
    DHCP is already enabled on this interface.

    Když místo EQU použiji NEQ (abych to otestoval), tak mi nastaví nesmyslnou IP adresu 10.0.0.0.

    C:\Users\lukasberan\Desktop>for /F "tokens=2,3,4,5,6,7 delims=-:" %a in ('ipconfig /all|find "Physical Address"|find ": 00-"') do ( set /a MACD=0x%d set /a MACE=0x%e set /a MACF=0x%f ) C:\Users\lukasberan\Desktop>( set /a MACD=0x10 set /a MACE=0xAB set /a MACF=0x01 ) C:\Users\lukasberan\Desktop>( set /a MACD=0x00 set /a MACE=0x00 set /a MACF=0x00 ) C:\Users\lukasberan\Desktop>( set /a MACD=0x00 set /a MACE=0x00 set /a MACF=0x00 ) C:\Users\lukasberan\Desktop>( set /a MACD=0x00 set /a MACE=0x00 set /a MACF=0x00 ) C:\Users\lukasberan\Desktop>set IPADDR=10.0.0.0 C:\Users\lukasberan\Desktop>if 0 NEQ 0 (netsh interface ip set address name="Local Area Connection" source=dhcp ) ELSE (netsh interface ip set address name="Local Area Connection" static 10.0.0.0 255.255.0.0 )



    Oboje jsou celé výpis z > log.txt
    sobota 13. října 2012 15:03
  • Výpis jsem přiložil jako odpověď na příspěvek Miroslava.

    Přidělení MAC adresy si nějak obstarává ten virtualizační nástroj (nejspíš QEMU, tohle já neřeším).

    DHCP je v externí síti s připojením na internet. A právě podle tvaru MAC adresy se rozeznává, jestli je daná karta připojená do externí nebo interní sítě a podle toho by měla být nastavena IP konfigurace.

    On by měl být právě co nejjednodušší tento postup nastavení IP konfigurace. Proto se snažím to vyřešit takto automaticky. Pokud se ptáte na složitost celého řešení, tak to já nevím. Tohle jde úplně mimo mě, řeší si to garant toho předmětu a je to řešení pouze na jedno cvičení (několika skupinám). Já jsem byl pouze dotázán, jestli neznám řešení problému automatického nastavení IP konfigurace podle MAC adresy.


    sobota 13. října 2012 15:10
  • 1. urcite ti sctript funguje i bez escape characeru ^ pred |?

    2. posli vypis samotneho prikazu ipconfig /all|find "Physical Address"|find ": 00-"

    Res od jednoduchecho ke slozitemu prosim!

    MP

    sobota 13. října 2012 19:46
    Vlastník
  • Script tam má ten escape character. Přiložené informace z předchozího příspěvku jsou výsledek v souboru log.txt po spuštění nastaveniip.cmd > log.txt z admin příkazové řádky. Proto tam není ten escape character vidět.

    A už vím, v čem byl problém. Pomohla mě Tvoje rada s výpisem ipconfig /all|find "Physical Address"|find ": 00-", díky čemuž jsem zjistil, že problém je v tom, že tam jsou ještě další virtuální adaptéry ISATAP, 6to4 a Teredo, které mají také Physical Address začínající 00.

    Dal jsem si tedy na začátek toho skriptu ještě

    netsh interface teredo set state disabled
    netsh interface ipv6 6to4 set state state=disabled undoonstop=disabled
    netsh interface ipv6 isatap set state state=disabled

    a už je to OK a funguje to podle představ.

    Díky moc!

    • Označen jako odpověď Lukas Beran sobota 13. října 2012 20:28
    • Zrušeno označení jako odpověď Lukas Beran úterý 16. října 2012 14:45
    sobota 13. října 2012 20:27
  • Tak bohužel ještě není hotovo. Funguje to jen tehdy, když má počítač jeden adaptér. Já bych ten postup potřeboval aplikovat pro všechny (2 - 3) adaptéry na těch počítačích.

    A teď nevím, jak to udělat, aby podle načtené MAC adresy z Local Area Connection nastavil IP pro Local Area Connection a z načtené MAC z Local Area Connection 2 nastavil IP na Local Area Connection 2 apod.

    pondělí 15. října 2012 9:00
  • Co vas na te skole ucej' ?!

    @echo off
    
    setlocal ENABLEDELAYEDEXPANSION
    
    for /F "tokens=2-8 delims=,:" %%a in ('wmic nicconfig where "MacAddress like '%%:%%'" GET description^, MACAddress /format:csv ^|find ":"') do (
     set interfacename=%%a
     set /a MACD=0x%%e
     set /a MACE=0x%%f
     set /a MACF=0x%%g
    
     set IPADDR=10.!MACD!.!MACE!.!MACF!
    
     if !MACD! equ 0 (
      echo netsh interface ip set address name="!interfacename!" source=dhcp
     ) ELSE (
      echo netsh interface ip set address name="!interfacename!" static !IPADDR! 255.255.0.0
     )
    
    )
    (do filtru wmic si dej 00:%% nebo co jsi to chtel)

    MP



    pondělí 15. října 2012 15:18
    Vlastník
  • Kéž by nás učili takové věci... Ale holt paralelní algormity v Javě mi v tomhle moc nepomůžou...

    Tebou poskytnutý kód nefunguje, protože bere description toho adaptéru a pak to podle toho chce nastavovat, což neprojde (netsh interface ip set address name="Marvell Yukon 88E8056 PCI-E Gigabit Ethernet Controller" static 10.16.171.3 255.255.0.0).

    Zkusil jsem to tedy upravit následovně:

    @echo off
    
    setlocal ENABLEDELAYEDEXPANSION
    
    for /F "tokens=1-8 delims=,:" %%a in ('wmic nic where "MacAddress like '00:%%'" GET netconnectionid^, MACAddress /format:csv ^|find ":"') do (
     set interfacename=%%h
     set /a MACD=0x%%e
     set /a MACE=0x%%f
     set /a MACF=0x%%g
    
     set IPADDR=10.!MACD!.!MACE!.!MACF!
    
     if !MACD! equ 0 (
      echo netsh interface ip set address name="!interfacename!" source=dhcp
     ) ELSE (
      echo netsh interface ip set address name="!interfacename!" static !IPADDR! 255.255.0.0
     )
    
    )

    Jenže to opět nefunguje. Dostanu chybu

    " static 10.16.171.3 255.255.0.0ame="Local Area Connection
    " static 10.16.171.1 255.255.0.0ame="Local Area Connection 2

    A teď jasem zase v mrtvém bodě a nevím, jak to rozběhat. Když dám u set interfacename=%%h místo H třeba původní A nebo B, tak dostávám jako části MAC adresy nebo jméno počítače. Když tam dám to H, tak mám správně jméno toho adaptéru, ale zase se šíleně rozhodí celý syntaxe.
    úterý 16. října 2012 11:06
  • JJ, ja mam description a name shodne, takze jsem si byl vedom problemu a vidim, ze to nebyl problem opravit.

    Nicmene sis asi nevsiml, ze pred netsh je prikaz echo (aby se dalo debuggovat a nemrvilo to realnou onfiguraci) :)))

    Podivej se jak se zmenil vystup z netsh a pohejbej promennyma

    Pripadne to zhulvat, vyprdni se na "mezipromenne" s vykricnikovou konvenci kde to jen jde a do netsh dej rovnou ridici promenne cyklu %%e ...atd

    MP



    úterý 16. října 2012 12:03
    Vlastník
  • Tak nevím, zkoušel jsem to různě upravovat a nejlepšího výsledku jsem dosáhl s tímto:

    for /F "tokens=2-8 delims=,:" %%a in ('wmic nic where "MacAddress like '00:%%'" GET netconnectionid^, MACAddress /format:csv ^|find ":"') do (
     set interfacename=%%g
     set /a MACD=0x%%d
     set /a MACE=0x%%e
     set /a MACF=0x%%f
    
     set IPADDR=10.%MACD%.%MACE%.%MACF%
    
     if %MACD% equ 0 (
      netsh interface ip set address name="%interfacename%" source=dhcp
     ) ELSE (
      netsh interface ip set address name="%interfacename%" static %IPADDR% 255.255.0.0
     )
    
    )

    Jenže to nefunguje. Nastaví to jen IP u Local Area Connection 2, což jde vidět i z výpisu:

    C:\Users\lukasberan\Desktop>testuju.cmd
    
    C:\Users\lukasberan\Desktop>for /F "tokens=2-8 delims=,:" %a in ('wmic nic where
     "MacAddress like '00:%'" GET netconnectionid, MACAddress /format:csv |find ":"'
    ) do (
    set interfacename=%g
     set /a MACD=0x%d
     set /a MACE=0x%e
     set /a MACF=0x%f
     set IPADDR=10.16.171.3
     if 16 EQU 0 (netsh interface ip set address name="Local Area Connection 2" sour
    ce=dhcp )  ELSE (netsh interface ip set address name="Local Area Connection 2" s
    tatic 10.16.171.3 255.255.0.0 )
    )
    
    C:\Users\lukasberan\Desktop>(
      t interfacename=Local Area Connection
     set /a MACD=0x10
     set /a MACE=0xAB
     set /a MACF=0x01
     set IPADDR=10.16.171.3
     if 16 EQU 0 (netsh interface ip set address name="Local Area Connection 2" sour
    ce=dhcp )  ELSE (netsh interface ip set address name="Local Area Connection 2" s
    tatic 10.16.171.3 255.255.0.0 )
    )
    
    
    C:\Users\lukasberan\Desktop>(
      t interfacename=Local Area Connection 2
     set /a MACD=0x10
     set /a MACE=0xAB
     set /a MACF=0x03
     set IPADDR=10.16.171.3
     if 16 EQU 0 (netsh interface ip set address name="Local Area Connection 2" sour
    ce=dhcp )  ELSE (netsh interface ip set address name="Local Area Connection 2" s
    tatic 10.16.171.3 255.255.0.0 )
    )
    

    Nechápu ale, proč se tomu tak děje. MAC adresy on načte správně, jména rozhraní taky, ale nastavuje vždy jen Local Area Connection 2 s jeho IP adresou.
    úterý 16. října 2012 13:07
  • pro promenne manipulovae unitr cyklu POUZIVEJ ENABLEDELAYEDEXPANSION a !

    uz vidim problem - za nazvem je ENTER, ktery to cele mrvi. Staci pridat dalsi pole, ktere bude ZA NAZVEM, tzn. neco takovehoto:

    @echo off
    setlocal ENABLEDELAYEDEXPANSION
    
    for /F "tokens=1-9 delims=,:" %%a in ('wmic nic where "MacAddress like '%%:%%'" GET netconnectionid^, MACAddress^, SystemName /format:csv ^|find ":"') do (
    
     set /a MACD=0x%%e
     set /a MACE=0x%%f
     set /a MACF=0x%%g
    
    	
     if !MACD! equ 0 (
      echo netsh interface name="%%h" ip set address source=dhcp name="%%h"
     ) ELSE (
      echo netsh interface name="%%h" ip set address static 10.!MACD!.!MACE!.!MACF! 255.255.0.0
     )
    
    
    ) 
    (dopln si filtry na smyslne adapatery atd)

    MP



    úterý 16. října 2012 13:22
    Vlastník
  • Funguje to :) Finální verze tedy vypadá takto:

    netsh interface teredo set state disabled
    netsh interface ipv6 6to4 set state state=disabled undoonstop=disabled
    netsh interface ipv6 isatap set state state=disabled
    
    setlocal ENABLEDELAYEDEXPANSION
    
    for /F "tokens=1-9 delims=,:" %%a in ('wmic nic where "MacAddress like '00:%%'" GET netconnectionid^, MACAddress^, SystemName /format:csv ^|find ":"') do (
    
     set /a MACD=0x%%e
     set /a MACE=0x%%f
     set /a MACF=0x%%g
    
    	
     if !MACD! equ 0 (
      netsh interface ip set address name="%%h" source=dhcp
     ) ELSE (
      netsh interface ip set address name="%%h" static 10.!MACD!.!MACE!.!MACF! 255.255.0.0
     )
    
    
    ) 

    Díky moc!
    • Označen jako odpověď Lukas Beran úterý 16. října 2012 14:45
    úterý 16. října 2012 14:45
  • Samozrejme ze to funguje. Dodavam sice polotovary, ale ne kraviny :)

    MP

    úterý 16. října 2012 14:55
    Vlastník