windows - Få MAC- og DHCP-server fra ipconfig

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skriver et script i et WinPE miljø, hvor jeg vil finde min PXE server og sende den til min MAC adresse for at hente provisioning scripts.


Her er hvad jeg skal håndtere:



  • Serveren vil have flere netværksadaptere. Kun en er forbundet til min PXE-server.

  • PXE-serveren er også altid DHCP-serveren på det pågældende netværk.

  • Der kan være andre DHCP-servere forbundet til de andre NIC'er.

  • PXE-serveren lytter også på port 80.

  • cURL er tilgængelig i WinPE-billedet.



Jeg vil have den sidste linje i scriptet til at være:


curl -s -o \%TEMP\%/setup.cmd http://\%PXE\_IP\%/cblr/svc/op/script/system/\%MY\_MAC\%/?script=setup.cmd


Jeg ser, at jeg får alle de nødvendige oplysninger fra ipconfig /all, men jeg har ingen idé om, hvordan man analyserer denne produktion.


For eksempel kan jeg gøre


for /f "tokens=15 delims= " \%\%X in ('ipconfig /all ^| find "DHCP Server"') do echo \%\%X


Dette giver mig IP-adresserne til DHCP-serverne på hver adapter. Jeg kan bestemme, hvad der er korrekt. Men hvad så? Jeg har brug for den tilsvarende MAC-adresse for den adapter. Disse oplysninger er i output, men jeg smed det væk med min find.

Bedste reference


Jeg vil bruge wmic i stedet for ipconfig, om muligt på WinPE.


For at få alle aktive grænseflader


wmic nic where NetConnectionStatus=2 get InterfaceIndex, MACAddress,NetConnectionID /format:csv



  MyComputer, 13, 40: 47: 40: 4D: 42: 4C, Trådløs netværksforbindelse

  MyComputer, 58, 00: 50: 56: C2: 20: 01, VMware Network Adapter VMnet1



Og så skal du kun kombinere dette med dhcp-serveren for hver InterfaceIndex


wmic nicconfig get InterfaceIndex,DHCPServer /format:csv



  MyComputer, 10.0.0.1, 13

  MyComputer ,, 58



For at hente data bruger du noget som dette


@echo off
setlocal EnableDelayedExpansion
REM *** Delete all previous variables beginning with "nic\_"
for /F "delims==" \%\%V in ('set nic[ 2^> nul') do set "\%\%V="

for /F "skip=2 tokens=1-4* delims=," \%\%1 in ('"wmic nic where NetConnectionStatus=2 get InterfaceIndex, MACAddress,NetConnectionID,Status /format:csv"') do (
  echo DEBUG: "\%\%4",\%\%2,\%\%3
  set "nic[\%\%2].mac=\%\%3"
)

for /F "skip=2 delims=" \%\%L in ('"wmic nicconfig get InterfaceIndex,DHCPServer,IPAddress /format:csv"') do (
  set "line=\%\%L"
  set "line=""!line:,=,"!"" --- Pump up the csv line with quotes to avoid empty columns col1,,col2 transformed to "col1","","col3"
  for /F "tokens=1-4* delims=," \%\%1 in ("!line!") do (
    if "\%\%~2" NEQ "" (
        set nic[\%\%~3].dhcpServer=\%\%~2
    )
  )
)

set nic


Produktion:



  nic [[13]] .dhcpServer=10.0.0.1

  nic [[13]] .mac-=40: 47: 40: 4D: 42: 4C

  nic [[58]] .mac-=00: 50: 56: C2: 20: 01



Btw. Jeg snyder lidt, da jeg altid henter en ekstra kolonne, som jeg ikke har brug for, men det er for at undgå problemet, at den sidste kolonne slutter med et CR-tegn.

Andre referencer 1


Her er et script fra mit ældre projekt (cca 2½ år siden), der simulerer resultaterne wmic via parsing ipconfig /ALL output. Tilpasning af det for at få DHCP Server i stedet for IPv4-adresse og IPv6-adresse bør ikke være et hårdt job for dig ...



@ECHO OFF
@SETLOCAL enableextensions enabledelayedexpansion
  set "HostName="
  set "NetConID="
  set "IP\_Addr4="
  set "IP\_Addr6="
  set "MAC\_Addr="
for /F "tokens=1* delims=:" \%\%G in ('ipconfig /ALL') do (
  set "foo=\%\%~G"
  if not "!foo:Host name=!"=="!foo!" (
    for \%\%I in (\%\%~H) do if not "\%\%~I"=="" set "HostName=\%\%~I"
  )
  if "!foo:adapter=!"=="!foo!" (
    if not "!foo:Physical Address=!"=="!foo!" (
      for \%\%I in (\%\%~H) do if not "\%\%~I"=="" set "MAC\_Addr=\%\%~I"
    )
    if not "!foo:IPv4 Address=!"=="!foo!" (
      for \%\%I in (\%\%~H) do if not "\%\%~I"=="" set "IP\_Addr4=\%\%~I"
      set "IP\_Addr4=!IP\_Addr4:(preferred)=!"
    )
    if not "!foo:local IPv6 Address=!"=="!foo!" (
      for \%\%I in (\%\%~H) do (
        if not "\%\%~I"=="" (
          for /F "delims=\%\%" \%\%p in ("\%\%~I") Do set "IP\_Addr6=\%\%~p"
          rem set "IP\_Addr6=!IP\_Addr6:(preferred)=!"
        )
      )
    )
  ) else (
    if not "!IP\_Addr6!,!IP\_Addr4!"=="," (
      @echo #!HostName!,!NetConID!,{"!IP\_Addr4!","!IP\_Addr6!"},!MAC\_Addr!
    )
    set "MAC\_Addr="
    set "IP\_Addr4="
    set "IP\_Addr6="
    set "NetConID=!foo:*adapter =!"
  )
)
if not "!IP\_Addr6!,!IP\_Addr4!"=="," (
  @echo =!HostName!,!NetConID!,{"!IP\_Addr4!","!IP\_Addr6!"},!MAC\_Addr!
)

Andre referencer 2


Jeg ved ikke, om denne løsning kan bruges eller ikke i dit tilfælde for at få IP og MAC-adressen?


@echo off
Title Get IP and MAC Address
@for /f "delims=[] tokens=2" \%\%a in ('ping -4 -n 1 \%ComputerName\% ^| findstr [') do (
    set "PXE\_IP=\%\%a"
)

@For /f \%\%a in ('getmac /NH /FO Table') do  (
    @For /f \%\%b in ('echo \%\%a') do (
        If /I NOT "\%\%b"=="N/A" (
            Set "MY\_MAC=\%\%b"
        )
    )
)
echo PXE\_IP : \%PXE\_IP\%
echo MAC Address : \%MY\_MAC\%
echo(
echo curl -s -o \%TEMP\%/setup.cmd http://\%PXE\_IP\%/cblr/svc/op/script/system/\%MY\_MAC\%/?script=setup.cmd
pause>nul