记录一下VC通过GetAdaptersInfo获取网络连接信息的代码,注意已经禁用的网络连接无法通过该接口获取到。 而且获取到的连接不一定是物理网卡,可以通过读取对应的注册表项中的“PnpInstanceID”来判断,一般情况下如果是“PCI”或者“USB”开头的设备,可以认为是物理设备。 如果想获取禁用了的网络连接,可以尝试用WMI来获取,但用WMI仍然无法获取到禁用的网卡的MAC地址,据网上的资料描述是因为网卡被禁用后其驱动也被卸载、因此无法获取到MAC地址。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include <Windows.h> #include <iphlpapi.h>
#pragma comment(lib, "IPHLPAPI.lib")
int test() { PIP_ADAPTER_INFO pAdapterInfo; PIP_ADAPTER_INFO pAdapter = NULL; DWORD dwRetVal = 0;
pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO)); ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
if (ERROR_BUFFER_OVERFLOW == GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) { free(pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen); }
if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) { USES_CONVERSION;
pAdapter = pAdapterInfo; while (pAdapter) { CString strName = A2W(pAdapter->AdapterName);
wcout << strName.GetString() << endl;
/* //从注册表或者网卡的更多信息,尤其是可以通过PnpInstanceID判断是否是物理网卡 CString strRegPath; strRegPath.Format(_T("SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection"), strName);
CString strPnp = readRegValue(HKEY_LOCAL_MACHINE, strRegPath, _T("PnpInstanceID")); */
pAdapter = pAdapter->Next; }
free(pAdapterInfo); }
return 0; }
|