Программно отключить/включить сетевой интерфейс

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

этот предыдущий пост:

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

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

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

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

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

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

затем я попытался использовать интерфейс INetConnection, в частности INetConnection->Подключение/Отключение:

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 ответов


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

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

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

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


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


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

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


'==========================================================================
' 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"

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

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


найдено это решение, которое в основном автоматизация Правой Кнопкой Мыши: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