Программное отключение сетевого подключения
есть ли способ программно и временно отключить сетевое подключение в .NET 4.0?
Я знаю, что могу получить текущий статус сетевого подключения, сделав это...
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
но для целей тестирования я хотел бы проверить поведение моего приложения, когда оно теряет сетевое подключение (без физического отключения сетевого кабеля).
спасибо, Крис.
2 ответов
вы можете сделать это с помощью WMI. Вот один, который мы используем для отключения физического адаптера для тестирования этих типов сценариев.
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);
}
}
}
}
}
}
вы не указали ОС, но это работает в Windows 7 и Windows 8.
Примечание что вам нужно будет быть администратором для этого, чтобы функционировать.
Если вы используете "управляемый WiFi API", вы можете просто удалить профиль. Это сработало для меня.
WlanClient client = new WlanClient();
WlanClient.WlanInterface m_WlanInterface = client.Interfaces.Where(i => i.InterfaceDescription.Contains(InterfaceIdentifierString)).First();
m_WlanInterface.DeleteProfile(ConnectionProfileString);
Если вам нужно подключиться к этой сети, обязательно сохраните XML-профиль:
string xmlString = m_WlanInterface.GetProfileXml(ConnectionProfileString)
тогда вы можете использовать его
m_WlanInterface.SetProfile(Wlan.WlanProfileFlags.AllUser, xmlString, true);
m_WlanInterface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, ConnectionProfileString);