Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

การดึงที่อยู่ MAC Address ใน C#

ภาพรวม

ที่อยู่ MAC (Media Access Control Address) เป็นตัวระบุเฉพาะตัว (Unique Identifier) ที่กำหนดให้กับ Network Interface Card (NIC) แต่ละตัว ใช้ในชั้น Data Link Layer ของเครือข่าย เทคโนโลยีที่ใช้ MAC Address ได้แก่ Ethernet, Wi-Fi, Bluetooth, Fibre Channel ฯลฯ

โค้ดสำหรับดึง MAC Address

using System;
using System.Net.NetworkInformation;

public class MacAddressHelper
{
    public static string GetMacAddress()
    {
        string macAddress = string.Empty;
        
        // ดึง Network Interfaces ทั้งหมด
        foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
        {
            // เลือกเฉพาะ Interface ที่ทำงานอยู่ (Up) และไม่ใช่ Loopback
            if (nic.OperationalStatus == OperationalStatus.Up 
                && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)
            {
                // ดึง Physical Address (MAC)
                PhysicalAddress pa = nic.GetPhysicalAddress();
                
                if (pa != null && pa.GetAddressBytes().Length > 0)
                {
                    macAddress = pa.ToString(); // รูปแบบ: 001122334455
                    break; // หยุดหลังเจอตัวแรกที่ใช้งานได้
                }
            }
        }
        
        return macAddress;
    }
    
    // รูปแบบมาตรฐาน XX:XX:XX:XX:XX:XX
    public static string FormatMacAddress(string mac)
    {
        if (string.IsNullOrEmpty(mac) || mac.Length != 12)
            return mac;
        
        return string.Join(":", 
            Enumerable.Range(0, 6)
                     .Select(i => mac.Substring(i * 2, 2))
                     .ToArray());
    }
}

// การใช้งาน
class Program
{
    static void Main()
    {
        string mac = MacAddressHelper.GetMacAddress();
        Console.WriteLine("MAC Address: " + MacAddressHelper.FormatMacAddress(mac));
    }
}

คำอธิบายโค้ดสำคัญ

1. NetworkInterface.GetAllNetworkInterfaces()

ดึงรายการ Network Interface ทั้งหมดบนเครื่อง (Ethernet, Wi-Fi, VPN, Loopback, Virtual adapters, ฯลฯ)

2. การกรอง Interface

nic.OperationalStatus == OperationalStatus.Up
nic.NetworkInterfaceType != NetworkInterfaceType.Loopback
  • OperationalStatus.Up - Interface ทำงานอยู่ (Connected)
  • ข้าม Loopback (127.0.0.1) ซึ่งไม่มี MAC จริง
  • อาจเพิ่มกรอง nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet หรือ Wireless80211 ตามต้องการ

3. GetPhysicalAddress()

คืนค่า PhysicalAddress object เรียก .ToString() ได้สตริง 12 ตัวอักษร Hex (เช่น 001122334455)

รูปแบบ MAC Address

รูปแบบตัวอย่าง
Raw (ToString)001122334455
Colon-separated00:11:22:33:44:55
Hyphen-separated00-11-22-33-44-55
Cisco (Dot)0011.2233.4455

ข้อสังเกตสำคัญ

  • เครื่องอาจมีหลาย Network Interface (Ethernet, Wi-Fi, Docker, Hyper-V, VPN) → ต้องกรองให้ถูกต้อง
  • MAC Address อาจถูกปลอม (Spoof) ได้ → ไม่ควรใช้เพื่อ Security เพียงอย่างเดียว
  • บาง Interface ไม่มี MAC (เช่น Tunnel, Loopback) → ต้องตรวจสอบ GetAddressBytes().Length > 0
  • ต้องเพิ่ม Reference: System.Net.NetworkInformation
  • ใน .NET Core / .NET 5+ ทำงานได้บน Windows, Linux, macOS