2009年10月14日

如何使用指令找出網路卡的 MAC 位址

網路常見的作法皆是使用 ipconfig.exe/all,搭配相關指令去解析網路卡的 MAC 位址(即下面結果中的「實體位址」),這樣做會有個問題,就是 ipconfig.exe 輸出的結果會因為 Windows 語言的不同,而出現不同國家的文字,例如下面是 Windows 7 正體中文版執行的部分結果:

C:\Users\Alex>ipconfig/all
…
乙太網路卡 區域連線 2:

連線特定 DNS 尾碼 . . . . . . . . :
描述 . . . . . . . . . . . . . . .: Microsoft Windows Mobile Remote Adapter
實體位址 . . . . . . . . . . . . .: 12-34-56-01-23-45
DHCP 已啟用 . . . . . . . . . . . . : 是
自動設定啟用 . . . . . . . . . . .: 是
IPv4 位址 . . . . . . . . . . . . : 169.254.2.2(偏好選項)
子網路遮罩 . . . . . . . . . . . .: 255.255.255.0
租用取得 . . . . . . . . . . . . .: 2009年7月21日 下午 10:29:29
租用到期 . . . . . . . . . . . . .: 2009年8月20日 下午 10:29:25
預設閘道 . . . . . . . . . . . . .:
DHCP 伺服器 . . . . . . . . . . . : 169.254.2.1
NetBIOS over Tcpip . . . . . . . .: 啟用

乙太網路卡 區域連線:

連線特定 DNS 尾碼 . . . . . . . . :
描述 . . . . . . . . . . . . . . .: Realtek RTL8168C(P)/8111C(P) Family PCI-E
Gigabit Ethernet NIC (NDIS 6.20)
實體位址 . . . . . . . . . . . . .: 00-11-22-33-44-55
DHCP 已啟用 . . . . . . . . . . . . : 否
自動設定啟用 . . . . . . . . . . .: 是
IPv4 位址 . . . . . . . . . . . . : 192.168.165.107(偏好選項)
子網路遮罩 . . . . . . . . . . . .: 255.255.255.0
預設閘道 . . . . . . . . . . . . .: 192.168.165.254
DNS 伺服器 . . . . . . . . . . . .: 168.95.192.1
168.95.1.1
NetBIOS over Tcpip . . . . . . . .: 啟用

通道介面卡 isatap.{6D6E2283-45C4-90A7-0506-1087391E5A92}:

媒體狀態 . . . . . . . . . . . . .: 媒體已中斷連線
連線特定 DNS 尾碼 . . . . . . . . :
描述 . . . . . . . . . . . . . . .: Microsoft ISATAP Adapter
實體位址 . . . . . . . . . . . . .: 00-00-00-00-00-00-00-E0
DHCP 已啟用 . . . . . . . . . . . . : 否
自動設定啟用 . . . . . . . . . . .: 是

通道介面卡 區域連線* 3:

連線特定 DNS 尾碼 . . . . . . . . :
描述 . . . . . . . . . . . . . . .: Teredo Tunneling Pseudo-Interface
實體位址 . . . . . . . . . . . . .: 00-00-00-00-00-00-00-E0
DHCP 已啟用 . . . . . . . . . . . . : 否
自動設定啟用 . . . . . . . . . . .: 是
IPv6 位址. . . . . . . . . . . . .: 2001:0:cf2e:3096:38c5:bda2:2256:d659(偏好
選項)
連結-本機 IPv6 位址 . . . . . . . : fe80::38c5:bda2:2256:d659%13(偏好選項)
預設閘道 . . . . . . . . . . . . .: ::
NetBIOS over Tcpip . . . . . . . .: 停用

通道介面卡 isatap.{04426D6D-40CD-B5A2-D88C-DF7B9FBDD227}:

媒體狀態 . . . . . . . . . . . . .: 媒體已中斷連線
連線特定 DNS 尾碼 . . . . . . . . :
描述 . . . . . . . . . . . . . . .: Microsoft ISATAP Adapter #3
實體位址 . . . . . . . . . . . . .: 00-00-00-00-00-00-00-E0
DHCP 已啟用 . . . . . . . . . . . . : 否
自動設定啟用 . . . . . . . . . . .: 是

在此,我使用 Windows XP 之後才提供的 GetMac.exe,先看看執行的結果:
C:\Users\Alex>getmac

實體位址              傳輸名稱
=================== ==========================================================
00-11-22-33-44-55   \Device\Tcpip_{6D6E5A92-EEEE-45C4-90A7-1087E2283344}
12-34-56-01-23-45   \Device\Tcpip_{0442D227-FFFF-5555-6666-776DDF7B88ED}

由於 GetMac 提供以 CSV 格式輸出結果的參數,所以我們可以搭配 FOR 指令寫出 GetMacAddr01.cmd:
@echo off
REM 結果前後會有「"」
for /f "tokens=1 delims=," %%i in ('"getmac /fo csv /nh"') do echo 實體位址為:%%i

REM 刪除「"」:將原本的 %%i 改成 %%~i
for /f "tokens=1 delims=," %%i in ('"getmac /fo csv /nh"') do set mac=%%~i
echo.
echo 刪除「"」的結果:%mac%
echo.

REM 刪除「-」:使用 for 搭配 delims=-
for /f "tokens=1-6 delims=-" %%j in ('echo %mac%') do echo 最後結果:%%j%%k%%l%%m%%n%%o

執行結果:
C:\Users\Alex>GetMacAddr01.cmd
實體位址為:"00-11-22-33-44-55"
實體位址為:"12-34-56-01-23-45"

刪除「"」的結果:12-34-56-01-23-45

最後結果:123456012345

由執行結果來看,上面那樣的寫法會有問題,萬一有多張網卡時,因為使用環境變數 %mac% 來儲存結果,所以只會顯示最後查到的 MAC 位址,所以經過修改並精簡後的程式碼:
for /f "tokens=1 delims=," %%i in ('"getmac /fo csv /nh"') do (
for /f "tokens=1-6 delims=-" %%j in ('echo %%~i') do echo %%j%%k%%l%%m%%n%%o
)

執行結果:
C:\Users\Alex>GetMacAddr.cmd
001122334455
123456012345

沒有留言:

張貼留言