Мне нужно полностью включить / отключить сетевые интерфейсы из скрипта в Windows XP. Я ищу решение на Python, но любой общий способ (например, WMI, некоторая командная строка à la netsh, некоторый вызов Windows) приветствуется и будет изменен. Спасибо.






Инструмент devcon может управлять сетевой картой, но не интерфейсом напрямую. Это версия апплета диспетчера устройств для командной строки.
devcon disable (id or portion of name)
devcon enable (id or portion of name)
это VB.Net
Dim objectQuery As New ObjectQuery("SELECT * FROM Win32_NetworkAdapter WHERE NetConnectionId IS NOT NULL")
Dim searcher As New ManagementObjectSearcher(scope, objectQuery)
Dim os As ManagementObject
Dim moColl As ManagementObjectCollection = searcher.Get()
Dim _list As String = ""
For Each os In moColl
Console.WriteLine(os("NetConnectionId"))
Next os
Это получит все интерфейсы на вашем компьютере. Затем вы можете отключить его с помощью netsh.
netsh interface set interface DISABLED
В прошлом я пробовал все комбинации, которые предлагает netsh: netsh interface set interface [name=]wifi [admin=]DISABLED с сообщениями «Параметр неверен» или «Один или несколько важных параметров неверны».
Кажется, я не могу найти никакого базового API для управления интерфейсами в MSDN, кроме API RAS, но я не думаю, что они применимы к соединениям без коммутируемого доступа. Как вы сами предполагаете, netsh может быть вариантом, предположительно, у него также есть программный интерфейс: http://msdn.microsoft.com/en-us/library/ms708353(VS.85).aspx
Если вы хотите быть чистым Python, вы, возможно, можете открыть набор каналов для связи с процессом netsh.
Возможно, вам потребуется использовать WMI. Это может послужить хорошей отправной точкой: http://msdn.microsoft.com/en-us/library/aa394595.aspx
Это действительно хорошая отправная точка. Я работаю над этим. Спасибо.
Пока что я нашел следующее решение Python:
>>> import wmi; c=wmi.WMI()
>>> o=c.query("select * from Win32_NetworkAdapter where NetConnectionID='wifi'")[0]
>>> o.EnableDevice(1)
(-2147217407,)
что переводится AFAIU в общую ошибку WMI 0x80041001. Могли быть разрешения.
Очевидно, я использую это как член локальной группы администраторов, а компьютер не является частью домена.
Отслеживание (последний вызов последним): файл "C: \ Python33 \ lib \ site-packages \ wmi.py", строка 416, в вызов result = self.ole_object.ExecMethod_ (self.method.Name) File "<COMObject < unknown >> ", строка 3, в ExecMethod_ pywintypes.com_error: (-2147352567, 'Произошло исключение.', (0, 'SWbemObjectEx', 'Недопустимые параметры метода', Нет, 0, -2147217361), Нет)
@HaifengLi: спасибо, но я больше не занимаюсь Windows, и ни один из приведенных выше кодов не тестировался на Python 3 (обратите внимание на дату ответа).
Спасибо за ваше заявление.
Использование интерфейса netsh Интерфейс набора использования [name =] IfName [[admin =] ВКЛЮЧЕНО | ВЫКЛЮЧЕНО [connect =] ПОДКЛЮЧЕНО | ОТКЛЮЧЕНО [newname =] NewName]
Попробуйте включить все в внешние скобки: netsh interface set interface name = "thename" admin = disabled connect = DISCONNECTED newname = "thename"
См. Также эту страницу MS KB: http://support.microsoft.com/kb/262265/ Вы можете следовать любому из их предложений. Для отключения адаптера вам необходимо определить способ ссылки на аппаратное устройство. Если на компьютере не будет нескольких адаптеров с одним и тем же именем, вы можете выйти из описания интерфейса (или PCI ID работает нормально). После этого с помощью devcon (отключить | включить). Devcon - это дополнительный консольный интерфейс для диспетчера устройств.
Включение всех параметров приводит к следующему сообщению: «Выделенные интерфейсы не могут быть подключены, отключены, включены или отключены». Должно сработать, но это не так. Однако не тестировал на другом компьютере; Я буду. Спасибо.
У меня такая же странная проблема. Netsh, похоже, не работает должным образом, в этой системе Windows XP я пытаюсь сделать это.
Вы нашли обходной путь для ошибки «выделенные интерфейсы не могут ...»?
Я нашел этот сценарий .VBS в Интернете. У него есть классное преимущество: он работает на машинах, на которых я не могу заставить NETSH работать для этой цели.
Const ssfCONTROLS = 3
sConnectionName = "Local Area Connection"
sEnableVerb = "En&able"
sDisableVerb = "Disa&ble"
set shellApp = createobject("shell.application")
set oControlPanel = shellApp.Namespace(ssfCONTROLS)
set oNetConnections = nothing
for each folderitem in oControlPanel.items
if folderitem.name = "Network Connections" then
set oNetConnections = folderitem.getfolder: exit for
end if
next
if oNetConnections is nothing then
msgbox "Couldn't find 'Network Connections' folder"
wscript.quit
end if
set oLanConnection = nothing
for each folderitem in oNetConnections.items
if lcase(folderitem.name) = lcase(sConnectionName) then
set oLanConnection = folderitem: exit for
end if
next
if oLanConnection is nothing then
msgbox "Couldn't find '" & sConnectionName & "' item"
wscript.quit
end if
bEnabled = true
set oEnableVerb = nothing
set oDisableVerb = nothing
s = "Verbs: " & vbcrlf
for each verb in oLanConnection.verbs
s = s & vbcrlf & verb.name
if verb.name = sEnableVerb then
set oEnableVerb = verb
bEnabled = false
end if
if verb.name = sDisableVerb then
set oDisableVerb = verb
end if
next
'debugging displays left just in case...
'
'msgbox s ': wscript.quit
'msgbox "Enabled: " & bEnabled ': wscript.quit
'not sure why, but invokeverb always seemed to work
'for enable but not disable.
'
'saving a reference to the appropriate verb object
'and calling the DoIt method always seems to work.
'
if bEnabled then
' oLanConnection.invokeverb sDisableVerb
oDisableVerb.DoIt
else
' oLanConnection.invokeverb sEnableVerb
oEnableVerb.DoIt
end if
'adjust the sleep duration below as needed...
'
'if you let the oLanConnection go out of scope
'and be destroyed too soon, the action of the verb
'may not take...
'
wscript.sleep 1000
Похоже, это не работает с сетевыми интерфейсами. «devcon enable wifi», где wifi - это имя беспроводного интерфейса, который отвечает: «Устройства не включены».