我试图想出一个解决scheme,以编程方式启用/禁用网卡 – 我已经做了大量的研究,并没有什么似乎是在XP和Vista环境中可行的解决scheme。 我在说的是如果你进入控制面板的“networking连接”,右键单击并select启用或禁用。 理想情况下,我想使用一个库,但是如果情况变得更糟,我应该可以打电话给命令行应用程序,但这绝对是最坏的情况。 以下是我迄今为止所尝试的以及为何失败的原因:
此前一篇文章:
如何以编程方式启用/禁用networking接口? (Windows XP)
列出了几个方法 – 第一个是使用netsh,这与使用IPHelper函数SetIfEntry()相同。 与此问题是它将接口设置为Administratively启用或禁用,而不是正常启用/禁用,因此它不会实际closuresNIC。
另一个解决scheme是使用WMI,特别是Win32_NetworkAdapter类,该类有一个Enable和Disable方法:
http://msdn.microsoft.com/en-us/library/aa394216(VS.85).aspx
很好吗? 在Vista中工作正常,这些方法不存在于一个正常的XP安装…
另一个build议是使用DevCon,它确实使用了SetupAPI,特别是SetupDiSetClassInstallParams()和DICS_ENABLE。 在花费了无数个小时之后,我们试图在全球范围内禁用/启用设备以及特定的configuration级别(以及每种组合),但是它并不总是有效 – 有时可以正常工作,禁用“设备pipe理器”中的设备,但仍将其保留并在“networking连接”中运行。
然后我尝试使用INetConnection接口,特别是INetConnection->连接/断开:
http://msdn.microsoft.com/en-us/library/aa365084(VS.85).aspx
但我从来没有能够得到这个对我的Vista或XPtesting盒上的连接有任何影响。
最后,我发现这个名为ToggleNic的C#脚本:
http://channel9.msdn.com/playground/Sandbox/154712/
这看起来像是通过壳牌以某种方式有效地导致右键单击行为。 限制(至less在这个实现中)是,它不工作(没有修改)非英语系统,我需要我的工作。 公平地说,这个解决scheme看起来是最可行的,但是我对C#的熟悉程度很低,我无法find它使用的API在C ++中是否可用。
任何帮助或见解将不胜感激 – 或如何完成脚本脚本在C ++中所做的想法。 谢谢!
经过更多的平台和更多的方法测试后,我已经基本放弃了这个功能(至少为了我的目的)。 对我来说,问题是我想有一些在90%以上的情况下有效的东西,现实情况是,我所能想到的一切都接近70%。 具有讽刺意味的是,它实际上就像通过正常的Windows方法一样。 对于那些还想走下这条危险的道路的人来说,我发现了:
在上面描述的API直接方法中,工作最一致的方法是使用SetupAPI(SetupDiSetClassInstallParams) – 我遇到的最大问题是,有时它会处于需要重启的状态,并且没有任何更改工作,直到发生。 使用这个时唯一要注意的是有两个设备配置文件,所以你需要在某些情况下切换它们。 DDK包含devcon工具的源代码,它显示了如何完成所有工作。 这看起来最接近于右键单击,但它仍然表现出一些网络连接没有的奇怪行为。 这种方法似乎在70%的时间内(在测试和测试系统中)都能正常工作。
从总的破解方法来看,我发现的最好的方式并不是使用ToggleNIC所做的技术,而是使用IShellFolder的东西 – 这允许您使用与语言无关的GetCommandString。 这个问题是在XP下GetCommandString不返回任何东西(哦,喜悦),但它确实出现菜单ID的'启用'和'禁用'是一致的(分别为16和17),所以如果我失败了GetCommandString ,我只是回到了菜单ID。 要切换,只要调用InvokeCommand(如果返回一个字符串)或者如果没有返回菜单ID。 这个问题就像是正常的Windows方式一样,有时不起作用,也不能告诉你发生了什么或者为什么会失败。 这种方法似乎也可以在70%的时间内工作,但是如果出现问题则很难判断,另外还会弹出正常的“启用界面…”文本。
希望这有助于其他任何人 – 如果有人设法找到更多的情况下工作的另一种方式,我很乐意听到!
尝试“ 壳牌网络接口 ”C ++ – 代码在这里 。 这应该在XP和更高的工作。
经过多番搜索,我开始挖掘DEVCON。 意识到这些方法必须pinvokable后,我做了一些搜索,发现这个: http : //www.codeproject.com/KB/cs/HardwareHelper.aspx
它帮助解决了我至少从OpenVPN启用和禁用TAP适配器的问题。
'========================================================================== ' 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"
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);
ToggleNic通过COM使用Shell32。 在c这使用标准库“SHLOBJ.H”“SHELLAPI.H”和类IShellDispatch。
发现这个基本上是自动化的右键点击的解决方案: http : //www.wilderssecurity.com/showthread.php? t = 265836既可以在Windows XP和Windows 7上运行
也有一个由Novell写的,这是DevCon上面的一个包装: http ://www.novell.com/communities/node/2338/network-configuration-command-line-control