C#でMACアドレスを取得する

MACアドレスは、LANカードやルーターなどのネットワーク機器に付けられた番号で、原則的に全世界で重複しない番号が機器毎に割り当てられています。

物理アドレス (Physical Address) とかノードID (Node ID) などと呼ばれる事もあるようです。

 

C#のプログラムからMACアドレスを取得する方法について解説します。

C++の場合はこちら↓

C++でMACアドレスを取得する


NetworkInterfaceクラス

NetworkInterfaceクラスはネットワークインターフェースの構成情報などを提供します。

GetAllNetworkInterfacesメソッドを使って、ローカルコンピュータ上のネットワークインターフェースを取得します。

 

GetAllNetworkInterfacesメソッドの戻り値は、NetworkInterfaceクラスの配列です。

1つのPCでも、有線LAN・Wi-Fi・Bluetoothなど複数のネットワークインターフェースをもつ場合がある事を意識してコードを書く必要があります。

using System.Net.NetworkInformation;



public List<PhysicalAddress> GetPhysicalAddress()
{
    var list = new List<PhysicalAddress>();
    var interfaces = NetworkInterface.GetAllNetworkInterfaces();

    foreach (var adapter in interfaces)
    {
        if (OperationalStatus.Up == adapter.OperationalStatus)
        {
            if ((NetworkInterfaceType.Unknown  != adapter.NetworkInterfaceType) &&
                (NetworkInterfaceType.Loopback != adapter.NetworkInterfaceType))
            {
                list.Add(adapter.GetPhysicalAddress());
            }
        }
    }
    return list;
}

ローカルPC上のネットワークインターフェースを取得 (8行目)

GetAllNetworkInterfacesメソッドでインターフェースを取得します。

戻り値は配列なので、foreach文で1つづつ中身を確認していきます。(10~20行目)

ネットワーク接続の状態を確認 (12行目)

OperationalStatusプロパティを確認する事でそれぞれのネットワークインターフェースの現在の操作状態を確認する事が出来ます。

上記の例では、稼働しているインターフェースのみを対象にMACアドレスを収集しています。

 

状態の種類については OperationalStatus Enum を参照。

ネットワーク接続の種類を確認 (14~15行目)

NetworkInterfaceTypeプロパティを確認する事でネットワークインターフェースの種類を確認する事が出来ます。

上記の例では、不明な場合やループバックアダプタを除外しています。

 

種類については NetworkInterfaceType Enum を参照

MACアドレスを取得する (17行目)

GetPhysicalAddressメソッドでMACアドレスを取得します。

戻り値はPhysicalAddressオブジェクトです。

PhysicalAddressクラスでは、バイト配列は文字列などでMACアドレスを取得出来ます。