0%

VC GetAdaptersInfo获取网络连接信息

记录一下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;
}