Win32環境でマックアドレス取得

ここでは、Windows環境でマックアドレスを取得する方法を説明したいと思います。

サンプル

Win32API経由でIPHLPAPI(IP Helper API)を利用すると、マックアドレスを取得できます。 詳細はコード中にコメントとして記述しています。


#!/usr/bin/ruby

require 'Win32API'

# GetIfTableとGetIfEntryを利用するための準備
GetIfTable = Win32API.new('iphlpapi', 'GetIfTable', %w(p p i), 'i')
GetIfEntry = Win32API.new('iphlpapi', 'GetIfEntry', %w(p), 'i')

# 32bit intを生成
intPtr = "\0" * 4;

# NULLを渡して実際に必要な値をintPtrに入れてもらう
GetIfTable.call(nil, intPtr, 0)

# intPtrに入った必要なサイズをunpack
sz = intPtr.unpack('i')

# mallocのつもり
ptr = "\0" * sz[0]

# 本番取得
GetIfTable.call(ptr, intPtr, 0)

# アダプタ数をゲット
numAdapters, = ptr.unpack('i')

puts "number of adapters : "
p numAdapters

# 各アダプタに関する情報を表示
i = 1
while i <= numAdapters
  # struct MIB_IFROW (see VC++ iphlpapi document)
  mibifrow = "\0" * 512 + [i].pack('i') + "\0" * 512

  # アダプタの情報を取得
  GetIfEntry.call(mibifrow)

  # MIB_IFROW中のmac addressデータ部分
  macaddr = mibifrow[512+20, 6].unpack('C6')

  # 「:」区切りの16進表示へ
  macaddrstr = format("%.2X:%.2X:%.2X:%.2X:%.2X:%.2X",
                      macaddr[0], macaddr[1], macaddr[2],
                      macaddr[3], macaddr[4], macaddr[5])
  p macaddrstr

  # description
  ifdesc, = mibifrow[512+92, 256]
  p ifdesc

  i = i + 1
end

プロフェッショナルIPv6解説動画シリーズ再生リスト

動画で学ぶ「プロフェッショナルIPv6」を作っています。 もしよろしければご覧ください。お楽しみいただければ幸いです!