2011-11-23 22 views
10

¿Hay alguna forma de desconectar la conexión de red de forma programática y temporal en .NET 4.0?Desconexión de conectividad de red mediante programación

Sé que puedo conseguir el estado de conectividad de red actual al hacer esto ...

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() 

pero para propósitos de prueba me gustaría probar el comportamiento de mi aplicación cuando se pierde la conectividad de red (sin desconectar físicamente el cable de red)

Gracias, Chris.

+3

simplemente desconecta la cosa Dang. :) – rfmodulator

+2

Sí, me doy cuenta de que podría desenchufar el cable de red. Pero como dije en mi pregunta, me gustaría desconectar la red por programación para ayudar a probar la funcionalidad conectada y desconectada de la aplicación. – ChrisNel52

Respuesta

16

Puede hacerlo con WMI. Aquí hay uno que usamos para deshabilitar el adaptador físico para probar estos tipos de escenarios.

using System.Management; 
using System.Linq; 

namespace DisableNIC 
{ 
    internal static class Program 
    { 
     private static void Main() 
     { 
      var wmiQuery = new SelectQuery("SELECT * FROM Win32_NetworkAdapter " + 
              "WHERE NetConnectionId != null " + 
               "AND Manufacturer != 'Microsoft' "); 
      using (var searcher = new ManagementObjectSearcher(wmiQuery)) 
      { 
       foreach (var item in searcher.Get().OfType<ManagementObject>()) 
       { 
        if ((string) item["NetConnectionId"] != "Local Area Connection") 
         continue; 

        using (item) 
        { 
         item.InvokeMethod("Disable", null); 
        } 
       } 
      } 
     } 
    } 
} 

usted no indicó el sistema operativo, pero esto funciona en Windows 7 y Windows 8.

Nota que tendrá que ser un administrador para que esto funcione.

+0

Me gusta. Elegante, preciso, y no me dijo que desconectara el cable de mi red :-) – ChrisNel52

+3

Nota al margen: Este método requiere derechos de administrador en Windows 7 (y probablemente también en Windows 8 y Windows Vista) – Karsten

1

si utiliza 'Managed Wifi API' puede simplemente eliminar el perfil. Eso funcionó para mí.

WlanClient client = new WlanClient(); 

WlanClient.WlanInterface m_WlanInterface = client.Interfaces.Where(i => i.InterfaceDescription.Contains(InterfaceIdentifierString)).First(); 
m_WlanInterface.DeleteProfile(ConnectionProfileString); 

Si necesita volver a conectarse a la red, asegúrese de guardar el perfil xml:

string xmlString = m_WlanInterface.GetProfileXml(ConnectionProfileString) 

A continuación, se puede reutilizar

m_WlanInterface.SetProfile(Wlan.WlanProfileFlags.AllUser, xmlString, true); 
m_WlanInterface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, ConnectionProfileString); 
Cuestiones relacionadas