取得系统中网卡MAC地址的三种方法
怎么查看电脑网卡的mac地址

怎么查看电脑网卡的mac地址怎么查看电脑网卡的mac地址导语:通常直接查看本地连接状态里面就可以看到MAC地址和IP 地址。
以下是小编分享的有关电脑网络知识,希望对您有所帮助。
怎么查看电脑网卡的MAC地址?方法一:通过命令行查看电脑网卡的MAC地址1、点击开始 > 运行 > 输入:cmd > 回车(或点击确定)。
2、在弹出的命令提示符窗口中输入“ipconfig /all”并回车。
(注:ipconfig 命令为查看IP配置信息,参数“all”表示查看所有网卡的全部配置信息)3、在出现的所有网卡的全部配置信息中,找到本地连接中的“Physical Address(物理地址)”所对应的就是我们所要的MAC地址。
方法二:通过查看本地连接状态查看电脑网卡的MAC地址1、右键网上邻居选择“属性”(PS:WIN7系统以上的好像还要点击“更改适配器设置”才能看到本地连接),接着右键“本地连接”选择“状态”。
2、在出现的“本地连接状态”框中点击“支持”>“详细信息”就可以直接看到电脑的MAC地址了。
(PS:WIN7以上系统好像是没有“支持”选项,“详细信息”按钮是在“常规”选项中。
) 如何设置无线MAC地址过滤?无线MAC地址过滤应用介绍无线MAC地址过滤功能,就是允许或禁止指定的终端(MAC地址)连接无线信号,实际上就是连接信号权限的`黑白名单设置。
现在万.能.钥.匙等无线蹭网软件的使用,可能会导致无线密码泄露,网络被蹭,MAC地址过滤是非常有效的防范方法。
本文介绍无线MAC地址过滤的设置方法。
注意:迅捷(FAST)新界面的设备只能禁止特定终端连接信号。
无线MAC地址过滤设置方法设置前请务必确认终端的MAC地址(MAC地址如何确认?)1.选择过滤规则登录路由器管理界面,点击“无线设置”>“无线MAC地址过滤”,过滤规则选择“允许列表中生效的MAC地址访问本无线网络”。
2.添加MAC地址过滤条目点击“添加新条目”,填写手机MAC允许条目。
如何查看电脑网卡的MAC地址

如何查看电脑网卡的MAC地址
1.windows XP 操作系统和windows 2000 、windows 2003系统查看MAC地址方法。
1)使用命令行方式:
在开始菜单运行中输入命令cmd,如图
确定后进入DOS界面。
在DOS界面下输入ipconfig/all命令,如图
回车后即可看到电脑网卡的MAC地址,如图
需要注意的是,因现在的电脑有些包含无线网卡,无线网卡同样具有MAC地址,请仔细查看上方适配器名称,一般为本地连接。
2)使用可视化操作方式:
如果你的电脑在电脑右下角有如下图红框中本地连接状态图标的显示,
双击该图标,然后选择下图中红框选择的“详细信息”按钮
然后看到如下图中红框所示实际地址即为电脑网卡的MAC地址。
2.windows VISTA和windows 7 操作系统查看MAC地址方法:
1)命令行方式:
在开始菜单
中输入命令cmd
在如图所示程序中的cmd图标上单击鼠标右键选择以管理员身份运行
其余步骤如同windowsXP系统下一样进行操作。
2)可视化操作方式
以windows 7为例,开始菜单,控制面板,网络和Internet下的查看网络状态和任务
鼠标左键单击如图红框所示本地连接
即可查看到电脑网卡的MAC地址。
电脑上网卡MAC地址查看方法

电脑上网卡MAC地址查看方法在计算机网络中,每个网卡都有一种唯一的标识符,称为MAC地址(Media Access Control Address),它由12个十六进制数字组成,通常以“冒号”或“短划线”分隔为六个组。
MAC地址是一个网卡在工厂生产时分配的,无法更改的硬件地址。
在Windows、Mac和Linux等操作系统中,我们可以通过不同的方法来查看电脑上网卡的MAC地址。
下面将介绍Windows、Mac和Linux操作系统中查看MAC地址的方法。
在Windows操作系统中,有几种方法可以查看MAC地址:方法一:使用命令提示符(CMD)1.打开“开始”菜单,点击“运行”。
2. 输入“cmd”并按下回车键,打开命令提示符窗口。
3. 在命令提示符窗口中,输入“ipconfig /all”命令并按下回车键。
方法二:使用控制面板1.打开“开始”菜单,并点击“控制面板”。
2. 在控制面板窗口中,选择“网络和Internet”。
3. 在“网络和Internet”窗口中,点击“网络和共享中心”。
4.在“网络和共享中心”窗口中,点击左侧的“更改适配器设置”。
5.在“更改适配器设置”窗口中,找到你所使用的网络适配器,右键点击,并选择“状态”。
6.在网络适配器状态窗口中,点击“详细信息”按钮。
在Mac操作系统中,可以通过以下方法查看MAC地址:方法一:使用“系统偏好设置”1.点击屏幕左上角的苹果图标,选择“系统偏好设置”。
2.在“系统偏好设置”窗口中,点击“网络”。
3.在网络设置窗口中,选择你所使用的网络连接方式(如Wi-Fi)。
方法二:使用“终端”命令行1. 打开“Launchpad”(即启动台),选择“其他”文件夹。
2.打开“终端”应用程序。
3. 在终端窗口中,输入“ifconfig ,grep 'ether'”命令,并按下回车键。
4. 在命令输出中,可以找到以“ether”开头的行,紧跟着的就是你的MAC地址。
如何查看电脑网卡的MAC地址

如何查看电脑网卡的MAC地址电脑网卡的MAC地址是硬件设备的唯一标识符,用于在局域网中识别和连接设备。
在一些情况下,您可能需要查看电脑的网卡MAC地址,以便进行网络配置或故障排除。
在本文中,我们将介绍几种不同的方法来查看电脑网卡的MAC地址。
1. 使用命令提示符(Windows)-打开“命令提示符”应用程序。
您可以在开始菜单中“命令提示符”。
- 输入“ipconfig /all”并按下回车键。
此命令将显示计算机上的所有网络适配器的详细信息。
-查找以太网适配器或无线局域网适配器的“物理地址”项。
该项旁边的数值就是MAC地址。
2. 使用PowerShell(Windows)- 打开“PowerShell”应用程序。
您可以在开始菜单中“PowerShell”。
- 输入“Get-NetAdapter”并按下回车键。
这会显示计算机上的所有网络适配器的列表。
- 查找以太网适配器或无线局域网适配器的“MacAddress”项。
该项的值是MAC地址。
3. 使用系统偏好设置(Mac)-点击屏幕上方的“苹果”图标,并选择“系统偏好设置”。
-在系统偏好设置窗口中,点击“网络”。
-在网络设置窗口中,选择左侧的网络适配器(例如以太网或Wi-Fi)。
-点击右侧的“高级”按钮。
-在高级设置窗口的“硬件”选项卡中,您可以找到“MAC地址”。
该项的数值就是MAC地址。
4. 使用ifconfig命令(Linux)- 打开终端应用程序。
在大多数Linux发行版中,您可以在应用菜单中找到终端。
- 输入“ifconfig”并按下回车键。
该命令会显示所有网络接口的详细信息。
- 查找以太网适配器或无线局域网适配器的“HWaddr”项。
该项后的数值就是MAC地址。
5. 使用ip命令(Linux)-打开终端应用程序。
- 输入“ip link show”并按下回车键。
该命令将显示计算机上的所有网络接口的信息。
- 查找以太网适配器或无线局域网适配器的“link/ether”项。
MAC地址查询

各操作系统查询网卡MAC地址方法MAC地址是网卡的物理地址,例如:00-19-21-C4-BA-DB。
MAC地址就是网卡的身份证号码,具有全球唯一性。
Windows XP系统查询MAC地址方法:点击桌面左下角的“开始”按钮——“运行”——输入cmd后点击“确定”(如图1)弹出一个窗口,输入ipconfig/all,然后回车(如图2)。
有线网卡MAC:“Ethernet adapter 本地连接”中的“Physical Address”,Physical Address后面的内容就是有线网卡的MAC地址,例如图2中的MAC地址是00-19-21-C4-BA-DB;无线网卡MAC:“Ethernet adapter无线网络连接”中的“Physical Address”,Physical Address后面的内容就是无线网卡的MAC地址。
图1图2Windows VISTA、Windows 7系统查询MAC地址方法:点击桌面左下角的“开始”按钮——在“所有程序”下有一个文本框,在里面输入cmd,然后按回车键打开一个窗口,在此窗口中输入ipconfig/all,按回车键,找到“以太网适配器本地连接”中的“物理地址”,物理地址后面是有线网卡的MAC地址;找到“无线局域网适配器无线网络连接”中的“物理地址”,物理地址后面就是无线网卡的MAC地址。
苹果系统查询MAC地址方法点击桌面左上角的“苹果”图标,选择“系统偏好设置”,这时会打开一个窗口,点击“网络”,在打开的窗口中点击“以太网”——“高级”——“以太网”,找到“以太网ID”,以太网ID后面的内容就是有线网卡的MAC地址。
点击取消回到之前的窗口,点击“Airport”——“高级”——“AirPort ID”,AirPort ID后面就是无线网卡的MAC地址。
如何获取网卡的MAC地址

如何获取网卡的MAC地址获取网卡的MAC地址可以通过以下几种方法:1.使用操作系统提供的命令行工具:不同的操作系统提供了不同的命令行工具来获取网卡的MAC地址。
下面分别介绍Windows和Linux操作系统下的方法。
- Windows操作系统:在命令提示符或PowerShell中输入"ipconfig /all"命令,会列出所有网络接口的详细信息,包括MAC地址。
- Linux操作系统:在终端中输入"ifconfig"命令,会列出所有网络接口的详细信息,包括MAC地址。
2.使用编程语言获取:可以使用各种编程语言(如Python、Java、C++等)提供的网络编程库来获取网卡的MAC地址。
下面以Python为例,演示如何通过编程获取网卡的MAC地址:```pythonimport subprocessimport redef get_mac_address(:result = subprocess.run(["ipconfig", "/all"],capture_output=True, text=True)output = result.stdoutmac_pattern = r"Physical Address[ .]*: (.*)"mac_address = re.findall(mac_pattern, output)[0].replace("-", ":")return mac_addressmac = get_mac_addressprint(mac)```这段代码通过执行"ipconfig /all"命令,并使用正则表达式匹配输出中的MAC地址,最终返回网卡的MAC地址。
3.使用网络管理工具:可以使用一些网络管理工具来获取网卡的MAC地址,这些工具通常提供了更丰富的功能和更友好的界面,比如Wireshark、NetCut等。
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_STA TS,OID_802_3_PERMANENT_ADDRESS/OID_802_3_CURRENT_ADDRESS...)具体的情况可以参看ddk下的OID_802_3_CURRENT_ADDRESS条目API-2得到MAC (MSDN推荐方法)#include <windows.h>//#include <wincon.h>#include <stdlib.h>#include <stdio.h>#include <time.h>typedef struct _ASTA T_{ADAPTER_STA TUS adapt;NAME_BUFFER NameBuff [30];}ASTA T, * PASTA T;ASTA T Adapter;int 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 = na;uRetCode = Netbios( &Ncb );printf( "The NCBRESET on LANA %d return code is: 0x%x \n",na, uRetCode );memset( &Ncb, 0, sizeof (Ncb) );Ncb.ncb_command = NCBASTA T;Ncb.ncb_lana_num = na;strcpy( Ncb.ncb_callname, "* " );Ncb.ncb_buffer = (char *) &Adapter;Ncb.ncb_length = sizeof(Adapter);uRetCode = Netbios( &Ncb );printf( "The NCBASTA T on LANA %d return code is: 0x%x \n",na, uRetCode );if ( uRetCode == 0 ){printf( "The Ethernet Number on LANA %d is:%02x%02x%02x%02x%02x%02x\n",na,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地址。
获取mac地址的几种方法

获取mac地址的⼏种⽅法⽅法⼀:通过NetBIOS[Netbios is not supported on Windows Vista, Windows Server 2008, and subsequent versions of the operating system] #include#pragma comment(lib, "Netapi32.lib")namespace{bool GetAdapterInfo(int adapterNum, std::string& macOUT){NCB Ncb;memset(&Ncb, 0, sizeof(Ncb));Ncb.ncb_command = NCBRESET; // 重置⽹卡,以便我们可以查询Ncb.ncb_lana_num = adapterNum;if (Netbios(&Ncb) != NRC_GOODRET)return false;// 准备取得接⼝卡的状态块memset(&Ncb, sizeof(Ncb), 0);Ncb.ncb_command = NCBASTAT;Ncb.ncb_lana_num = adapterNum;strcpy((char *) Ncb.ncb_callname, "*");struct ASTAT{ADAPTER_STATUS adapt;NAME_BUFFER nameBuff[30];}adapter;memset(&adapter,sizeof(adapter), 0);Ncb.ncb_buffer = (unsigned char *)&adapter;Ncb.ncb_length = sizeof(adapter);if (Netbios(&Ncb) != 0)return false;char acMAC[32];sprintf(acMAC, "%02X-%02X-%02X-%02X-%02X-%02X",int (adapter.adapt.adapter_address[0]),int (adapter.adapt.adapter_address[1]),int (adapter.adapt.adapter_address[2]),int (adapter.adapt.adapter_address[3]),int (adapter.adapt.adapter_address[4]),int (adapter.adapt.adapter_address[5]));macOUT = acMAC;return true;}}bool GetMacByNetBIOS(std::string& macOUT){// 取得⽹卡列表LANA_ENUM adapterList;NCB Ncb;memset(&Ncb, 0, sizeof(NCB));Ncb.ncb_command = NCBENUM;Ncb.ncb_buffer = (unsigned char *)&adapterList;Ncb.ncb_length = sizeof(adapterList);Netbios(&Ncb);// 取得MACfor (int i = 0; i < adapterList.length; ++i){if (GetAdapterInfo(/doc/ef0e8e59915f804d2a16c13b.html na[i], macOUT)) return true;}return false;}参考:取得系统中⽹卡MAC地址的三种⽅法⽅法⼆:通过对控制台ipconfig /all命令重定向#include#includenamespace{#if 0/// @brief 采⽤字符串查找来提取MAC地址/// @remark 该⽅法有很⼤局限性,并不是所有OS返回的MAC地址前导字符串都是/// "Physical Address. . . . . . . . . : "bool ParseMac(const std::string& str, std::string& macOUT){static const std::string beginMarkOfMAC("Physical Address. . . . . . . . . : ");static const std::string endMarkOfMAC("\r\n");size_t begin = str.find(beginMarkOfMAC);if(begin != std::string::npos){begin += beginMarkOfMAC.size();size_t end = str.find(endMarkOfMAC, begin);if(end != std::string::npos){macOUT = str.substr(begin, end - begin - 1);return true;}}return false;}#else/// @brief 采⽤boost::regex来提取MACbool ParseMac(const std::string& str, std::string& macOUT){const static boost::regex expression("([0-9a-fA-F]{2})-([0-9a-fA-F]{2})-([0-9a-fA-F]{2})-([0-9a-fA-F]{2})-([0-9a-fA-F]{2})-([0-9a-f A-F]{2})", boost::regex::perl | boost::regex::icase);boost::cmatch what;if(boost::regex_search(str.c_str(), what, expression)){macOUT = what[1] + "-" + what[2] + "-" + what[3] + "-" + what[4] + "-" + what[5] + "-" +what[6];return true;}return false;}#endif}bool GetMacByCmd(std::string& macOUT){bool ret = false;//初始化返回MAC地址缓冲区SECURITY_ATTRIBUTES sa;sa.nLength = sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDescriptor = NULL;sa.bInheritHandle = TRUE;//创建管道HANDLE hReadPipe,hWritePipe;if(CreatePipe(&hReadPipe, &hWritePipe, &sa, 0) == TRUE){//控制命令⾏窗⼝信息STARTUPINFO si;//返回进程信息PROCESS_INFORMATION pi;si.cb = sizeof(STARTUPINFO);GetStartupInfo(&si);si.hStdError = hWritePipe;si.hStdOutput = hWritePipe;si.wShowWindow = SW_HIDE; //隐藏命令⾏窗⼝si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;//创建获取命令⾏进程if (CreateProcess(NULL, "ipconfig /all", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi) == TRUE){WaitForSingleObject(pi.hProcess, 3000); // 设置超时时间,防⽌Vista、Win7等操作系统卡死unsigned long count; CloseHandle(hWritePipe);std::string strBuffer(1024 * 10, '\0'); // 准备⾜够⼤的缓冲区if(ReadFile(hReadPipe, const_cast(strBuffer.data()), strBuffer.size() - 1, &count, 0) == TRUE){strBuffer.resize(strBuffer.find_first_of('\0')); // 截掉缓冲区后⾯多余的'\0'ret = ParseMac(strBuffer, macOUT);//提取MAC地址串}CloseHandle(pi.hThread);CloseHandle(pi.hProcess);}CloseHandle(hWritePipe); // VS2010下调试,此处会有“An invalid handle was specified”的中断,直接运⾏正常,原因未知。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
取得系统中网卡MAC地址的三种方法第一种方法使用Microsoft的Netbios API。
这是一套通过Winsock提供底层网络支持的命令。
使用Netbios的最大缺点是您必须在系统中安装了Netbios 服务(如果您在windows网络中启用了文件共享的话,这就不是问题了)。
除此此外,这种方法又快又准确。
Netbios API只包括了一个函数,就叫做Netbios。
这个函数使用网络控制块(network control block)结构作为参数,这个结构告诉函数要做什么。
结构的定义如下:typedef struct _NCB {UCHAR ncb_command;UCHAR ncb_retcode;UCHAR ncb_lsn;UCHAR ncb_num;PUCHAR ncb_buffer;WORD ncb_length;UCHAR ncb_callname[NCBNAMSZ];UCHAR ncb_name[NCBNAMSZ];UCHAR ncb_rto;UCHAR ncb_sto;void (CALLBACK *ncb_post) (struct _NCB *);UCHAR ncb_lana_num;UCHAR ncb_cmd_cplt;#ifdef _WIN64UCHAR ncb_reserve[18];#elseUCHAR ncb_reserve[10];#endifHANDLE ncb_event;} NCB, *PNCB;重点在于ncb_command 成员。
这个成员告诉Netbios该作什么。
我们使用三个命令来探测MAC地址。
他们在MSDN的定义如下:命令描述:NCBENUM Windows NT/2000: 列举系统中网卡的数量。
使用此命令后,ncb_buffer 成员指向由LANA_ENUM结构填充的缓冲区。
NCBENUM 不是标准的 NetBIOS 3.0 命令。
NCBRESET 重置网卡。
网卡在接受新的NCB命令之前必须重置。
NCBASTAT 接受本地或远程接口卡的状态。
使用此命令后,ncb_buffer成员指向由ADAPTER_STATUS结构填充的缓冲区,随后是NAME_BUFFER结构的数组。
下面就是取得您系统MAC地址的步骤:1》列举所有的接口卡。
2》重置每块卡以取得它的正确信息。
3》查询接口卡,取得MAC地址并生成标准的冒号分隔格式。
下面就是实例源程序。
netbios.cpp#include <windows.h>#include <stdlib.h>#include <stdio.h>#include <iostream>#include <string>using namespace std;#define bzero(thing,sz) memset(thing,0,sz)bool GetAdapterInfo(int adapter_num, string &mac_addr) {// 重置网卡,以便我们可以查询NCB Ncb;memset(&Ncb, 0, sizeof(Ncb));Ncb.ncb_command = NCBRESET;Ncb.ncb_lana_num = adapter_num;if (Netbios(&Ncb) != NRC_GOODRET) {mac_addr = "bad (NCBRESET): ";mac_addr += string(Ncb.ncb_retcode);return false;}// 准备取得接口卡的状态块bzero(&Ncb,sizeof(Ncb);Ncb.ncb_command = NCBASTAT;Ncb.ncb_lana_num = adapter_num;strcpy((char *) Ncb.ncb_callname, "*");struct ASTAT{ADAPTER_STATUS adapt;NAME_BUFFER NameBuff[30];} Adapter;bzero(&Adapter,sizeof(Adapter));Ncb.ncb_buffer = (unsigned char *)&Adapter;Ncb.ncb_length = sizeof(Adapter);// 取得网卡的信息,并且如果网卡正常工作的话,返回标准的冒号分隔格式。
if (Netbios(&Ncb) == 0){char acMAC[18];sprintf(acMAC, "%02X:%02X:%02X:%02X:%02X:%02X",int (Adapter.adapt.adapter_address[0]),int (Adapter.adapt.adapter_address[1]),int (Adapter.adapt.adapter_address[2]),int (Adapter.adapt.adapter_address[3]),int (Adapter.adapt.adapter_address[4]),int (Adapter.adapt.adapter_address[5]));mac_addr = acMAC;return true;}else{mac_addr = "bad (NCBASTAT): ";mac_addr += string(Ncb.ncb_retcode);return false;}}int main(){// 取得网卡列表LANA_ENUM AdapterList;NCB Ncb;memset(&Ncb, 0, sizeof(NCB));Ncb.ncb_command = NCBENUM;Ncb.ncb_buffer = (unsigned char *)&AdapterList;Ncb.ncb_length = sizeof(AdapterList);Netbios(&Ncb);// 取得本地以太网卡的地址string mac_addr;for (int i = 0; i < AdapterList.length - 1; ++i){if (GetAdapterInfo(na[i], mac_addr)){cout << "Adapter " << int (na[i]) <<"'s MAC is " << mac_addr << endl;}else{cerr << "Failed to get MAC address! Do you" << endl;cerr << "have the NetBIOS protocol installed?" << endl;break;}}return 0;}file://---------------------------------------------------------------------------第二种方法-使用COM GUID API这种方法使用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最后的六个字节(Data4的2-7字节)应该是本地以太网卡的MAC 地址。
GUID uuid;CoCreateGuid(&uuid);// Spit the address outchar 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;}第三种方法-使用SNMP扩展API我要讨论的第三种方法是使用Windows的SNMP(简单网络管理协议)扩展来取得MAC地址。
在我的经验里,这个协议很简单。
代码也是直勾勾的向前的。
基本步骤和Netbios相同:1》取得网卡列表2》查询每块卡的类型和MAC地址3》保存当前网卡我个人对SNMP了解不多,但如我刚刚所言,代码十分清楚。
snmp.cpp#include <snmp.h>#include <conio.h>#include <stdio.h>typedef bool(WINAPI * pSnmpExtensionInit) (IN DWORD dwTimeZeroReference,OUT HANDLE * hPollForTrapEvent,OUT AsnObjectIdentifier * supportedView);typedef bool(WINAPI * pSnmpExtensionTrap) (OUT AsnObjectIdentifier * enterprise,OUT AsnInteger * genericTrap,OUT AsnInteger * specificTrap,OUT AsnTimeticks * timeStamp,OUT RFC1157VarBindList * variableBindings);typedef bool(WINAPI * pSnmpExtensionQuery) (IN BYTE requestType,IN OUT RFC1157VarBindList * variableBindings,OUT AsnInteger * errorStatus,OUT AsnInteger * errorIndex);typedef bool(WINAPI * pSnmpExtensionInitEx) (OUT AsnObjectIdentifier * supportedView);void main(){HINSTANCE m_hInst;pSnmpExtensionInit m_Init;pSnmpExtensionInitEx m_InitEx;pSnmpExtensionQuery m_Query;pSnmpExtensionTrap m_Trap;HANDLE PollForTrapEvent;AsnObjectIdentifier SupportedView;UINT OID_ifEntryType[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 3};UINT OID_ifEntryNum[] = {1, 3, 6, 1, 2, 1, 2, 1};UINT OID_ipMACEntAddr[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 6};AsnObjectIdentifier MIB_ifMACEntAddr ={ sizeof(OID_ipMACEntAddr) sizeof(UINT), OID_ipMACEntAddr }; AsnObjectIdentifier MIB_ifEntryType ={sizeof(OID_ifEntryType) sizeof(UINT), OID_ifEntryType};AsnObjectIdentifier MIB_ifEntryNum ={sizeof(OID_ifEntryNum) sizeof(UINT), OID_ifEntryNum};RFC1157VarBindList varBindList;RFC1157VarBind varBind[2];AsnInteger errorStatus;AsnInteger errorIndex;AsnObjectIdentifier MIB_NULL = {0, 0};int ret;int dtmp;int i = 0, j = 0;bool found = false;char TempEthernet[13];m_Init = NULL;m_InitEx = NULL;m_Query = NULL;m_Trap = NULL;/* 载入SNMP DLL并取得实例句柄 */m_hInst = LoadLibrary("inetmib1.dll");if (m_hInst < (HINSTANCE) HINSTANCE_ERROR){m_hInst = NULL;return;}m_Init =(pSnmpExtensionInit) GetProcAddress(m_hInst, "SnmpExtensionInit");m_InitEx =(pSnmpExtensionInitEx) GetProcAddress(m_hInst,"SnmpExtensionInitEx");m_Query =(pSnmpExtensionQuery) GetProcAddress(m_hInst,"SnmpExtensionQuery");m_Trap =(pSnmpExtensionTrap) GetProcAddress(m_hInst, "SnmpExtensionTrap");m_Init(GetTickCount(), &PollForTrapEvent, &SupportedView);/* 初始化用来接收m_Query查询结果的变量列表 */varBindList.list = varBind;varBind[0].name = MIB_NULL;varBind[1].name = MIB_NULL;/* 在OID中拷贝并查找接口表中的入口数量 */varBindList.len = 1; /* Only retrieving one item */ SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryNum);ret =m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,&errorIndex);printf("# of adapters in this system : %in",varBind[0].value.asnValue.number);varBindList.len = 2;/* 拷贝OID的ifType-接口类型 */SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryType);/* 拷贝OID的ifPhysAddress-物理地址 */SNMP_oidcpy(&varBind[1].name, &MIB_ifMACEntAddr);do{/* 提交查询,结果将载入 varBindList。