如何獲取網卡的物理地址?


從以前的帖子中得知我們原來所說的MAC地址是可以輕易的修改的。那么如果獲取網卡的物理地址呢?請大俠們能告知,小弟我非常感謝!!!

12 个解决方案

#1


注:一下信息由bohut(伯虎) ( ) 信譽:99 提供,嘿嘿

讀取網卡的MAC地址
---------------------------------------------------------------------------------
在實際的應用系統中,我們往往會需要在程序運行時獲取當前機器的網卡的MAC地址,以便作為某種標識之用,如控制程序的合法性等。下文介紹如何用Microsoft VisualC++ 6.0開發這樣的程序。 

這里采用的方法是通過Windows 9x/NT/Win2000中內置的NetApi32.DLL的功能來實現的。首先通過發送NCBENUM命令,獲取網卡的數目和每張網卡的內部編號,然后對每個網卡標號發送NCBASTAT命令獲取其MAC地址。注意:這里的網卡是指捆綁了NetBEIU協議的通信協議棧,可以在網卡的屬性處查看到。 

請運行VC++,打開一個新的工程,選擇創建一個Win32 Console程序,然后按下文輸入代碼,並請參見其中的注釋: 

#include "stdafx.h" 

#include <windows.h> 

#include <wincon.h> 

#include <stdlib.h> 

#include <stdio.h> 

#include <time.h> 

// 因為是通過NetAPI來獲取網卡信息,所以需要包含其題頭文件nb30.h 

#include <nb30.h> 

typedef struct _ASTAT_ 



ADAPTER_STATUS adapt; 

NAME_BUFFER 

NameBuff [30]; 

} ASTAT, * PASTAT; 

ASTAT Adapter; 

// 定義一個存放返回網卡信息的變量 

// 輸入參數:lana_num為網卡編號,一般地,從0開始,但在Windows 2000中並不一定是連續分配的 

void getmac_one (int lana_num) 



NCB ncb; 

UCHAR uRetCode; 

memset( &ncb, 0, sizeof(ncb) ); 

ncb.ncb_command = NCBRESET; 

ncb.ncb_lana_num = lana_num // 指定網卡號 

// 首先對選定的網卡發送一個NCBRESET命令,以便進行初始化 

uRetCode = Netbios( &ncb ); 

printf( "The NCBRESET return code is: 0x%x \n", uRetCode ); 

memset( &ncb, 0, sizeof(ncb) ); 

ncb.ncb_command = NCBASTAT; 

ncb.ncb_lana_num = lana_num; // 指定網卡號 

strcpy((char *)ncb.ncb_callname,"*" ); 

ncb.ncb_buffer = (unsigned char *) &Adapter; // 指定返回的信息存放的變量 

ncb.ncb_length = sizeof(Adapter); 

// 接着,可以發送NCBASTAT命令以獲取網卡的信息 

uRetCode = Netbios( &ncb ); 

printf( "The NCBASTAT return code is: 0x%x \n", uRetCode ); 

if ( uRetCode == 0 ) 



// 把網卡MAC地址格式化成常用的16進制形式,如0010-A4E4-5802 

printf( "The Ethernet Number[%d] is: %02X%02X-%02X%02X-%02X%02X\n", 

lana_num, 

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] ); 





int main(int argc, char* argv[]) 



NCB ncb; 

UCHAR uRetCode; 

LANA_ENUM lana_enum; 

memset( &ncb, 0, sizeof(ncb) ); 

ncb.ncb_command = NCBENUM; 

ncb.ncb_buffer = (unsigned char *) &lana_enum; 

ncb.ncb_length = sizeof(lana_enum); 

// 向網卡發送NCBENUM命令,以獲取當前機器的網卡信息,如有多少個網卡、每張網卡的編號等 

uRetCode = Netbios( &ncb ); 

printf( "The NCBENUM return code is: 0x%x \n", uRetCode ); 

if ( uRetCode == 0 ) 



printf( "Ethernet Count is : %d\n\n", lana_enum.length); 

// 對每一張網卡,以其網卡編號為輸入編號,獲取其MAC地址 

for ( int i=0; i<lana_enum.length; ++i) 

getmac_one( lana_enum.lana[i]); 



return 0; 



此時,按F7編譯,按F5運行即可。

#2


http://community.csdn.net/Expert/topic/3286/3286489.xml?temp=.6544611
轉醫生的。

#3


http://community.csdn.net/Expert/topic/2647/2647845.xml?temp=.3925745

#4


SendARP/GetAdapterInfo,所謂的修改也是修改注冊表SendARP的結果是正確的,如果修改了注冊表有可能GetAdapterInfo返回的結果不正確。

#5


http://community.csdn.net/Expert/topic/2843/2843100.xml?temp=.343136

#6


http://search.csdn.net/Expert/topic/958/958296.xml?temp=6.214541E-02

#7


我不是要獲取MAC地址,我要獲取物理地址。

#8


//我不是要獲取MAC地址,我要獲取物理地
呵呵,mac地址就是物理地址啊!!

#9


http://community.csdn.net/Expert/topic/3095/3095931.xml?temp=.4401514

#10


www.vckbase.com上有個例子

#11


樓主MAC地址難道不是物理地址嗎???!!還有比MAC更物理的?!!

#12


mac地址就是物理地址
是6個字節長的數值

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: