那有什么办法可以获取网卡的真实的物理地址呢?

原创 2013年12月04日 13:12:31

网卡MAC ID 可以通过.net提供的WMI类库来实现,如果用户通过第三方软件修改了mac地址,WMI就是无法获取真实的网卡地址了。

那有什么办法可以获取网卡的真实的物理地址呢?有,那就要用到Windows API函数DeviceIoControl了,代码如下:

public static string GetLocalMac()
        {
            List<string> netCardList = GetNetCardList();
            List<string>.Enumerator enumNetCard = netCardList.GetEnumerator();

            string macAddr = string.Empty;
            while (enumNetCard.MoveNext())
            {
                macAddr = GetPhysicalAddr(enumNetCard.Current);
                if (macAddr != string.Empty)
                {
                    break;
                }
            }
            return macAddr;
        }
        public static List<string> GetNetCardList()
        {
            List<string> cardList = new List<string>();
            try
            {
                //请求“System.Security.Permissions.RegistryPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”类型的权限已失败。
                RegistryKey regNetCards = Registry.LocalMachine.OpenSubKey(Win32Utils.REG_NET_CARDS_KEY);
                if (regNetCards != null)
                {
                    string[] names = regNetCards.GetSubKeyNames();
                    RegistryKey subKey = null;
                    foreach (string name in names)
                    {
                        subKey = regNetCards.OpenSubKey(name);
                        if (subKey != null)
                        {
                            object o = subKey.GetValue("ServiceName");
                            if (o != null)
                            {
                                cardList.Add(o.ToString());
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
            }

            return cardList;
        }
        private static string GetPhysicalAddr(string cardId)
        {
            string macAddress = string.Empty;
            uint device = 0;
            try
            {
                string driveName = "\\\\.\\" + cardId;
                device = Win32Utils.CreateFile(driveName,
                Win32Utils.GENERIC_READ | Win32Utils.GENERIC_WRITE,
                Win32Utils.FILE_SHARE_READ | Win32Utils.FILE_SHARE_WRITE,
                0, Win32Utils.OPEN_EXISTING, 0, 0);
                if (device != Win32Utils.INVALID_HANDLE_VALUE)
                {
                    byte[] outBuff = new byte[6];
                    uint bytRv = 0;
                    int intBuff = Win32Utils.PERMANENT_ADDRESS;

                    if (0 != Win32Utils.DeviceIoControl(device, Win32Utils.IOCTL_NDIS_QUERY_GLOBAL_STATS,
                    ref intBuff, 4, outBuff, 6, ref bytRv, 0))
                    {
                        string temp = string.Empty;
                        foreach (byte b in outBuff)
                        {
                            temp = Convert.ToString(b, 16).PadLeft(2, '0');
                            macAddress += temp;
                            temp = string.Empty;
                        }
                    }
                }
            }
            finally
            {
                if (device != 0)
                {
                    Win32Utils.CloseHandle(device);
                }
            }

            return macAddress;
        }
    }
    

 

  #region Win32Utils
    public class Win32Utils
    {
        public const string REG_NET_CARDS_KEY = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards";
        public const uint GENERIC_READ = 0x80000000;
        public const uint GENERIC_WRITE = 0x40000000;
        public const uint FILE_SHARE_READ = 0x00000001;
        public const uint FILE_SHARE_WRITE = 0x00000002;
        public const uint OPEN_EXISTING = 3;
        public const uint INVALID_HANDLE_VALUE = 0xffffffff;
        public const uint IOCTL_NDIS_QUERY_GLOBAL_STATS = 0x00170002;
        public const int PERMANENT_ADDRESS = 0x01010101;

        [DllImport("kernel32.dll")]
        public static extern int CloseHandle(uint hObject);

        [DllImport("kernel32.dll")]
        public static extern int DeviceIoControl(uint hDevice,
                                                  uint dwIoControlCode,
                                                  ref int lpInBuffer,
                                                  int nInBufferSize,
                                                  byte[] lpOutBuffer,
                                                  int nOutBufferSize,
                                                  ref uint lpbytesReturned,
                                                  int lpOverlapped);

        [DllImport("kernel32.dll")]
        public static extern uint CreateFile(string lpFileName,
                                              uint dwDesiredAccess,
                                              uint dwShareMode,
                                              int lpSecurityAttributes,
                                              uint dwCreationDisposition,
                                              uint dwFlagsAndAttributes,
                                              int hTemplateFile);

    }
    #endregion
}

 

一分钟学会获取本机网卡物理地址(MAC)

    做网络编程的程序员免不了要与MAC地址打交道,这个128bit的数字串在某种程度上就代表了机器的唯一性,因此在做统计工作时一般都以MAC地址作为标准。 下面介绍两种获取本机MAC地址的方式。1...
  • colinchan
  • colinchan
  • 2006年11月03日 13:33
  • 3380

JS获取客户端网卡物理地址(MAC)

 首先,我们知道手动查看MAC地址的方法有以下几种(我用的操作系统是Windows XP):1.点击菜单“开始—所有程序—附件—系统工具—系统信息”,接着在弹出的窗口中点击“组件-网络-适配器”,稍等...
  • itzhiren
  • itzhiren
  • 2007年03月06日 08:41
  • 2147

网卡真实的物理地址获取

原文:http://www.cnblogs.com/watsonyin/p/3457175.html private static string GetPhysicalAddr(string...
  • Joyhen
  • Joyhen
  • 2013年12月04日 17:46
  • 1581

Delphi代码获取网卡物理地址

以下是我从MSDN中翻译过来的三个Delphi单元,调用任意一个单元中声明的API都可以获取网卡的物理地址,但三个单元中的API函数的有效环境和功能各有不同,我把说明附于代码的注释中。unit Lmw...
  • zhouzuoji
  • zhouzuoji
  • 2007年11月03日 21:57
  • 2642

android获取网卡的物理地址

这里是在wifi打开的状态下,所有要首先保证打开wifi WifiManager wifiManager= (WifiManager) context.getSystemService(Cont...
  • fengzijia
  • fengzijia
  • 2015年12月11日 22:49
  • 1188

取得系统中网卡MAC地址的三种方法

    网卡地址这个概念有点混淆不清。因为实际上有两个地址,mac地址和物理地址,一般说网卡地址我是指物理地址,不知道别人怎么看?物理地址指的是网卡上的存放地址的ROM里的地址,mac地址是这块卡工作...
  • zhangting1987
  • zhangting1987
  • 2008年07月29日 17:08
  • 5255

delphi技术专题---获取网卡物理地址之内存获取方式函数源码

转载请保留本网页地址:http://blog.csdn.net/sushengmiyan/article/details/8544442 先贴代码: {-----------------------...
  • sushengmiyan
  • sushengmiyan
  • 2013年01月26日 13:33
  • 2421

C++之获取网卡物理地址(MAC)

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include   //该头文件定义了Socket编程的功能  ...
  • pbl18392021230
  • pbl18392021230
  • 2017年05月24日 09:44
  • 799

网卡物理地址和MAC地址的几点感想

    网卡物理地址指的是网卡存放在存储器里的地址,而MAC地址是网卡工作的时候用的地址,当然一般情况下这两个地址是一样的。    这里要说的是存储器通常是指EEPROM,我想只要你乐意将网卡物理地址...
  • progsoft
  • progsoft
  • 2007年04月10日 00:37
  • 1962

网卡MAC地址相关信息大全-3 如何实现修改网卡物理地址的三种方法

如何实现修改网卡物理地址的三种方法,同样要感谢胡大虾 :)1、买一块可以通过写eeprom物理的修改网卡地址,这种卡现在很多,并非买不到。如果环境中需要应用网络,那么修改MAC地址,使得两块卡的MAC...
  • iwait
  • iwait
  • 2004年11月07日 02:57
  • 3368
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:那有什么办法可以获取网卡的真实的物理地址呢?
举报原因:
原因补充:

(最多只允许输入30个字)