2011-05-06 13 views
14

Me gustaría saber cuándo se ha deshabilitado una interfaz.¿Cómo puedo detectar una conexión de interfaz de red deshabilitada desde una aplicación de Windows?

Si voy al administrador de Windows y desactivo una de las 2 conexiones habilitadas, GetIfTable() solo devuelve el estado de 1 interfaz, ya no la desconecta. (Devuelve 1 mesa)

¿Cómo puedo conseguir algo para volver que los discapacitados interfaz todavía existe, pero es actualmente desactivado?

Gracias.

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

Respuesta

8

creo que sólo se necesita leer el registro.

Por ejemplo, este es un fragmento encontrado en la web de lo que las cosas deben verse como:

[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 
+0

¿Qué campo aquí es el estado dis/enabled? –

+1

No lo sé de memoria, y no estoy cerca de ninguna PC con Windows. Espero que puedas encontrar más información sobre este puntero ... sry sobre eso por ahora – sehe

+1

Creo que en base a la información de PnpInstanceId debes encontrar la información del controlador en HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Enum \ PCI y allí deberías ver ConfigFlags llave. Si está configurado en 0, la tarjeta NIC está habilitada si está desactivada 1. – Zuljin

5

La estructura IP_ADAPTER_ADDRESSES sostienen un miembro de OperStatus. Ver MSDN documentation

creo que puede ser utilizado para detectar NIC discapacitados. No lo intenté.

Aquí hay un código de prueba:

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; 
} 
+0

Desafortunadamente, nada aquí indica habilitado. Probé este método y se comporta igual que GetIfTable() solo devolviendo el estado (lista enlazada) por un momento ... esperaba al menos obtener información con un IF_OPER_STATUS .... –

6

Cómo sobre el uso de las interfaces de netcon.h como se ilustra en this example? El código de ejemplo que activa y desactiva la interfaz de programación, pero he hecho algunas modificaciones para que usted pueda consultar el estado en su lugar:

#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; 
} 
+0

bien, lo verificare, gracias ... –

+0

la variable 'hecho' no se usa en el ciclo - un problema de copiar/pegar :-) –

6

Otra opción es utilizar el Win32_NetworkAdapter Clase WMI, compruebe las propiedades NetConnectionStatus y NetEnabled .

+0

Si encuentra que esta clase de WMI le da el estado que desea, tenga en cuenta que WMI le proporciona un ' servicio de sondeo 'para verificar periódicamente si los valores han cambiado. Eche un vistazo a [__InstanceModificationEvent] (http://technet.microsoft.com/en-us/library/ee156572.aspx) (pero si está compilando esto en una aplicación, tenga cuidado ya que puede encontrar que el sondeo WMI será Pesado a pesar de su aparente simplicidad.) – Daryn

2

-línea de comandos:

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

Salida:

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 
Cuestiones relacionadas