How to programmatically enable/disable network interfaces? (Windows XP)

前端 未结 7 1880
一生所求
一生所求 2020-12-02 19:23

I need to enable/disable completely network interfaces from a script in Windows XP. I\'m looking for a python solution, but any general way (eg WMI, some command-line à la n

相关标签:
7条回答
  • 2020-12-02 20:02

    The devcon tool can control the NIC, but not the interface directly. It's a command-line version of the Device Manager applet.

    devcon disable (id or portion of name)
    devcon enable (id or portion of name)
    
    0 讨论(0)
  • 2020-12-02 20:14

    I found this .VBS script on the internet. It has the cool advantage of actually working on machines where I cannot get NETSH to work for this purpose.

    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
    
    0 讨论(0)
  • 2020-12-02 20:18

    this is 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
    

    That will get all the interfaces on you computer. Then you can do netsh to disable it.

    netsh interface set interface DISABLED

    0 讨论(0)
  • 2020-12-02 20:20

    I can't seem to find any basic API for controlling interfaces on MSDN, apart from the RAS API's, but I don't think they apply to non-dialup connections. As you suggest yourself, netsh might be an option, supposedly it also has a programmatic interface: http://msdn.microsoft.com/en-us/library/ms708353(VS.85).aspx

    If you want to be pure Python, you can perhaps open a set of pipes to communicate with an netsh process.

    0 讨论(0)
  • 2020-12-02 20:21

    Using the netsh interface Usage set interface [name = ] IfName [ [admin = ] ENABLED|DISABLED [connect = ] CONNECTED|DISCONNECTED [newname = ] NewName ]

    Try including everything inside the outer brackets: netsh interface set interface name="thename" admin=disabled connect=DISCONNECTED newname="thename"

    See also this MS KB page: http://support.microsoft.com/kb/262265/ You could follow either of their suggestions. For disabling the adapter, you will need to determine a way to reference the hardware device. If there will not be multiple adapters with the same name on the computer, you could possibly go off of the Description for the interface (or PCI ID works well). After that, using devcon (disable|enable). Devcon is an add-on console interface for the Device Manager.

    0 讨论(0)
  • 2020-12-02 20:25

    So far I've found the following Python solution:

    >>> import wmi; c=wmi.WMI()
    >>> o=c.query("select * from Win32_NetworkAdapter where NetConnectionID='wifi'")[0]
    >>> o.EnableDevice(1)
    (-2147217407,)
    

    which is translated, AFAIU, to the generic WMI error 0x80041001. Could be permissions.

    0 讨论(0)
提交回复
热议问题