Windows中获取MAC地址的几种方法

Windows中获取MAC地址的几种方法
1.NDIS(DDK)通过驱动程序获取MAC地址

ndis规范中说明,网卡驱动程序支持ioctl_ndis_query_stats接口
参数如下:
OID_802_3_PERMANENT_ADDRESS :物理地址
OID_802_3_CURRENT_ADDRESS  mac地址
于是我们的方法就得到了。

首先,看看注册表,一网卡有几块,分别是什么设备名。
磁流变阻尼器具体位置和os有关,2000下在hlm\software\microsoft\windows nt\current version\networkcards

然后createfile(devicename,...)注意,要用linkname,因此
还要加上"////.//device//". 辽宁工程技术大学学报


接着
deviceiocontrol(hmac,IOCTL_NDIS_QUERY_STATS,
OID_802_3_PERMANENT_ADDRESS/OID_802_3_)


具体的情况可以参看ddk下的
OID_802_3_CURRENT_ADDRESS条目


2.NetAPI-2得到MAC (MSDN推荐方法)

#include <windows.h>
//#include <wincon.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

typedef struct _ASTAT_
{
  ADAPTER_STATUS adapt;
  NAME_BUFFER    NameBuff [30];
}ASTAT, * PASTAT;

ASTAT Adapter;

int main (void)
{
      NCB Ncb;
      UCHAR uRetCode;
      char NetName[50];
      LANA_ENUM  lenum;
      int      i;

      memset( &Ncb, 0, sizeof(Ncb) );
      b_command = NCBENUM;
      b_buffer = (UCHAR *)&lenum;
      b_length = sizeof(lenum);
      uRetCode = Netbios( &Ncb );
      printf( "The NCBENUM return code is: 0x%x \n", uRetCode );

      for(i=0; i < lenum.length ;i++)
麻将王      {
          memset( &Ncb, 0, sizeof(Ncb) );
          b_command = NCBRESET;
          b_lana_num = lenum.lana;

          uRetCode = Netbios( &Ncb );
          printf( "The NCBRESET on LANA %d return code is: 0x%x \n",
                  lenum.lana, uRetCode );

          memset( &Ncb, 0, sizeof (Ncb) );
          b_command = NCBASTAT;
          b_lana_num = lenum.lana;

          strcpy( b_callname,  "*              " );
          b_buffer = (char *) &Adapter;
          b_length = sizeof(Adapter);

          uRetCode = Netbios( &Ncb );
          printf( "The NCBASTAT on LANA %d return code is: 0x%x \n",
                  lenum.lana, uRetCode );
          if ( uRetCode == 0 )
            {
            printf( "The Ethernet Number on LANA %d is:%02x%02x%02x%02x%02x%02x\n",
                  lenum.lana,
                  Adapter.adapt.adapter_address[0],
                  Adapter.adapt.adapter_address[1],
                  Adapter.adapt.adapter_address[2],
                  Adapter.adapt.adapter_address[3],
                  Adapter.adapt.adapter_address[4],
                  Adapter.adapt.adapter_address[5] );
            }
        }


}

3.COM API获取网卡MAC地址
    这种方法使用COM API创建一个GUID(全局唯一标识符)并从那里继承MAC地址。
GUID通常用来标识COM组件以及系统中的其他对象。它们是由MAC地址(结合其他东西)计算得来的,表面上MAC地址就包含在其中。
我说表面上是因为事实上并没有包含。我提供这种方法更多的是为了作为反面教材。您也许用这种方法能够得到MAC地址,但
炎黄春秋网有时候您只会得到随机的十六进制数值。下面的例子十分简单,无需多讲。我们使用CoCreateGuid创建GUID,并将最后六个字节
放入字符串中。它们可能是MAC地址,但并不是必然的。

uuid.cpp
#include <windows.h>
#include <iostream>
#include <conio.h>

河南网通宽带using namespace std;

int main()
{
  cout << "MAC address is: ";
   
  // COM要求一个UUID。如果机器中有以太网卡,
  // UUID最后的六个字节(Data427字节)应该是本地以太网卡的MAC地址。
  GUID uuid;
  CoCreateGuid(&uuid);
  // Spit the address out
  char mac_addr[18];
  sprintf(mac_addr,"%02X:%02X:%02X:%02X:%02X:%02X",
  uuid.Data4[2],uuid.Data4[3],uuid.Data4[4],
  uuid.Data4[5],uuid.Data4[6],uuid.Data4[7]);
  cout << mac_addr << endl;
  getch();
  return 0;
}


4.NetAPI来获取网卡MAC地址

首先在头文件定义中加入#include "nb30.h"

#pragma comment(lib,"netapi32.lib")
typedef struct _ASTAT_
知识管理系统
{
  ADAPTER_STATUS adapt;
  NAME_BUFFER    NameBuff[30];
} ASTAT, * PASTAT;


就可以这样调用来获取远程网卡MAC地址了:

CString GetMacAddress(CString sNetBiosName)
{
    ASTAT Adapter;

    NCB ncb;
    UCHAR uRetCode;

    memset(&ncb, 0, sizeof(ncb));
    b_command = NCBRESET;
    b_lana_num = 0;

    uRetCode = Netbios(&ncb);

    memset(&ncb, 0, sizeof(ncb));
    b_command = NCBASTAT;
    b_lana_num = 0;

    sNetBiosName.MakeUpper();

    b_callname, NCBNAMSZ - 1, 0x20);

    strcpy((char *)b_callname, (LPCTSTR) sNetBiosName);


    b_callname[sNetBiosName.GetLength()] = 0x20;
    b_callname[NCBNAMSZ] = 0x0;

    b_buffer = (unsigned char *) &Adapter;
    b_length = sizeof(Adapter);

    uRetCode = Netbios(&ncb);
 
    CString sMacAddress;

    if (uRetCode == 0)
    {
        sMacAddress.Format(_T("%02x%02x%02x%02x%02x%02x"),
        Adapter.adapt.adapter_address[0],
            Adapter.adapt.adapter_address[1],
            Adapter.adapt.adapter_address[2],
            Adapter.adapt.adapter_address[3],
            Adapter.adapt.adapter_address[4],
            Adapter.adapt.adapter_address[5]);
    }
    return sMacAddress;
}

本文发布于:2024-09-23 15:27:06,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/233327.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:方法   网卡   得到   系统
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议