c# Включение и отключение всех сетевых адаптеров

Нужно написать код, который при нажатии кнопки "Вкл" включает сетевые адаптеры, а при нажатии "Выкл" - выключает. Перелопатил весь интернет, но никакие способы не работают и не выводят даже список этих адаптеров


Ответы (1 шт):

Автор решения: Alexander Petrov

Есть несколько способов.

С помощью технологии WMI. Класс MSFT_NetAdapter.
Необходимо подключить сборку System.Management.
Необходимы права админа.

ManagementScope scope = new ManagementScope(@"ROOT\StandardCimv2");
ObjectQuery query = new ObjectQuery("SELECT * FROM MSFT_NetAdapter");

using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query))
{
    foreach (ManagementObject device in searcher.Get())
    {
        try
        {
            Console.WriteLine(device["Name"]);
            device.InvokeMethod("Enable", new object[1]); // "Disable"
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: " + e.Message);
        }
    }
}

Документация по WMI довольно скудная и неточная. Примеры кода на разных сайтах тоже не отличаются высоким качеством.
Например, практически везде вторым параметром в методе InvokeMethod идёт null. При этом в рантайме выбрасывается исключение "Object reference not set to an instance of an object", которое обычно гасится пустым блоком try-catch. Но если передавать пустой массив, то исключения не будет.

Далее. У меня один из адаптеров отключен в Device Manager'е. Во время выполнения кода на этом адаптере происходит довольно длительная пауза - система пытается достучаться до него. Чтобы её избежать, можно изменить код запроса:

"SELECT * FROM MSFT_NetAdapter WHERE InterfaceOperationalStatus = 2"

Свойство InterfaceOperationalStatus нужно задавать равным 2 (Down), когда хотим найти выключенные устройства, чтобы их включить.
Соответственно, нужно задать значение 1 (Up), когда ищем включенные устройства для последующего выключения.

→ Ссылка