没安装NetBEUI协议,不读注册表,怎么得到网卡的MAC地址? 用Netbios可以得到MAC地址,但必须要安装NetBEUI协议才行,如果机器只安装了TCP/IP协议,怎么得到MAC地址?不要告诉我去读注册表。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 IPHelper 可以得到MAC,不过要装平台SDK,自已定义头文件,用动态调用也行,IPhlpapi.DLL 98就有了。在MSDN里搜一下GetAdaptersInfo(得到本机的)和GetIpNetTable(得到缓冲区中其它计算机的)试试。这个论坛有相关代码,搜搜看。 谢谢iamshuke!还有别的办法吗? 运行命令ipconfig/all就可以看到mac地址 使用注册表:Win2000:1.在“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\4D36E972-E325-11CE-BFC1-08002BE10318\0000、0001、0002”等主键下, 因为你有可能安装了不止一块网卡,所以在这个主键下可能会有多个类似于“0000、0001”的主键,这时候你可以查找DriverDesc内容为你要修改的网卡的描述相吻合的主键,如“0000”。2.在上面提到的主键下,添一个字符串,名字为“NetworkAddress”,把它的值设为你要的MAC地址,要连续写如“001010101010”。3.然后到主键下“NDI\params”中添加一项“NetworkAddress”的主键值,在该主键下添加名为“default”的字符串,值写要设的MAC地址,要连续写,如“001010101010”。【注】实际上这只是设置在后面提到的高级属性中的“初始值”,实际使用的MAC地址还是取决于在第2点中提到的“NetworkAddress”参数,而且一旦设置后,以后高级属性中值就是“NetworkAddress”给出的值而非“default”给出的了。4.在“NetworkAddress”的主键下继续添加名为“ParamDesc”的字符串,其作用为指定“NetworkAddress”主键的描述,其值可为“MAC Address”(也可以随意设置,这只是个描述,无关紧要,这个值将会在你以后直接修改MAC地址的时候作为描述出现),这样重新启动一次以后打开网络邻居的属性,双击相应网卡项会发现有一个高级设置,其下存在MAC Address (就是你在前面设置的ParamDesc,如图(^29041103a^)1)的选项,这就是你在第二步里在注册表中加的新项“NetworkAddress”,以后只要在此修改MAC地址就可以了。5.关闭注册表编辑器,重新启动,你的网卡地址已经改好了。打开网络邻居的属性,双击相应网卡项会发现有一个MAC Address的高级设置项。用于直接修改MAC地址,而且不需要重新启动就可以实现MAC的随时更改。可以在GooGle里搜索一下"给网卡换张身份证"。 另附:我只有TCP/IP协议,为什么就可以用IPCONFIG/all来看IP和MAC。 请各位注意一下我的问题,即没装NetBEUI协议,只有TCP/IP协议,也不读注册表,怎么得到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; void main (void) { NCB Ncb; UCHAR uRetCode; char NetName[50]; LANA_ENUM lenum; int i; memset( &Ncb, 0, sizeof(Ncb) ); Ncb.ncb_command = NCBENUM; Ncb.ncb_buffer = (UCHAR *)&lenum; Ncb.ncb_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) ); Ncb.ncb_command = NCBRESET; Ncb.ncb_lana_num = lenum.lana[i]; uRetCode = Netbios( &Ncb ); printf( "The NCBRESET on LANA %d return code is: 0x%x \n", lenum.lana[i], uRetCode ); memset( &Ncb, 0, sizeof (Ncb) ); Ncb.ncb_command = NCBASTAT; Ncb.ncb_lana_num = lenum.lana[i]; strcpy( Ncb.ncb_callname, "* " ); Ncb.ncb_buffer = (char *) &Adapter; Ncb.ncb_length = sizeof(Adapter); uRetCode = Netbios( &Ncb ); printf( "The NCBASTAT on LANA %d return code is: 0x%x \n", lenum.lana[i], uRetCode ); if ( uRetCode == 0 ) { printf( "The Ethernet Number on LANA %d is: %02x%02x%02x%02x%02x%02x\n", lenum.lana[i], 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] ); } } } 注意记得加上下面的语句:#pragma comment (lib,"Netapi32.lib")或者在Project选项中加上Netapi32.lib库 不用装NETBUEI协议在VC console中运行一下就可以了具体解释,可以看看MSDN 可以通过发送ARP来获取网络中计算机的MAC地址,当然也包括自己的机器。自己去MSDN查查这个,我用过这个,绝对可行。ARPDWORD SendARP( IPAddr DestIP, // destination IP address IPAddr SrcIP, // IP address of sender PULONG pMacAddr, // returned physical address PULONG PhyAddrLen // length of returned physical addr.); IPHelper 可以得到MAC,不过要装平台SDK,使用sendarp函数,具体使用是通过一个ip地址,返回一个mac地址,可以得到局域网内所想知道的主机的mac地址 好像除了NETBIOS就只有用IP助手函数了。 关注其他的方法。 flash控件关闭或者销毁或者隐藏会出错的问题 在线求救:关于WebBrowser控件的问题 为什么我的DirectDraw不能绑定窗口 关于FTP服务器 什么地方有线程池的代码? 急!一个迷惘的问题 关于QQ的问题? 高级程序员水平考试成绩如何查旬啊!!!!!!!!!11 各位前辈,我的MSDN2001无法启动了,提示不能打开文件c:\program files\...\msdn100.col VS2008 MFC类向导不能正确加载 高手请进!!! 怎样才能使多文档最开始显示时,不显示文档?
ipconfig/all
就可以看到mac地址
Win2000:
1.在“HKEY_LOCAL_MACHINE\SYS
TEM\CurrentControlSet\Control\Class\4D36
E972-E325-11CE-BFC1-08002BE10318\0000、0001、0002”等主键下, 因为你有可能安装了不止一块网卡,所以在这个主键下可能会有多个类似于“0000、0001”的主键,这时候你可以查找DriverDesc内容为你要修改的网卡的描述相吻合的主键,如“0000”。
2.在上面提到的主键下,添一个字符串,名字为“NetworkAddress”,把它的值设为你要的MAC地址,要连续写如“001010101010”。
3.然后到主键下“NDI\params”中添加一项“NetworkAddress”的主键值,在该主键下添加名为“default”的字符串,值写要设的MAC地址,要连续写,如“001010101010”。
【注】实际上这只是设置在后面提到的高级属性中的“初始值”,实际使用的MAC地址还是取决于在第2点中提到的“NetworkAddress”参数,而且一旦设置后,以后高级属性中值就是“NetworkAddress”给出的值而非“default”给出的了。
4.在“NetworkAddress”的主键下继续添加名为“ParamDesc”的字符串,其作用为指定“NetworkAddress”主键的描述,其值可为“MAC Address”(也可以随意设置,这只是个描述,无关紧要,这个值将会在你以后直接修改MAC地址的时候作为描述出现),这样重新启动一次以后打开网络邻居的属性,双击相应网卡项会发现有一个高级设置,其下存在MAC Address (就是你在前面设置的ParamDesc,如图(^29041103a^)1)的选项,这就是你在第二步里在注册表中加的新项“NetworkAddress”,以后只要在此修改MAC地址就可以了。
5.关闭注册表编辑器,重新启动,你的网卡地址已经改好了。打开网络邻居的属性,双击相应网卡项会发现有一个MAC Address的高级设置项。用于直接修改MAC地址,而且不需要重新启动就可以实现MAC的随时更改。可以在GooGle里搜索一下"给网卡换张身份证"。
#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; void main (void)
{
NCB Ncb;
UCHAR uRetCode;
char NetName[50];
LANA_ENUM lenum;
int i; memset( &Ncb, 0, sizeof(Ncb) );
Ncb.ncb_command = NCBENUM;
Ncb.ncb_buffer = (UCHAR *)&lenum;
Ncb.ncb_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) );
Ncb.ncb_command = NCBRESET;
Ncb.ncb_lana_num = lenum.lana[i]; uRetCode = Netbios( &Ncb );
printf( "The NCBRESET on LANA %d return code is: 0x%x \n",
lenum.lana[i], uRetCode ); memset( &Ncb, 0, sizeof (Ncb) );
Ncb.ncb_command = NCBASTAT;
Ncb.ncb_lana_num = lenum.lana[i]; strcpy( Ncb.ncb_callname, "* " );
Ncb.ncb_buffer = (char *) &Adapter;
Ncb.ncb_length = sizeof(Adapter); uRetCode = Netbios( &Ncb );
printf( "The NCBASTAT on LANA %d return code is: 0x%x \n",
lenum.lana[i], uRetCode );
if ( uRetCode == 0 )
{
printf( "The Ethernet Number on LANA %d is:
%02x%02x%02x%02x%02x%02x\n",
lenum.lana[i],
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] );
}
} } 注意记得加上下面的语句:
#pragma comment (lib,"Netapi32.lib")
或者在Project选项中加上Netapi32.lib库
在VC console中运行一下就可以了具体解释,可以看看MSDN
自己去MSDN查查这个,我用过这个,绝对可行。
ARPDWORD SendARP(
IPAddr DestIP, // destination IP address
IPAddr SrcIP, // IP address of sender
PULONG pMacAddr, // returned physical address
PULONG PhyAddrLen // length of returned physical addr.
);