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#获取Excel单元格的数据类型的方法详解

    通过C#获取Excel单元格的数据类型的方法详解

    在处理 Excel 文件时,了解单元格的数据类型有助于我们正确地解析和处理数据,本文将详细介绍如何使用 Free Spire.XLS 来获取 Excel 单元格的数据类型,帮助开发者精准地识别数据类型,确保数据处理的准确性,需要的朋友可以参考下
    2025-05-05
  • C#实现MQTT服务端与客户端通讯功能

    C#实现MQTT服务端与客户端通讯功能

    这篇文章介绍了C#实现MQTT服务端与客户端通讯的功能,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • 使用C#和SQL Server实现自动清理功能的完整方案

    使用C#和SQL Server实现自动清理功能的完整方案

    在现代软件开发中,数据管理是一个至关重要的环节,随着时间的推移,数据库中会积累大量过期或冗余的数据,这些数据不仅占用存储空间,还会影响系统性能,本文将详细介绍如何使用C#和SQL Server构建一个功能完善的自动清理系统,需要的朋友可以参考下
    2026-01-01
  • C#中类与接口的区别讲解

    C#中类与接口的区别讲解

    本文详细讲解了C#中类与接口的区别,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C# 7.0 使用下划线忽略使用的变量的原因分析

    C# 7.0 使用下划线忽略使用的变量的原因分析

    这篇文章主要介绍了C# 7.0 使用下划线忽略使用的变量的原因浅析,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10
  • 基于switch你可能不知道的一些用法

    基于switch你可能不知道的一些用法

    本篇文章对switch的用法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Untiy Shader实现纹理贴图滚动

    Untiy Shader实现纹理贴图滚动

    这篇文章主要为大家详细介绍了Untiy Shader实现纹理贴图滚动,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • c# Thread类的用法详解

    c# Thread类的用法详解

    这篇文章主要介绍了c# Thread类的用法的相关资料,帮助大家更好的理解和学习c#的相关知识,感兴趣的朋友可以了解下
    2020-11-11
  • C# 设计模式系列教程-观察者模式

    C# 设计模式系列教程-观察者模式

    将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。
    2016-06-06
  • C#如何去掉文件夹或文件名非法字符

    C#如何去掉文件夹或文件名非法字符

    这篇文章主要介绍了C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06

最新评论