C# C/S程序获取MAC地址三种方法

之前为了自己的共享软件,曾萌生过靠共享软件发财的想法,从而考虑通过绑定注册用户的MAC地址,从而实现正版用户与盗版用户的验证

研究了很多次,在笔记本,台式机,老式台式机(2002年到2009年之间的老式机器)上试验自己的程序

发现读取客户端的MAC地址有三种方法比较靠谱,献给大家我的测试结果

 

1.通过System.Net命名空间获取客户端当前启用的网络连接的网卡地址

#region 返回当前系统所启用的网络连接的信息
       public static NetworkInterface[] NetCardInfo()
       {
           return NetworkInterface.GetAllNetworkInterfaces();
       }
       #endregion
 
 
 
       public static string[] GetMacString()
       {
           string strMac = "";
           NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
           foreach (NetworkInterface ni in interfaces)
           {
               if (ni.OperationalStatus == OperationalStatus.Up)
               {
                   strMac += ni.GetPhysicalAddress().ToString() + "|";
               }
           }
           return strMac.Split('|');
 
       }

2.通过WMI读取系统信息里的网卡MAC

public static string[] WMIGetMACString()
       {
               //获取网卡Mac地址  
               string mac = "";
               ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
               ManagementObjectCollection moc = mc.GetInstances();
               foreach (ManagementObject mo in moc)
               {
                   if ((bool)mo["IPEnabled"] == true)
                   {
                       mac+= mo["MacAddress"].ToString()+"|";
                   }
               }
               moc = null;
               mc = null;
               return mac.Split('|');
       }

3.注册表读取方法(那种没装360,从来不打补丁,盗版修改版系统的用户要排除掉)

有1个路径

常规用户通过Windows Genuine Advantage可以获取到物理网卡地址。

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Genuine Advantage

PS:

第一种方法有以下两种缺陷

a.如果当前的网卡是禁用状态(硬件处于硬关闭状态),取不到MAC地址,MAC地址会返回为空。

b.如果当前启用了多个网卡,返回的地址是最近启用的网络连接的信息,假如说你获取的是个USB网卡呢,那就o(╯□╰)o了

第二种方法有很严重的一个缺陷,那就是依赖WMI的系统服务,如果系统服务缺失或者出现问题,WMI获取恐怕就很难

第一种PK第二种,优点很明显那就是不依赖服务,返回的信息可以直接构造成为数据,比如图片中的dataGridView绑定。

第三种是利用微软的正版验证程序所获取的信息,信微软则可以考虑,但是经过我的实地测试,在台式机上获取好像不太准确,会有两个MAC地址(实际只有一个物理网卡)

再提到一些不太靠谱的方法,个人所见,也许有人不赞同,但是请您将您的测试发出来

1.协议方法,通过网络协议获取客户端的IP再通过ARP协议转换成为MAC地址,

2.通过command命令行,比如说IPCONFIG 之类的,

3.通过扩展协议,比如说抓包程序,分析报文之类的

4.通过WIN32 API

这些方法都存在通用性不强,

1,2,3依靠C#执行别的代码就要通过那个什么CLR转换,效率太低,感觉就是很卡,而且通过new Process之类,线程之类的话,又存在休眠,效率守护之类囧。

4,他只能通过WIN的操作系统核心函数去取,不同WIN操作系统很可能这些核心函数的参数或者语法就不一样。

posted on   澜紫癜青  阅读(10308)  评论(0编辑  收藏  举报

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)

导航

< 2011年4月 >
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
1 2 3 4 5 6 7
点击右上角即可分享
微信分享提示