C#获取电脑网卡MAC地址的方法详解

 更新时间:2026年04月22日 08:34:44   作者:加号3  
MAC地址是网络接口的物理地址,由48位二进制数组成,通常表示为6组十六进制数,本文将详细介绍在C#中如何获取电脑MAC地址的方法,包含完整代码示例和实际开发中的注意事项,需要的朋友可以参考下

本文将详细介绍在C#中如何获取电脑MAC地址的方法,包含完整代码示例和实际开发中的注意事项。

一、什么是MAC地址

MAC地址(Media Access Control Address)是网络接口的物理地址,由48位二进制数组成,通常表示为6组十六进制数(如 00:1A:2B:3C:4D:5E)。每个网卡出厂时都被分配了全球唯一的MAC地址,常用于设备识别、网络管理和安全认证等场景。

二、推荐方案:使用 NetworkInterface 类

.NET Framework 提供了 System.Net.NetworkInformation 命名空间,这是获取MAC地址最标准、跨平台兼容性最好的方式

2.1 获取电脑可用网卡MAC地址

/// <summary>
/// 获取电脑MAC地址
/// </summary>
/// <returns></returns>
public static List<string> GetMacByWmi()
{
    string key = "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\";
    List<string> macList = new List<string>();
    try
    {
        NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
        foreach (NetworkInterface adapter in nics)
        {
            if (adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet && adapter.GetPhysicalAddress().ToString().Length != 0)
            {
                string fRegistryKey = key + adapter.Id + "\\Connection";
                RegistryKey rk = Registry.LocalMachine.OpenSubKey(fRegistryKey, false);
                if (rk != null)
                {
                    //string fPnpInstanceID = rk.GetValue("PnpInstanceID", "").ToString();
                    //if (fPnpInstanceID.Length > 3 && fPnpInstanceID.Substring(0, 3) == "PCI")
                    {
                        string macAddress = adapter.GetPhysicalAddress().ToString();
                        for (int i = 1; i < 6; i++)
                        {
                            macAddress = macAddress.Insert(3 * i - 1, "-");
                        }
                        macList.Add(macAddress);
                        //break;
                    }
                }
            }
        }
    }
    catch (Exception ex)
    {
    }
    return macList;
}

2.2 调试结果

2.3 常见网卡类型枚举

类型说明
Ethernet有线以太网
Wireless80211WiFi无线网卡
Loopback本地回环接口
Tunnel虚拟隧道接口

三、常见问题与注意事项

3.1 虚拟网卡过滤

现代电脑常有多个虚拟网卡(VMware、VirtualBox、VPN等),建议过滤掉这些以获取真实物理网卡

// 排除虚拟网卡的关键字
string[] virtualKeywords = {
    "virtual", "vmware", "hyper-v", "virtualbox", 
    "vpn", "tunnel", "tap-windows", "wireguard"
};

3.2 MAC地址格式转换

// 原始格式: 001A2B3C4D5E
string raw = "001A2B3C4D5E";

// 转换为冒号格式: 00:1A:2B:3C:4D:5E
string colon = string.Join(":", Enumerable.Range(0, 6)
    .Select(i => raw.Substring(i * 2, 2)));

// 转换为连字符格式: 00-1A-2B-3C-4D-5E
string hyphen = string.Join("-", Enumerable.Range(0, 6)
    .Select(i => raw.Substring(i * 2, 2)));

3.3 权限问题

在普通用户权限下通常可以正常获取MAC地址
某些企业环境或安全软件可能限制访问,建议添加异常处理

3.4 多网卡环境

笔记本电脑通常同时具有有线和无线网卡,建议:

  • 优先选择 OperationalStatus.Up 的网卡
  • 按连接速度排序,选择最快的网卡
  • 排除Loopback和虚拟网卡

四、总结

在大多数场景下,推荐使用 NetworkInterface 类获取MAC地址,它简单、可靠且跨平台兼容。

到此这篇关于C#获取电脑网卡MAC地址的方法详解的文章就介绍到这了,更多相关C#获取电脑网卡MAC地址内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#实现批量给图片添加水印的示例代码

    C#实现批量给图片添加水印的示例代码

    这篇文章主要为大家详细介绍了如何利用C#实现批量给图片添加水印的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以了解一下
    2022-12-12
  • C#实现的文件上传下载工具类完整实例【上传文件自动命名】

    C#实现的文件上传下载工具类完整实例【上传文件自动命名】

    这篇文章主要介绍了C#实现的文件上传下载工具类,结合完整实例形式分析了C#操作文件上传与下载功能,并且还可针对上传文件自动命名以避免服务器中的文件名重复,需要的朋友可以参考下
    2017-11-11
  • c# 获取CookieContainer的所有cookies函数代码

    c# 获取CookieContainer的所有cookies函数代码

    这篇文章主要介绍了c# 获取CookieContainer所有cookies的函数代码,需要的朋友可以参考下
    2013-06-06
  • C#如何安全、高效地玩转任何种类的内存之Span的本质

    C#如何安全、高效地玩转任何种类的内存之Span的本质

    为什么要使用指针,什么时候需要使用它,以及如何安全、高效地使用它?本文将讲清楚 What、How 和 Why ,让你知其然,更知其所以然
    2021-08-08
  • c# 配置文件App.config操作类库的方法

    c# 配置文件App.config操作类库的方法

    下面小编就为大家带来一篇c# 配置文件App.config操作类库的方法。小编觉的挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C#属性显示的实现示例

    C#属性显示的实现示例

    本文主要介绍了C#属性显示的实现示例,显示对象的属性,包括可显示属性、可编辑属性、及不可编辑属性,下面就具有来介绍一下,感兴趣的可以了解一下
    2024-04-04
  • C#判断密码强度的方法

    C#判断密码强度的方法

    这篇文章主要介绍了C#判断密码强度的方法,较为详细的分析了C#判断密码强度的原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • C#获取根目录实现方法汇总

    C#获取根目录实现方法汇总

    这篇文章主要介绍了C#获取根目录实现方法汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • c#高效的线程安全队列ConcurrentQueue<T>的实现

    c#高效的线程安全队列ConcurrentQueue<T>的实现

    这篇文章主要介绍了c#高效的线程安全队列ConcurrentQueue<T>的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • C#实现文件操作(复制,移动,删除)的方法详解

    C#实现文件操作(复制,移动,删除)的方法详解

    File类提供了常见的文件操作函数,包括复制、移动、删除、创建快捷方式等,本文将通过一些简单的示例为大家详细讲讲具体的使用,希望对大家有所帮助
    2023-05-05

最新评论