2011-11-23 26 views
10

Czy istnieje sposób programowego i tymczasowego odłączenia połączenia sieciowego w .NET 4.0?Programowo odłączyć połączenie sieciowe

wiem, że mogę uzyskać aktualny stan połączenia sieciowego w ten sposób ...

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() 

ale dla celów testowych Chciałbym przetestować zachowanie mojego wniosku, gdy traci łączność z siecią (bez fizycznego odłączania kabla sieciowego).

Dzięki, Chris.

+3

Wystarczy odłączyć rzecz dang. :) – rfmodulator

+2

Tak, zdaję sobie sprawę, że mogę odłączyć kabel sieciowy. Ale tak jak powiedziałem w moim pytaniu, chciałbym programowo odłączyć sieć, aby pomóc w testowaniu połączonej i rozłączonej funkcjonalności w aplikacji. – ChrisNel52

Odpowiedz

16

Można to zrobić za pomocą usługi WMI. Tutaj używamy do wyłączania adaptera fizycznego do testowania tego typu scenariuszy.

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); 
        } 
       } 
      } 
     } 
    } 
} 

Nie wskazują OS, ale to działa w Windows 7 i Windows 8.

Uwaga że trzeba być administratorem tego funkcjonować.

+0

Podoba mi się. Elegancki, precyzyjny i nie powiedziałeś mi, żebym odłączył mój kabel sieciowy :-) – ChrisNel52

+3

Uwaga boczna: Ta metoda wymaga uprawnień administratora w systemie Windows 7 (i prawdopodobnie również w systemach Windows 8 i Windows Vista) – Karsten

1

jeśli używasz "Zarządzanego interfejsu API Wifi", możesz po prostu usunąć profil. To działało dla mnie.

WlanClient client = new WlanClient(); 

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

Jeśli trzeba podłączyć do tej sieci, należy zapisać profil xml:

string xmlString = m_WlanInterface.GetProfileXml(ConnectionProfileString) 

Następnie można ponownie wykorzystać to

m_WlanInterface.SetProfile(Wlan.WlanProfileFlags.AllUser, xmlString, true); 
m_WlanInterface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, ConnectionProfileString); 
Powiązane problemy