获取 Mac 地址一般在软件创建注册表信息有相当大的用处. 原因是 Mac 地址通常是计算机唯一的物理地址.
利用这些信息, 我们可以通过加密 Mac 地址进行程序加密包含等等...
下给两个例子 - 如何获取 Mac 信息:
例子一:
- #include "winsock.h"
- #include "stdio.h"
- #include <IPHlpApi.h>
- #pragma comment(lib,"Iphlpapi.lib")
- int main(void)
- {
- PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();// PIP_ADAPTER_INFO 结构体指针存储本机网卡信息
- unsigned long stSize = sizeof(IP_ADAPTER_INFO);// 得到结构体大小, 用于 GetAdaptersInfo 参数
- int netCardNum = 0;// 记录网卡数量
- int IPnumPerNetCard = 0; // 记录每张网卡上的 IP 地址数量
- // 调用 GetAdaptersInfo 函数, 填充 pIpAdapterInfo 指针变量; 其中 stSize 参数既是一个输入量也是一个输出量
- int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
- if (ERROR_BUFFER_OVERFLOW == nRel)
- {
- /* 如果函数返回的是 ERROR_BUFFER_OVERFLOW
- 则说明 GetAdaptersInfo 参数传递的内存空间不够, 同时其传出 stSize, 表示需要的空间大小
- 这也是说明为什么 stSize 既是一个输入量也是一个输出量
- 释放原来的内存空间 */
- delete pIpAdapterInfo;
- pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize]; // 重新申请内存空间用来存储所有网卡信息
- nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);// 再次调用 GetAdaptersInfo 函数, 填充 pIpAdapterInfo 指针变量
- }
- if (ERROR_SUCCESS == nRel)
- {
- while (pIpAdapterInfo)
- {
- printf("\n┌────────────Num.%d────────────┐\n", ++netCardNum);
- printf("│Name:%s\n", pIpAdapterInfo->AdapterName);
- printf("│Desc:%s\n", pIpAdapterInfo->Description);
- switch (pIpAdapterInfo->Type)
- {
- case MIB_IF_TYPE_OTHER:
- printf("│Type:OTHER\n");
- break;
- case MIB_IF_TYPE_ETHERNET:
- printf("│Type:ETHERNET\n");
- break;
- case MIB_IF_TYPE_TOKENRING:
- printf("│Type:TOKENRING\n");
- break;
- case MIB_IF_TYPE_FDDI:
- printf("│Type:FDDI\n");
- break;
- case MIB_IF_TYPE_PPP:
- printf("│Type:PPP\n");
- break;
- case MIB_IF_TYPE_LOOPBACK:
- printf("│Type:LOOPBACK\n");
- break;
- case MIB_IF_TYPE_SLIP:
- printf("│Type:SLIP\n");
- break;
- default:
- break;
- }
- printf("│MAC:");
- for (DWORD i = 0; i <pIpAdapterInfo->AddressLength; i++)
- {
- if (i <pIpAdapterInfo->AddressLength - 1)
- {
- printf("%02X:", pIpAdapterInfo->Address[i]);
- }
- else
- {
- printf("%02X\n", pIpAdapterInfo->Address[i]);
- }
- }
- // 可能网卡有多 IP, 因此通过循环去判断
- IP_ADDR_STRING *pIpAddrString = &(pIpAdapterInfo->IpAddressList);
- do
- {
- printf("│IP:%s\n", pIpAddrString->IpAddress.String);
- printf("│MASK:%s\n", pIpAddrString->IpMask.String);
- printf("│Gate:%s\n", pIpAdapterInfo->GatewayList.IpAddress.String);
- pIpAddrString = pIpAddrString->Next;
- } while (pIpAddrString);
- pIpAdapterInfo = pIpAdapterInfo->Next;
- printf("└──────────────────────────┘\n");
- }
- }
- // 释放内存空间
- if (pIpAdapterInfo)
- {
- delete pIpAdapterInfo;
- }
- getchar();
- return 0;
- }
运行:
例子二:
- // MacAddress.cpp : Defines the entry point for the console application.
- //
- #include <Windows.h>
- #include <wincon.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include <time.h>
- #include <Nb30.h>
- #pragma comment(lib,"netapi32.lib")
- int GetMac(char * Mac)
- {
- NCB ncb;
- typedef struct _ASTAT_
- {
- ADAPTER_STATUS adapt;
- NAME_BUFFER NameBuff[30];
- }ASTAT, *PASTAT;
- ASTAT Adapter;
- typedef struct _LANA_ENUM
- {
- UCHAR length;
- UCHAR lana[MAX_LANA];
- }LANA_ENUM;
- LANA_ENUM lana_enum;
- UCHAR uRetCode;
- memset(&ncb, 0, sizeof(ncb));
- memset(&lana_enum, 0, sizeof(lana_enum));
- ncb.ncb_command = NCBENUM;
- ncb.ncb_buffer = (unsigned char *)&lana_enum;
- ncb.ncb_length = sizeof(LANA_ENUM);
- uRetCode = Netbios(&ncb);
- if (uRetCode != NRC_GOODRET)
- return uRetCode;
- for (int lana = 0; lana<lana_enum.length; lana++)
- {
- ncb.ncb_command = NCBRESET;
- ncb.ncb_lana_num = lana_enum.lana[lana];
- uRetCode = Netbios(&ncb);
- if (uRetCode == NRC_GOODRET)
- break;
- }
- if (uRetCode != NRC_GOODRET)
- return uRetCode;
- memset(&ncb, 0, sizeof(ncb));
- ncb.ncb_command = NCBASTAT;
- ncb.ncb_lana_num = lana_enum.lana[0];
- strcpy((char*)ncb.ncb_callname, "*");
- ncb.ncb_buffer = (unsigned char *)&Adapter;
- ncb.ncb_length = sizeof(Adapter);
- uRetCode = Netbios(&ncb);
- if (uRetCode != NRC_GOODRET)
- return uRetCode;
- sprintf(Mac, "%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 0;
- }
- int main(int argc, char* argv[])
- {
- char Mac[18];
- GetMac(Mac);
- printf("The Mac Address is : %s \n", Mac);
- system("pause");
- return 0;
- }
运行:
谢谢.
来源: http://www.bubuko.com/infodetail-3253815.html