Замена PowerShell «get-netadapter» с использованием API C/C++C++

Программы на C++. Форум разработчиков
Anonymous
 Замена PowerShell «get-netadapter» с использованием API C/C++

Сообщение Anonymous »

Мне нужно получить GUID сетевого адаптера с учетом имени подключения, показанного сетевым менеджером Windows. Get-netadapter Powershell выполняет эту работу, но я бы хотел сделать это на C/C++. Я знаю, что есть два набора функций/методов API:
  • iphlpapi.h
    netlistmgr.h
Похоже, что оба делают часть работы. В частности, с помощью IEnumNetworks и связанных с ним классов мне удалось перечислить некоторые сети/адаптеры. Например, это результат get-netadapter:

Код: Выделить всё

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
My Tunnel                 TAP-Windows Adapter V9 #2                    40 Disconnected 00-FF-E6-0A-89-C6         1 Gbps
Ethernet 4                Intel(R) PRO/1000 MT Desktop Adapter #2      30 Up           08-00-27-95-74-A2         1 Gbps
Local Area Connection     TAP-Windows Adapter V9                       15 Disconnected 00-FF-CC-95-DA-46         1 Gbps
Ethernet 3                Intel(R) PRO/1000 MT Desktop Adapter          4 Up           08-00-27-AC-C1-5A         1 Gbps
Моя цель — получить объект адаптера «Мой туннель» (по крайней мере, ifIndex или GUID), но когда сеть не «подключена», я не получаю никакого адаптера. Вот моя «быстрая и грязная» тестовая программа (проверка ошибок, основная часть и включения опущены для ясности):

Код: Выделить всё

CoInitializeEx(NULL, COINITBASE_MULTITHREADED);

// get a network list manager object
INetworkListManager *mgr;
CoCreateInstance(CLSID_NetworkListManager, NULL, CLSCTX_ALL, IID_INetworkListManager, (LPVOID*)&mgr);

// get the enumerator for existing networks
IEnumNetworks *enn;
mgr->GetNetworks(NLM_ENUM_NETWORK_ALL, &enn);
for (;;) {
INetwork *net;
ULONG n = 0;
if (S_OK != enn->Next(1, &net, &n) || n < 1)
break;

// print the name of current network object
BSTR str;
net->GetName(&str); printf(" Name: %ws\n", str); SysFreeString(str);

// get the enumerator for network connections belonging to the current network
IEnumNetworkConnections *enc;
net->GetNetworkConnections(&enc);
INetworkConnection *nc;
for (;;) {
if (S_OK != enc->Next(1, &nc, &n))
break;
// explore the list of connections and print the adapter's GUID
nc->GetAdapterId(&g);
printf(" Adapter: {%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\n",
g.Data1, g.Data2, g.Data3, g.Data4[0], g.Data4[1], g.Data4[2],
g.Data4[3], g.Data4[4], g.Data4[5], g.Data4[6], g.Data4[7]);
}
}
Вот что я получаю:

Код: Выделить всё

 Name: Network
Name: Local Area Connection
Name: mygroup.net
Adapter: {e1b4e605-c6ee-4f03-b4c6-0d879a27669b}
Name: My Tunnel
Name: Unidentified network
Adapter: {12d9ae29-7863-414f-b195-e1230d8c697b}
Похоже, что «Мой туннель» не имеет адаптера, хотя PowerShell может его получить.
Адаптер появляется только после того, как я установил соединение (в данном случае VPN). случай).
Как я могу получить адаптеры так же, как это делает PowerShell?
ПРИМЕЧАНИЕ: мне нужна возможность получить сетевой адаптер по имени сети. С помощью iphlpapi я могу получить другую информацию (например, InterfaceDescription), но не имя сети. Похоже, что «имя сети» не является частью «основной сети» Windows, а представляет собой своего рода уровень управления. Итак, единственное решение, которое я нашел сейчас, это CreateProcess("powershell.exe",...)... хм...

Подробнее здесь: https://stackoverflow.com/questions/789 ... g-c-c-apis

Вернуться в «C++»