Программно отключить / включить сетевой интерфейс - PullRequest
18 голосов
/ 14 мая 2009

Я пытаюсь найти решение для программного включения / отключения сетевой карты - я провел массу исследований, и ничто не кажется работоспособным решением как в средах XP, так и в Vista. Я говорю о том, что если вы зашли в панель управления «Сетевые подключения», щелкнули по ней правой кнопкой мыши и выбрали «включить» или «отключить». В идеале я хотел бы использовать библиотеку, но если хуже станет хуже, я предположил, что могу обратиться к приложению командной строки, но это абсолютно худший случай. Вот что я пробовал до сих пор и где / почему они потерпели неудачу:

Это предыдущее сообщение:

Как программно включить / отключить сетевые интерфейсы? (Windows XP)

Перечисляет несколько методов - первый использует netsh, что похоже на использование функции IPHelper SetIfEntry (). Проблема в том, что он устанавливает интерфейс как включенный или отключенный административно, а не как включенный / отключенный обычным образом, поэтому он фактически не закрывает сетевой адаптер.

Другое предлагаемое решение - использование WMI и, в частности, класса Win32_NetworkAdapter, который имеет метод Enable and Disable:

http://msdn.microsoft.com/en-us/library/aa394216(VS.85).aspx

Отлично, верно? Прекрасно работает в Vista, эти методы не существуют в обычной установке XP ...

Другим предложением является использование DevCon, который действительно использует SetupAPI, в частности SetupDiSetClassInstallParams () с DICS_ENABLE. Проведя бесчисленные часы с этим замечательным классом и попытавшись отключить / включить устройство как на глобальном уровне, так и на определенном уровне конфигурации (и каждой комбинации), оно также не всегда работает - иногда работает нормально, но иногда отключение устройства в диспетчере устройств, но при этом оставление его работоспособным в сетевых подключениях.

Затем я попытался использовать интерфейс INetConnection, а именно INetConnection-> Connect / Disconnect:

http://msdn.microsoft.com/en-us/library/aa365084(VS.85).aspx

Но я так и не смог добиться, чтобы это оказало какое-либо влияние на соединения в моих тестовых системах Vista или XP.

Наконец, я нашел этот скрипт на C # под названием ToggleNic:

http://channel9.msdn.com/playground/Sandbox/154712/

Похоже, что он как-то проходит через оболочку, чтобы эффективно вызывать поведение правой кнопки мыши. Ограничение (по крайней мере, этой реализации) состоит в том, что он не работает (без модификации) в неанглийских системах, с которыми мне нужно работать. Справедливости ради, это решение выглядит наиболее жизнеспособным, но мое знакомство с C # низкое, и я не смог найти, доступен ли API, который он использует, в C ++.

Буду очень признателен за любую помощь или понимание - или за идеи о том, как выполнить то, что делает скрипт togglenic в C ++. Спасибо!

Ответы [ 7 ]

6 голосов
/ 19 мая 2009

После тестирования на большем количестве платформ и других подходов я в основном отказался от этой функциональности (по крайней мере, для моих целей). Проблема для меня заключается в том, что я хочу иметь что-то, что работает в 90% + ситуаций, и реальность такова, что со всем, что я могу придумать, это ближе к 70%. Ирония заключается в том, что на самом деле все так же плохо при обычном методе Windows. Для тех, кто все еще хочет пойти по этому опасному пути, вот что я нашел:

Из описанных выше прямых методов API один из наиболее работавших работал с использованием SetupAPI (SetupDiSetClassInstallParams) - самая большая проблема, с которой я столкнулся, заключается в том, что иногда он попадает в состояние, в котором он требует перезагрузки и никакие изменения не сработают, пока это не произойдет. Единственное, о чем следует помнить при использовании, - это два профиля для устройств, поэтому в некоторых случаях вам нужно переключать их оба. В DDK содержится исходный код инструмента devcon, который показывает, как именно все делать. В конечном итоге это выглядело так, как будто это было самое близкое к щелчку правой кнопкой мыши, но все же демонстрировалось странное поведение, которого не было у сетевых подключений. Этот подход, похоже, работал примерно в 70% случаев (как в тестах, так и в тестовых системах).

Из общего подхода к взлому, лучшее, что я обнаружил, - это не использовать технику, которую использовал ToggleNIC, а вместо этого использовать материал IShellFolder - это позволяет вам использовать GetCommandString, которая не зависит от языка. Проблема в том, что под XP GetCommandString ничего не возвращает (о, радость), но казалось, что идентификаторы меню для 'enable' и 'disable' были согласованы (16 и 17 соответственно), поэтому, если мне не удалось получить GetCommandString Я просто вернулся к идентификаторам меню. Чтобы переключить, просто вызовите InvokeCommand со строкой, если она вернула, или с идентификатором меню, если это не так. Проблема с этим заключалась в том, что, как и в обычном Windows-режиме, иногда он не работает и не дает никаких сведений о том, что происходит или почему это не удалось. Этот подход, похоже, тоже работал примерно в 70% случаев, но было гораздо сложнее определить, что что-то пошло не так, плюс всплывет обычный текст «Включающий интерфейс ...».

Надеюсь, это поможет кому-то еще - и если кому-то удастся найти другой способ, который работает в других ситуациях, я бы с удовольствием это услышал!

1 голос
/ 14 января 2011
ManagementClass managementClass = new ManagementClass("Win32_NetworkAdapter");
ManagementObjectCollection mgmtObjectColl = managementClass.GetInstances();

ManagementObject myObject = null;

foreach (ManagementObject mgmtObject in mgmtObjectColl)
{
    if (mgmtObject["NetConnectionID"] != null && mgmtObject["NetConnectionID"].Equals("Local Area Connection"))
    {
        Console.WriteLine("found");
        myObject = mgmtObject;
        object result = mgmtObject.InvokeMethod("Disable", null);
    }
    //Console.WriteLine("{0}, {1}", mgmtObject["Name"], mgmtObject["NetConnectionID"]);
}

object result3 = myObject.InvokeMethod("Enable", null);
1 голос
/ 30 сентября 2010
'==========================================================================
' NAME: 1unconnectedNIC.vbs
'
' COMMENT: This file will disable and rename the unconnected NIC on the 
'  local server.
'
' Usage:
'  cscript 1unconnectedNIC.vbs
' Alex John
'==========================================================================
strComputer = "."

Set objShell = CreateObject("WScript.Shell")
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colAdapters = objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapter where NetConnectionStatus = '7'" )

'For every adapter that is disconnected (has a red X by it)
For Each objAdapter in colAdapters
 Wscript.Echo "Net Connection ID: " & objAdapter.NetConnectionID
 Wscript.Echo "....Disabling NIC"

 'Disable the NIC
 objShell.Run "netsh interface set interface name=" & chr(34) & objAdapter.NetConnectionID & chr(34) & " admin=disabled", 0, true
 Wscript.Echo "....NIC Disabled"
 WScript.Sleep 10000

 'Rename the NIC
 Wscript.Echo "....Renaming NIC to 'Not Used'"
 objShell.Run "netsh interface set interface name=" & chr(34) & objAdapter.NetConnectionID & chr(34) & " newname=" & chr(34) & "Not Used" & n & chr(34), 0, true
Next
Wscript.Echo "Finished"
1 голос
/ 05 ноября 2009

после долгих поисков я начал копаться в DEVCON. После того, как я понял, что эти методы должны быть точными, я немного поискал и обнаружил следующее: http://www.codeproject.com/KB/cs/HardwareHelper.aspx

Это помогло решить мою проблему включения и выключения адаптера TAP из OpenVPN как минимум.

1 голос
/ 15 мая 2009

Попробуйте " Сетевые интерфейсы оболочки * " C ++ - код здесь . Это должно работать под XP и выше.

0 голосов
/ 31 января 2011

Нашел это решение, которое в основном представляет собой автоматизацию правой кнопки мыши: http://www.wilderssecurity.com/showthread.php?t=265836 Работает как на Windows XP, так и на Windows 7

Существует также один, написанный Novell, который является оболочкой над DevCon: http://www.novell.com/communities/node/2338/network-configuration-command-line-control

0 голосов
/ 18 мая 2009

ToggleNic использует Shell32 через COM. В c используются стандартные библиотеки "SHLOBJ.H", "SHELLAPI.H" и класс IShellDispatch.

...