Enabling and disabling network adapters

One of the most fundamental things that I do with a network adapter is either enable or disable it. In fact, I perform these tasks several times a week. This is because my primary work device is a laptop and it has built-in wireless network adapters. Not surprising, all modern laptops have both wired and wireless connections available. But when I am at home, in my office I want to have my laptop use the gigabit Ethernet switch that I have, and not go through the significantly slower wireless adapter. If I am on the road, I want to know if my wireless network adapter is enabled or not, and I want to control whether it connects to say a network named Starbucks for example. If I do not control such a thing, my laptop will automatically connect to every wireless it has ever seen before. This is why, for example , I wrote this blog article about cleaning out wireless network history. Chris Wu, a Microsoft PFE also wrote an article that takes a different approach. It is a good read as well.

PowerTip : Enable all network adapters

Question: You are troubleshooting your Windows 8.1 laptop and want to quickly enable all network adapters. How can you do this?

Answer: Use the Get-NetAdapter and the Enable-NetAdapter commands. The command line appears here:

  1. Get-NetAdapter |Where status -ne up | Enable-NetAdapter

Using Devcon

In the old days, back before Windows Vista and Windows Server 2008 when I needed to enable or disable a network adapter, I would actually use Devcon. Devcon is a command line utility that provides the ability to enable and to disable various hardware devices. It is billed as a command-line Device Manager. Here is a VBScript I wrote to enable and to disable the network interface adapter using Devcon. Keep in mind that Devcon is not installed by default, and therefore must be installed prior to use.

  1. '==========================================================================
  2. '
  3. ' VBScript: AUTHOR: Ed Wilson , MS, 5/5/2004
  4. '
  5. ' NAME: <turnONoffNet.vbs>
  6. '
  7. ' COMMENT: Key concepts are listed below:
  8. '1.uses the c:\devcon utility to turn on or off net
  9. '2.uses a vbyesNO msgBOX to solicit input
  10. '3. KB 311272 talks about devcon and shows where to get
  11. '==========================================================================
  12. Option Explicit
  13. Dim objShell
  14. Dim objExec
  15. Dim onWireLess
  16. Dim onLoopBack
  17. Dim turnON
  18. Dim turnOFF
  19. Dim yesNO
  20. Dim message, msgTitle
  21. Dim strText
  22. message = "Turn On Wireless? Loop is disabled" & vbcrlf & "if not, then wireless is disabled and loop enabled"
  23. msgTitle = "change Network settings"
  24. onWireLess = " PCMCIA\Dell-0156-0002"
  25. onLoopBack = " \*loop"
  26. turnON = "enable"
  27. turnOFF = "disable"
  28. Const yes = 6
  29. Set objShell = CreateObject("wscript.shell")
  30. yesNO = MsgBox(message,vbyesNO,msgTitle)
  31. If yesNO = yes Then
  32. WScript.Echo "yes chosen"
  33. Set objExec = objShell.exec("cmd /c c:\devcon " & turnON & onWireLess)
  34. subOUT
  35. Set objExec = objShell.exec("cmd /c c:\devcon " & turnOFF & onLoopBack)
  36. subOUT
  37. Else
  38. WScript.Echo "no chosen"
  39. Set objExec = objShell.exec("cmd /c c:\devcon " & turnOFF & onWireLess)
  40. subOUT
  41. Set objExec = objShell.exec("cmd /c c:\devcon " & turnON & onLoopBack)
  42. subOUT
  43. End If
  44. Sub subOUT
  45. Do until objExec.StdOut.AtEndOfStream
  46. strText = objExec.StdOut.ReadLine()
  47. Wscript.Echo strText
  48. Loop
  49. End sub

Using WMI

Beginning with Windows Vista (and Windows Server 2008) the Win32_NetworkAdapter class gains two methods: disable and enable. These are documented on MSDN here. These methods are instance methods which means that to use them, I need to first obtain an instance of the WMI class. What does this mean? Well I am using Win32_NetworkAdapter and therefore I am working with network adapters. So, I need to get a specific network adapter, and then I can disable it or enable it. Here is how it might work:

  1. $wmi=Get-WmiObject-ClassWin32\_NetworkAdapter-filter"Name LIKE '%Wireless%'"
  2. $wmi.disable()

OR

  1. $wmi=Get-WmiObject-ClassWin32\_NetworkAdapter-filter"Name LIKE '%Wireless%'"
  2. $wmi.enable()

The thing to keep in mind is that when calling a method in Windows PowerShell, the parenthesis are required.

If I need to specify alternate credentials, I can specify a remote computer name and an account that has local admin rights on the remote box. The code would appear like the following:

  1. $wmi=Get-WmiObject-ClassWin32\_NetworkAdapter-filter"Name LIKE '%Wireless%'"-credential (Get-Credential) -computernameremotecomputer
  2. $wmi.disable()

Keep in mind that WMI does not permit alternate credentials for a local connection. Attempts to use alternate credentials for a local connection results in the error appearing here:

  1. PS C:\> gwmi win32\_networkadapter -Credential (Get-Credential)
  2. cmdlet Get-Credential at command pipeline position 1
  3. Supply values for the following parameters:
  4. Credential
  5. gwmi : User credentials cannot be used for local connections
  6. At line:1 char:
  7. + gwmi win32\_networkadapter -Credential (Get-Credential)
  8. + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  9. + CategoryInfo : InvalidOperation: (:) [Get-WmiObject], ManagementException
  10. + FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Comman
  11. ds.GetWmiObjectCommand

This error, for local connections, is not a Windows PowerShell thing, WMI has always behaved in this manner, even going back to the VBScript days.

Using the NetAdapter module

In Windows 8 (and above), I can use Windows PowerShell to stop or to start a network adapter by using one of the CIM commands. Of course, the function wraps the WMI class, but it also makes things really easy. The _netadapter _functions appear here (gcm is an alias for the Get-Command cmdlet)

  1. PS C:\> gcm -Noun netadapter | select name, modulename
  2. Name ModuleName
  3. ---- ----------
  4. Disable-NetAdapter NetAdapter
  5. Enable-NetAdapter NetAdapter
  6. Get-NetAdapter NetAdapter
  7. Rename-NetAdapter NetAdapter
  8. Restart-NetAdapter NetAdapter
  9. Set-NetAdapter NetAdapter

NOTE: To enable or to disable network adapters requires admin rights. Therefore you must start the Windows PowerShell console with an account that has rights to perform the task.

The various network adapters on my laptop appear in the figure that follows.
image025.png

I do not like having enabled, disconnected network adapters. Instead, I prefer to only enable the network adapter I am using (there are a number of reasons for this such as simplified routing tables, performance issues, and security concerns). In the past, I wrote a script, now I only need to use a Windows PowerShell command. If I only want to disable the non-connected network adapters, the command is easy. It appears here.

  1. Get-NetAdapter| ? status-ne up| Disable-NetAdapter

The problem with the previous command is that it prompts. This is not much fun when there are multiple network adapters to disable. The prompt appears here.

image027.png

To suppress the prompt, I need to supply $false to the -confirm parameter. This appears here.

  1. Get-NetAdapter| ? status-ne up | Disable-NetAdapter -Confirm:$false

A quick check in control panel shows the disconnected adapters are now disabled. This appears here.
image029.png

If I want to enable a specific network adapter, I use the Enable-Network adapter. I can specify by name as appears here.

  1. Enable-NetAdapter -Name ethernet -Confirm:$false

If I do not want to type the adapter name, I can use the Get-NetAdapter cmdlet to retrieve a specific network adapter and then enable it. This appears here.

  1. Get-NetAdapter -Name vethernet\*| ? status -eq disabled| Enable-NetAdapter -Confirm:$false

It is also possible to use wild card characters with the Get-NetAdapter to retrieve multiple adapters and pipeline them directly to the Disable-NetAdapter cmdlet. The following permits the confirmation prompts so that I can selectively enable or disable the adapter as I wish.

  1. PS C:\> Get-NetAdapter -Name vethernet\* | Disable-NetAdapter
  2. Confirm
  3. Are you sure you want to perform this action?
  4. Disable-NetAdapter 'vEthernet (InternalSwitch)'
  5. [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help
  6. (default is "Y"):y
  7. Confirm
  8. Are you sure you want to perform this action?
  9. Disable-NetAdapter 'vEthernet (ExternalSwitch)'
  10. [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help
  11. (default is "Y"):n