如何从Windows应用程序检测禁用的networking接口连接?

我想知道什么时候一个接口已被禁用。

如果我进入Windowspipe理器并禁用其中一个启用的连接,GetIfTable()只返回关于1接口的状态,它不再看到断开的连接。 (返回1表)

我怎么能得到的东西,返回的残疾界面仍然存在,目前禁用?

谢谢。

http://msdn.microsoft.com/en-us/library/aa365943%28VS.85%29.aspx

我想你只需要阅读注册表。

例如,这是在网络上发现的应该看起来像什么的片段:

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{1E6AF554-25FF-40FC-9CEE-EB899472C5A3}\Connection] "PnpInstanceID"="PCI\\VEN_14E4&DEV_1696&SUBSYS_12BC103C&REV_03\\4&3A321F38&0&10F0" "MediaSubType"=dword:00000001 "Name"="Lan Name" "ShowIcon"=dword:00000000 "IpCheckingEnabled"=dword:00000001 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}\{1E6AF554-25FF-40FC-9CEE-EB899472C5A3}\Connection] "PnpInstanceID"="PCI\\VEN_14E4&DEV_1696&SUBSYS_12BC103C&REV_03\\4&3A321F38&0&10F0" "MediaSubType"=dword:00000001 "Name"="Lan Name" "ShowIcon"=dword:00000000 "IpCheckingEnabled"=dword:00000001 

另一种选择是使用Win32_NetworkAdapter WMI类,检查NetConnectionStatusNetEnabled属性。

如何使用netcon.h的接口如本例所示 ? 该示例中的代码以编程方式启用和禁用接口,但是我已经做了一些修改,以便您可以查询状态:

 #include <netcon.h> // wszName is the name of the connection as appears in Network Connections folder // set bEnable to true to enable and to false to disable bool GetConnectionStatus(LPCWSTR wszName, bool *status) { bool result = false; if (!status) return false; typedef void (__stdcall * LPNcFreeNetconProperties)(NETCON_PROPERTIES* pProps); HMODULE hmod = LoadLibrary("netshell.dll"); if (!hmod) return false; LPNcFreeNetconProperties NcFreeNetconProperties = (LPNcFreeNetconProperties)GetProcAddress(hmod, "NcFreeNetconProperties"); if (!NcFreeNetconProperties ) return false; INetConnectionManager * pMan = 0; HRESULT hres = CoCreateInstance(CLSID_ConnectionManager, 0, CLSCTX_ALL, __uuidof(INetConnectionManager), (void**)&pMan); if (SUCCEEDED(hres)) { IEnumNetConnection * pEnum = 0; hres = pMan->EnumConnections(NCME_DEFAULT, &pEnum); if (SUCCEEDED(hres)) { INetConnection * pCon = 0; ULONG count; while (pEnum->Next(1, &pCon, &count) == S_OK && !done) { NETCON_PROPERTIES * pProps = 0; hres = pCon->GetProperties(&pProps); if (SUCCEEDED(hres)) { if (wcscmp(pProps->pszwName,wszName) == 0) { *status = pProps->Status == NCS_CONNECTED; } NcFreeNetconProperties(pProps); } pCon->Release(); } pEnum->Release(); } pMan->Release(); } FreeLibrary(hmod); return result; } 

IP_ADAPTER_ADDRESSES结构包含一个OperStatus成员。 请参阅MSDN文档

我认为它可以用来检测禁用的网卡。 我没有尝试。

这是一个测试代码:

 ULONG nFlags= 0; if (WINVER>=0x0600) // flag supported in Vista and later nFlags= 0x0100; // GAA_FLAG_INCLUDE_ALL_INTERFACES // during system initialization, GetAdaptersAddresses may return ERROR_BUFFER_OVERFLOW and supply nLen, // but in a subsequent call it may return ERROR_BUFFER_OVERFLOW and supply greater nLen ! ULONG nLen= sizeof (IP_ADAPTER_ADDRESSES); BYTE* pBuf= NULL; DWORD nErr= 0 ; do { delete[] pBuf; pBuf= new BYTE[nLen]; nErr= ::GetAdaptersAddresses(AF_INET, nFlags, NULL, (IP_ADAPTER_ADDRESSES*&)pBuf, &nLen); } while (ERROR_BUFFER_OVERFLOW == nErr); if (NO_ERROR != nErr) { delete[] pBuf; TCHAR czErr[300]= _T("GetAdaptersAddresses failed. "); REPORT(REP_ERROR, _T("GetAdapterInfo"), GetSysErrStr(nErr, czErr, 300)); return false; } const IP_ADAPTER_ADDRESSES* pAdaptersAddresses= (IP_ADAPTER_ADDRESSES*&)pBuf; while (pAdaptersAddresses) // for each adapter { TCHAR czAdapterName [500]; str_cpy(czAdapterName , 500, pAdaptersAddresses->AdapterName ); TCHAR czDesc [500]; str_cpy(czDesc , 500, pAdaptersAddresses->Description ); TCHAR czFriendlyName[500]; str_cpy(czFriendlyName, 500, pAdaptersAddresses->FriendlyName); const IF_OPER_STATUS& Stat= pAdaptersAddresses->OperStatus; // 1:up, 2:down... ... pAdaptersAddresses= pAdaptersAddresses->Next; } 

根据这个CodeGuru论坛消息 ,你可以查询WMI这个信息(AC#代码在那里提供)。

要使用C ++查询WMI,请参阅以下两个链接:

  • MSDN
  • CodeProject上

命令行:

 wmic NIC where(ConfigManagerErrorCode=22)get Description,Index,NetConnectionID,PNPDeviceID 

输出:

 Description Index NetConnectionID PNPDeviceID Broadcom 802.11g Network Adapter 8 WiFi PCI\VEN_14E4&DEV_4320&SUBSYS_041814E4&REV_03\4&31B6CD7&0&00F0 1394 Net Adapter 13 1394 V1394\NIC1394\1B9E0F31E8C00 TAP-Win32 Adapter V9 14 Steganos Internet Anonym 2012 VPN Adapter ROOT\NET\0000 VirtualBox Host-Only Ethernet Adapter 24 VirtualBox Host-Only Network ROOT\NET\0001