C# C/S程序获取MAC地址三种方法 转载自http://www.cnblogs.com/yzb305070/archive/2011/04/03/2004364.html 添加了一些自己的经验
2012-12-24 17:36
417 查看
最近在做关于防拷贝功能 即注册与当前机器的Mac地址绑定 虽然以前没做过,但觉得很简单啊 不就是绑定mac地址嘛,但做起来就不是那么回事了
网卡 有很多种 有线的物理网卡 无线网卡 还有 虚拟网卡 ,可悲的是我现在用C#写代码,而显然API并没有做到它所承诺的,在C#上区分三者让我有些。。。 我想如果写底层就不会有种无力感
但这也是我能力不够的表现 就像我们人类不断的在研究这个自然,不断的去描述,但想全面的了解它,无异于登天
最后感觉上层开发者的无知,让自己显得更加悲哀。这之间的关系 如同 圣人 和 凡夫的区别。 圣人研究宇宙,并阐述自己的见解,而凡夫则有时连记问之学都没有,反而洋洋自得;当遇到问题时,就变的 怎一个二字乐得
解决方案:
也是参考并修改的别人的代码(感觉自己没有存在感 哎。。。) 粘贴出来 希望有大牛指导
利用NetworkInterface.GetAllNetworkInterfaces()
然后与注册表相结合
foreach (NetworkInterface adapter in fNetworkInterfaces)
{
if (adapter.OperationalStatus == OperationalStatus.Up && adapter.NetworkInterfaceType!= NetworkInterfaceType.Wireless80211 && adapter.NetworkInterfaceType!= NetworkInterfaceType.Loopback)
{
string fRegistryKey = "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\" + adapter.Id + "\\Connection";
RegistryKey rk = Registry.LocalMachine.OpenSubKey(fRegistryKey, false);
if (rk != null)
{
// 区分 PnpInstanceID
// 如果前面有 PCI 就是本机的真实网卡
// MediaSubType 为 01 则是常见网卡,02为无线网卡。
string fPnpInstanceID = rk.GetValue("PnpInstanceID", "").ToString();
int fMediaSubType = Convert.ToInt32(rk.GetValue("MediaSubType", 0));
// fPnpInstanceID.Substring(0, 3) == "PCI" 有的網卡不是這樣的 最后 发现有个定律 物理网卡中都包含 PCI 子字符串
if (fPnpInstanceID.Length > 3 && fPnpInstanceID.Contains("PCI") && fMediaSubType != 2 && fMediaSubType != 1)
{
// i++;
mac.Add(adapter.GetPhysicalAddress().ToString());
}
下面是转载的内容:(网上有很多)
=====================================================================================================
之前为了自己的共享软件,曾萌生过靠共享软件发财的想法,从而考虑通过绑定注册用户的MAC地址,从而实现正版用户与盗版用户的验证
研究了很多次,在笔记本,台式机,老式台式机(2002年到2009年之间的老式机器)上试验自己的程序
发现读取客户端的MAC地址有三种方法比较靠谱,献给大家我的测试结果
1.通过System.Net命名空间获取客户端当前启用的网络连接的网卡地址
?
2.通过WMI读取系统信息里的网卡MAC
?
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操作系统很可能这些核心函数的参数或者语法就不一样。
===================================================================================================================================
网卡 有很多种 有线的物理网卡 无线网卡 还有 虚拟网卡 ,可悲的是我现在用C#写代码,而显然API并没有做到它所承诺的,在C#上区分三者让我有些。。。 我想如果写底层就不会有种无力感
但这也是我能力不够的表现 就像我们人类不断的在研究这个自然,不断的去描述,但想全面的了解它,无异于登天
最后感觉上层开发者的无知,让自己显得更加悲哀。这之间的关系 如同 圣人 和 凡夫的区别。 圣人研究宇宙,并阐述自己的见解,而凡夫则有时连记问之学都没有,反而洋洋自得;当遇到问题时,就变的 怎一个二字乐得
解决方案:
也是参考并修改的别人的代码(感觉自己没有存在感 哎。。。) 粘贴出来 希望有大牛指导
利用NetworkInterface.GetAllNetworkInterfaces()
然后与注册表相结合
foreach (NetworkInterface adapter in fNetworkInterfaces)
{
if (adapter.OperationalStatus == OperationalStatus.Up && adapter.NetworkInterfaceType!= NetworkInterfaceType.Wireless80211 && adapter.NetworkInterfaceType!= NetworkInterfaceType.Loopback)
{
string fRegistryKey = "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\" + adapter.Id + "\\Connection";
RegistryKey rk = Registry.LocalMachine.OpenSubKey(fRegistryKey, false);
if (rk != null)
{
// 区分 PnpInstanceID
// 如果前面有 PCI 就是本机的真实网卡
// MediaSubType 为 01 则是常见网卡,02为无线网卡。
string fPnpInstanceID = rk.GetValue("PnpInstanceID", "").ToString();
int fMediaSubType = Convert.ToInt32(rk.GetValue("MediaSubType", 0));
// fPnpInstanceID.Substring(0, 3) == "PCI" 有的網卡不是這樣的 最后 发现有个定律 物理网卡中都包含 PCI 子字符串
if (fPnpInstanceID.Length > 3 && fPnpInstanceID.Contains("PCI") && fMediaSubType != 2 && fMediaSubType != 1)
{
// i++;
mac.Add(adapter.GetPhysicalAddress().ToString());
}
下面是转载的内容:(网上有很多)
=====================================================================================================
之前为了自己的共享软件,曾萌生过靠共享软件发财的想法,从而考虑通过绑定注册用户的MAC地址,从而实现正版用户与盗版用户的验证
研究了很多次,在笔记本,台式机,老式台式机(2002年到2009年之间的老式机器)上试验自己的程序
发现读取客户端的MAC地址有三种方法比较靠谱,献给大家我的测试结果
1.通过System.Net命名空间获取客户端当前启用的网络连接的网卡地址
?
?
有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操作系统很可能这些核心函数的参数或者语法就不一样。
===================================================================================================================================
相关文章推荐
- C# C/S程序获取MAC地址三种方法
- C# C/S程序获取MAC地址三种方法
- C#中获取程序当前路径的集中方法(转载)
- ubuntu 自添加开机启动程序(一种使ethtool设置永久保存在网络设备中的曲线救国方法) 转自:http://www.groad.net/bbs/read.php?tid-1393.html
- AJAX从服务端获取数据的三种方法【转:http://www.cnblogs.com/nokiaguy/archive/2008/05/25/1207157.html】
- C#下载4种方法(转载: http://topic.csdn.net/u/20120822/10/d8115bb7-2f2a-4c2f-b0c1-aab68bcb1e3e.html)
- 【转载】C#中获取程序当前路径的集中方法
- ARM Linux开机后自动运行特定程序的方法[转载自:http://linux.chinaitlab.com/administer/744766.html]
- C# 启动外部程序的几种方法(转自:http://www.cnblogs.com/Slxj/archive/2012/01/12/2320531.html)
- 推荐一些C#相关的网站、资源和书籍 (转载自http://www.cnblogs.com/jiangxiaofan/p/3808316.html)
- 【转载】C#获取项目程序路径的10种方法
- 在C# ASP.NET中,要添加属性到控件中 在HTML页面获取控件中自己定义属性和值
- C#.Net中获取程序运行时间的两种方法 (转载:陈进学博客)
- js 调用C#.NET后台方法 转载自:http://www.cnblogs.com/lizhao/archive/2010/11/23/1990436.html
- C#中获取程序当前路径的集中方法收藏
- C#获取应当程序当前目录的方法
- C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?
- 安装程序添加iis的方法经验分享
- C#发送Email邮件三种方法的总结(转载)
- [转载]C# 获得当前目录和执行目录的一些方法