Подтвердить что ты не робот

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

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

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

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

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

Другое предлагаемое решение - использовать 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- > Connect/Disconnect:

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

Но я никогда не мог заставить это повлиять на соединения в моих тестовых ящиках Vista или XP.

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

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

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

Приветствуется любая помощь или понимание - или идеи о том, как выполнить тоггенический script на С++. Спасибо!

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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