從以前的帖子中得知我們原來所說的MAC地址是可以輕易的修改的。那么如果獲取網卡的物理地址呢?請大俠們能告知,小弟我非常感謝!!!
12 个解决方案
注:一下信息由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運行即可。
http://community.csdn.net/Expert/topic/3286/3286489.xml?temp=.6544611
轉醫生的。
http://community.csdn.net/Expert/topic/2647/2647845.xml?temp=.3925745
SendARP/GetAdapterInfo,所謂的修改也是修改注冊表SendARP的結果是正確的,如果修改了注冊表有可能GetAdapterInfo返回的結果不正確。
http://community.csdn.net/Expert/topic/2843/2843100.xml?temp=.343136
http://search.csdn.net/Expert/topic/958/958296.xml?temp=6.214541E-02
//我不是要獲取MAC地址,我要獲取物理地
呵呵,mac地址就是物理地址啊!!
http://community.csdn.net/Expert/topic/3095/3095931.xml?temp=.4401514
樓主MAC地址難道不是物理地址嗎???!!還有比MAC更物理的?!!