从 ipconfig 获取 MAC 和 DHCP 服务器

Posted

技术标签:

【中文标题】从 ipconfig 获取 MAC 和 DHCP 服务器【英文标题】:Get MAC and DHCP server from ipconfig 【发布时间】:2017-03-08 14:33:54 【问题描述】:

我正在 WinPE 环境中编写脚本,我想在其中找到我的 PXE 服务器并将我的 MAC 地址发送给它以检索配置脚本。

这是我必须处理的:

服务器将有多个网络适配器。只有一个连接到我的 PXE 服务器。 PXE 服务器始终也是该网络上的 DHCP 服务器。 可能有其他 DHCP 服务器连接到其他 NIC。 PXE 服务器也在侦听端口 80。 cURL 在 WinPE 映像中可用。

我希望脚本中的最后一行是:

curl -s -o %TEMP%/setup.cmd http://%PXE_IP%/cblr/svc/op/script/system/%MY_MAC%/?script=setup.cmd

我看到我从 ipconfig /all 获得了所有必要的信息,但我不知道如何解析该输出。

比如我可以做

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

这为我提供了每个适配器上 DHCP 服务器的 IP 地址。我可以确定哪个是正确的。但是然后呢?我需要该适配器的相应 MAC 地址。该信息在输出中,但我将其与find 一起丢弃了。

【问题讨论】:

使用FOR /F 命令解析IPCONFIG 命令的输出。您可能还希望将IPCONFIG 的输出通过管道传送到FIND 命令。 这样我可以得到例如 DHCP 服务器。但是一旦我找到了正确的 DHCP 服务器,我怎么知道该使用哪个 MAC? AFAIK 我无法仅获取特定适配器的 ipconfig。 【参考方案1】:

如果可能的话,我会在 WinPE 上使用 wmic 而不是 ipconfig。

获取所有活动接口

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

MyComputer, 13, 40:47:40:4D:42:4C,无线网络连接 MyComputer, 58, 00:50:56:C2:20:01,VMware 网络适配器 VMnet1

然后你只需要将它与每个 InterfaceIndex 的 dhcp-server 结合起来

wmic nicconfig get InterfaceIndex,DHCPServer /format:csv

我的电脑,10.0.0.1, 13 我的电脑,, 58

为了获取你使用类似这样的数据

@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

输出:

nic[13].dhcpServer=10.0.0.1 网卡[13].mac=40:47:40:4D:42:4C 网卡[58].mac=00:50:56:C2:20:01

顺便说一句。我有点作弊,因为我总是获取一个不需要的额外列,但为了避免问题,最后一列以 CR 字符结尾。

【讨论】:

很遗憾 wmic 在 WinPE 中不可用。 :(【参考方案2】:

这是我的旧项目(cca 2½ 年前)的脚本,通过解析 ipconfig /ALL 输出来模拟 wmic 结果。调整它以获取 DHCP 服务器 而不是 IPv4 地址IPv6 地址 对您来说应该不是一项艰巨的工作……

@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!
)

【讨论】:

【参考方案3】:

我不知道在你的情况下是否可以使用此解决方案来获取 IP 和 MAC 地址?

@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

【讨论】:

以上是关于从 ipconfig 获取 MAC 和 DHCP 服务器的主要内容,如果未能解决你的问题,请参考以下文章

常用DOS命令

常用网络命令及其使用

笔记本无法从DHCP服务器获取地址怎么解决?

nova boot代码流程分析:VM启动从neutron-dhcp-agent获取IP与MAC

nova boot代码流程分析:VM启动从neutron-dhcp-agent获取IP与MAC

如何让Docker容器获取外部DHCP服务器的IP地址