c# - 如何可靠地获取计算机板载网卡的MAC地址?

标签 c# .net networking

我正在尝试(或多或少)唯一标识一个系统以用于许可目的。我为此任务选择了计算机的板载网络适配器的 MAC 地址,因为我可以确定运行该软件的每个 cmputer 实际上都有一个,这避免了在更改时重新激活,例如硬盘。

不过,我无法可靠地识别板载网络适配器。

使用“Win32_NetworkAdapterConfiguration”ManagementClass,我可以获得一大堆 MAC 地址,包括我喜欢的地址,但我还没有找到一种方法来区分板载地址与 Windows 或病毒扫描程序安装的虚拟适配器。 不过,这个列表似乎是有序的。我感兴趣的 MAC 地址(在我的机器上)列在其他(真实的)网络适配器之前。 (列表按接口(interface)索引排序。)

使用 NetworkInterface.GetAllNetworkInterfaces(),我想我可以通过过滤 .NetworkInterfaceType == NetworkInterfaceType.Ethernet 来识别真正的网络适配器,但这个列表似乎是无序(添加的网卡出现在板载网卡之前)。

首先使用第二种方法获取真实网卡的列表,然后按第一个列表中出现的顺序对它们进行排序是识别我要查找的 MAC 地址的可靠方法吗?第一个列表中的接口(interface)索引可以更改吗? 我很乐意听听您的想法!

谢谢!

P.S.:我知道 MAC 地址可以很容易地更改,但我可以接受。我无法忍受客户在插入 WLAN 棒后无法使用该软件 =)

最佳答案

一个技术含量较低的解决方案是调用 netstat command并查找具有有效 IP 地址的适配器的 MAC 地址。我从未见过 netstat 命令在机器上失败,而我曾多次看到 WMI 给出意外结果。

反正我之前做过类似的激活系统,都是用MAC地址作为识别码的。最后,它带来的麻烦超过了它的值(value)——对我和客户都是如此!我发现更好的平衡和更少的麻烦是让用户在第一次安装软件时“登录”。在用户同意的情况下,您可以向服务器发送一些标识,例如他们的 MAC 地址。

然后您只需要定期检查您的激活数据库以查找重大许可违规的证据,并在必要时停用 key 。作为一个讨厌产品激活的客户和一个讨厌软件盗版的 ISV,我可以看到争论的两面,这样就避免了让客户在某些事情(不可避免地)发生时不得不说服你他们是合法的的尴尬境地错了。

仅举几个 MAC 识别可能不起作用的原因...我在笔记本电脑中使用两个 NIC(有线和无线),具体取决于我是在工作还是在家。一个或另一个可以随时被禁用。另一件需要注意的事情是我经常使用虚拟机,它们不仅有自己的 MAC,而且我可以指定我想要的任何 MAC。然后当然有一天你会发现你的数据库中有大约 100 个人的 MAC 全为零。 :) 这里没有任何保证。

关于c# - 如何可靠地获取计算机板载网卡的MAC地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3085118/

相关文章:

c# - 基于通用类型约束在 Autofac 中有条件地应用通用装饰器

c# - MVC 自定义身份验证、授权和角色实现

c# - 基类的处理顺序

linux - 模拟网络与真实主机之间的桥梁

node.js - 如何访问在连接到具有公共(public) IP 的 Android 设备的 wifi 热点的计算机上运行的 NodeJs HTTP 服务器?

c# - mvc 5 DataVisualization 绘制错误日期图表

c# - 检查值元组是否为默认值

c# - 泛型和 Action 委托(delegate)

c# - sql命令不适用于c#中的select语句

bash - 如何获得第一个可用的 TCP 端口来监听?