如何以编程方式启用/禁用网络接口? (Windows XP)
我需要从Windows XP中的脚本启用/禁用完全网络接口。我正在寻找python解决方案,但是欢迎任何常规方式(例如WMI,某些命令行la netsh,某些Windows调用)并将进行调整。谢谢。
解决方案
回答
devcon工具可以控制NIC,但不能直接控制接口。它是设备管理器小程序的命令行版本。
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
回答
除了RAS API之外,我似乎找不到用于控制MSDN上的接口的任何基本API,但是我认为它们不适用于非拨号连接。正如我们自己建议的那样,netsh可能是一个选择,据说它还具有编程接口:http://msdn.microsoft.com/zh-cn/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. 可能是权限。
回答
使用netsh界面
用法集接口[name =] IfName
[[admin =]启用|禁用
[connect =] CONNECTED | DISCONNECTED
[newname =] NewName]
尝试将所有内容都包含在外括号中:
netsh接口设置接口名称=" thename" admin =禁用connect = DISCONNECTED newname =" thename"
另请参见此MS KB页面:http://support.microsoft.com/kb/262265/
我们可以遵循他们的任何建议。
要禁用适配器,我们将需要确定引用硬件设备的方法。如果计算机上不存在多个具有相同名称的适配器,则可以不使用该接口的"描述"(或者PCI ID效果很好)。之后,使用devcon(禁用)。 Devcon是设备管理器的添加控制台界面。
回答
我在互联网上找到了这个.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