验证计算机MAC地址进行软件授权是一种通用的方法,C#可以轻松获取计算机的MAC地址,本文采用实际的源代码讲述了两种获取网卡的方式,第一种 方法使用ManagementClass类,只能获取本机的计算机网卡物理地址,第二种方法使用Iphlpapi.dll的SendARP方法,可以获取 本机和其它计算机的MAC地址。

方法1:使用ManagementClass类

示例:

        /// <summary>
/// 获取网卡物理地址
/// </summary>
/// <returns></returns>
public static string getMacAddr_Local()
{
string madAddr = null;
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc2 = mc.GetInstances();
foreach (ManagementObject mo in moc2)
{
if (Convert.ToBoolean(mo["IPEnabled"]) == true)
{
madAddr = mo["MacAddress"].ToString();
madAddr = madAddr.Replace(':', '-');
}
mo.Dispose();
}
return madAddr;
}

说明:

1.需要给项目增加引用:System.Management

2.在程序开始添加包引入语句:using System.Management;

3.本方案只能获取本机的MAC地址;

方法2:使用SendARP类

示例:

        //下面一种方法可以获取远程的MAC地址
[DllImport("Iphlpapi.dll")]
static extern int SendARP(Int32 DestIP, Int32 SrcIP, ref Int64 MacAddr, ref Int32 PhyAddrLen);
[DllImport("Ws2_32.dll")]
static extern Int32 inet_addr(string ipaddr);
/// <summary>
/// SendArp获取MAC地址
/// </summary>
/// <param name="RemoteIP">目标机器的IP地址如(192.168.1.1)</param>
/// <returns>目标机器的mac 地址</returns>
public static string getMacAddr_Remote(string RemoteIP)
{
StringBuilder macAddress = new StringBuilder();
try
{
Int32 remote = inet_addr(RemoteIP);
Int64 macInfo = new Int64();
Int32 length = ;
SendARP(remote, , ref macInfo, ref length);
string temp = Convert.ToString(macInfo, ).PadLeft(, '').ToUpper();
int x = ;
for (int i = ; i < ; i++)
{
if (i == )
{
macAddress.Append(temp.Substring(x - , ));
}
else
{
macAddress.Append(temp.Substring(x - , ) + "-");
}
x -= ;
}
return macAddress.ToString();
}
catch
{
return macAddress.ToString();
}
}

说明:

1.在程序开始添加包引入语句:using System.Runtime.InteropServices;

2.该方法可以获取远程计算机的MAC地址;

C#获得本机MAC地址 - [Coding](转)

刚开始在机房推广我们组的系统,用户注册就失效了,debug了许久之后,发现居然是一直都在使用的获得MAC的地址的方法居然失效了——数据库报异常,以MAC为主键的表提示主键重复了   ,怎么可能啊?就好像GUID重复一样!!!!

对原来获得MAC的地址的代码做了测试,才发现在我机子居然运行的结果和在cmd下ipconfig的结果不同 ,仅是一个vm的mac。源码如下:

string MacAddress;
//设置MAC地址
string MAC="";
ManagementClass MC = new ManagementClass ( "Win32_NetworkAdapterConfiguration" );
ManagementObjectCollection MOC = MC.GetInstances();
foreach ( ManagementObject moc in MOC )
{
if ( moc["IPEnabled"].ToString() == "True")
{
MAC = moc["MacAddress"].ToString();
}
}
MacAddress=MAC;

经过在网络上寻找,找到了获得本机mac的方法,只是结果是一个ArrayList,运行的结果和cmd下命令一样,只是包括了一个真的mac和两个vm的mac,源码如下:

using System.Management;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions; string strsearch=string.Format(@"SELECT MACAddress FROM Win32_NetworkAdapter WHERE ((MACAddress Is Not NULL)AND (Manufacturer <> 'Microsoft'))"); System.Management.ManagementObjectSearcher msearch=new ManagementObjectSearcher();
msearch.Scope=new ManagementScope(@"root/CIMV2");
msearch.Query=new ObjectQuery(strsearch);
ArrayList MacList =new ArrayList();
int i =;
try
{
if((msearch.Get().Count<) || (msearch.Get()==null))
{
MessageBox.Show("No MAC Address!");
}
else
{
MessageBox.Show("MAC Address No. is : "+ msearch.Get().Count.ToString());
foreach(System.Management.ManagementObject mymac in msearch.Get())
{
string str1=string.Format("MAC{0} address:{1}",i.ToString(),mymac["MACAddress"].ToString());
MessageBox.Show("MAC Address "+i.ToString()+":"+str1);
MacList.Add(str1);
i++;
}
}
}
catch(Exception ex)
{
string msg=ex.Message.ToString();
MessageBox.Show("erro", msg);
}

由于没有办法确定获得mac那个真实的,所以又用了第三个方法,通过IP地址获得mac:

using System.Management;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions; [DllImport("Iphlpapi.dll")]
private static extern int SendARP(Int32 dest,Int32 host,ref Int32 mac,ref Int32 length);
[DllImport("Ws2_32.dll")]
private static extern Int32 inet_addr(string ip); string IPAddress=System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName()).AddressList[].ToString();
MessageBox.Show("ip: "+IPAddress);
string mac = this.GetMACFromIP(IPAddress);
MessageBox.Show("mac: "+mac); private string GetMACFromIP(string A_strIP)
{
string strRet = "Unknown"; string strIPPattern = @"^/d+/./d+/./d+/./d+$"; Regex objRex =new Regex(strIPPattern); if(objRex.IsMatch(A_strIP) == true)
{
Int32 intDest = inet_addr(A_strIP);
Int32 [] arrMAC = new Int32[];
Int32 intLen = ; int intResult = SendARP(intDest,,ref arrMAC[],ref intLen); if(intResult == )
{
Byte [] arrbyte = new Byte[];
arrbyte[] = (Byte)(arrMAC[] >> );
arrbyte[] = (Byte)arrMAC[];
arrbyte[] = (Byte)(arrMAC[] >> );
arrbyte[] = (Byte)(arrMAC[] >> );
arrbyte[] = (Byte)(arrMAC[] >> );
arrbyte[] = (Byte)arrMAC[]; StringBuilder strbMAC = new StringBuilder(); for(int intIndex = ;intIndex < ;intIndex ++)
{
if(intIndex > ) strbMAC.Append("-");
strbMAC.Append(arrbyte[intIndex].ToString("X2"));
}
strRet = strbMAC.ToString();
}
}
return strRet;
}

C#获取mac的更多相关文章

  1. linux win 通用的获取Mac的方法

    经测试下面方法获取Mac跨平台 protected override void OnLoad(EventArgs e) { Response.Write(string.Join("<b ...

  2. php怎么获取mac地址?

    如何用php获取mac地址呢?大家知道mac地址是电脑在全球范围的唯一标识,所以这个就非常实用,比如说要做一个投票功能,那mac地址是必不可少 的,如果单纯的靠ip地址来判断这个肯定是不准确的,水分太 ...

  3. C# 获取MAC地址

    /********************************************************************** * C# 获取MAC地址 * 说明: * 在C#中获取本 ...

  4. c++ windows 获取mac地址

    c++ windows 获取mac地址 GetAdaptersInfo 用windows api获取mac地址和硬盘id编号 aa

  5. python 获取 mac 地址 的代码

    python 获取 mac 地址 的例子,有需要的朋友可以参考下. #!/bin/python import os import re def GetMac():     if os.name ==  ...

  6. 获取Mac、CPUID、硬盘序列号、本地IP地址、外网IP地址OCX控件

    提供获取Mac.CPUID.硬盘序列号.本地IP地址.外网IP地址OCX控件 开发语言:vc++ 可应用与WEB程序开发应用 <HTML><HEAD><TITLE> ...

  7. Java根据ip地址获取Mac地址,Java获取Mac地址

    Java根据ip地址获取Mac地址,Java获取Mac地址 >>>>>>>>>>>>>>>>>&g ...

  8. android获取Mac地址和IP地址

    获取Mac地址实际项目中测试了如下几种方法:(1)设备开通Wifi连接,获取到网卡的MAC地址(但是不开通wifi,这种方法获取不到Mac地址,这种方法也是网络上使用的最多的方法) //根据Wifi信 ...

  9. c# 获取MAC IP TCP列表

    转载自baidu:http://hi.baidu.com/jackeyrain/item/ff94efcfd5cf3a3099b498e9 namespace Public { public clas ...

  10. php获取mac用于网站绑定服务器

    php获取mac用于网站绑定服务器 <?php class GetMacAddr{ var $return_array = array(); // 返回带有MAC地址的字串数组 var $mac ...

随机推荐

  1. jquery渐隐轮播

    html <body> <div id="banner"> <div id="banner_bg"></div> ...

  2. JavaScript中String对象的match()、replace() 配合正则表达式使用

    正则表达式由来已久,查找替换功能非常强大,但模板难记复杂. JavaScript中String对象的match().replace()这2个方法都要使用正则表达式的模板.当模板内容与字符串不相匹配时, ...

  3. PagedList 分页

    @using PagedList.Mvc;@model PagedList.IPagedList<MvcApplicationBootStramp.Models.Person> @{    ...

  4. confirm的用法 一般用于按钮操作时确定是否执行

    <script type = "text/javascript" language = "javascript"> function clear1( ...

  5. 0104.1——视图控制器UIViewController

    一.生命周期 当一个视图控制器被创建,并在屏幕上显示的时候. 代码的执行顺序1. alloc                              创建对象,分配空间2.init (initWit ...

  6. easyui page添加文本,js验证码

    onLoadSuccess: function (db) { //db是后台数据的返回结果集 $.ajax({ url: "AjaxSource/Buex.ashx", data: ...

  7. slf4j绑定log4j失败

    1,出现问题的配置 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api< ...

  8. shell练习--用户下载交互检测

    #!/bin/bash #By spinestars #-- read -p "请输入下载目录路径" down_dir read -p "请输入网址路径" ur ...

  9. Qt带来的是更加低廉的开发成本和学习成本,对于很多小公司而言,这种优势足以让他们获得更大的利润空间 good

    不能单纯从技术上来看待这个问题,Qt本来是小众的开发平台,个人认为,它的出现只是解决特性场景的特定问题,Qt带来的是更加低廉的开发成本和学习成本,对于很多小公司而言,这种优势足以让他们获得更大的利润空 ...

  10. SQL Server 索引的自动维护 <第十三篇>

    在有大量事务的数据库中,表和索引随着时间的推移而碎片化.因此,为了增进性能,应该定期检查表和索引的碎片,并对具有大量碎片的进行整理. 1.确定当前数据库中所有需要分析碎片的表. 2.确定所有表和索引的 ...