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# - 在 Windows 窗体中使用线程

c# - 如何在文档内的 XML 中添加一个命名空间和另一个带有前缀的命名空间

linux - 如何在 sysfs 中写入每个 channel 的属性

python - 获取openwrt中的物理接口(interface)列表

iphone - Charles Web 代理工具无法捕获来自 iPhone 的 UDP 数据包

c# - 发布到 mvc actionresult 时,Json 数组对象始终为空

c# - 上午/下午到时间跨度

c# - 仁慈SSH.NET : How to delete nonempty directory?

c# - 从使用 Task.WhenAll() 等待的任务分配时避免检查条件两次

c# - 161803398 是一个 'Special' 的数字吗? Math.Random() 内部