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