我正在努力想出一个以编程方式启用/禁用网卡的解决方案 - 我已经做了大量的研究,在XP和Vista环境中似乎都没有什么可行的解决方案。我所说的是如果你进入控制面板的“网络连接”,右键单击一个并选择启用或禁用。理想情况下我想使用一个库,但如果情况变得更糟,我想我可以调用命令行应用程序,但这绝对是最糟糕的情况。这是我到目前为止所尝试的以及他们失败的地点/原因:
上一篇文章:
How to programmatically enable/disable network interfaces? (Windows XP)
列出了几种方法 - 第一种是使用netsh,它看起来与使用IPHelper函数SetIfEntry()相同。这样做的问题是它将接口设置为启用或禁用管理,而不是正常启用/禁用,因此它实际上不会关闭NIC。
提出的另一个解决方案是使用WMI,特别是Win32_NetworkAdapter类,它具有启用和禁用方法:
http://msdn.microsoft.com/en-us/library/aa394216(VS.85).aspx
很好吗?在Vista中运行良好,这些方法在普通的XP安装中不存在......
另一个建议是使用DevCon,它真正使用SetupAPI,特别是SetupDiSetClassInstallParams()和DICS_ENABLE。在这个精彩的课程花了无数个小时后,尝试在全局级别以及特定配置级别(以及每个组合)中禁用/启用设备,它也不能始终如一地工作 - 有时工作正常,但其他时间在设备管理器中禁用该设备,但仍将其保留在网络连接中并可在其中运行。
然后我尝试使用INetConnection接口,特别是INetConnection->连接/断开连接:
http://msdn.microsoft.com/en-us/library/aa365084(VS.85).aspx
但是我从来没有能够对Vista或XP测试盒上的连接产生任何影响。
最后,我发现这个名为ToggleNic的C#脚本:
http://channel9.msdn.com/playground/Sandbox/154712/
看起来它正以某种方式通过Shell以有效地导致右键单击行为。限制(至少是这个实现)是因为它在非英语系统上不起作用(没有修改),我需要我的工作。公平地说,这个解决方案看起来最可行,但我对C#的熟悉程度很低,我无法找到它使用的API是否在C ++中可用。
非常感谢任何帮助或见解 - 或者关于如何完成togglenic脚本在C ++中的功能的想法。谢谢!
答案 0 :(得分:6)
在更多平台和更多方法上测试之后,我基本上放弃了这个功能(至少对我来说是这样)。对我来说,问题在于我希望能够在90%以上的情况下使用某些东西,现实情况是,我能想出的一切,接近70%。具有讽刺意味的是,它实际上与普通的Windows方法一样片状。对于那些仍然希望走下这条危险道路的人来说,这就是我发现的:
在上面描述的API直接方法中,最一致的方法是使用SetupAPI(SetupDiSetClassInstallParams) - 我遇到的最大问题是,有时它会进入需要重启的状态。在发生这种情况之前,任何变使用它时唯一需要注意的是设备有两个配置文件,因此在某些情况下需要切换它们。 DDK包含devcon工具的源代码,它可以准确地显示如何执行所有操作。这最终看起来最接近右键,但它仍然表现出一些网络连接没有的奇怪行为。这种方法似乎在70%的时间内都有效(在测试和测试系统中)。
从完全黑客的方法来看,我发现的最好的不是使用ToggleNIC所做的技术,而是使用IShellFolder的东西 - 这允许你使用与语言无关的GetCommandString。这个问题是在XP下GetCommandString没有返回任何东西(哦欢乐),但确实看起来'enable'和'disable'的菜单ID是一致的(分别为16和17),所以如果我没有GetCommandString ,我刚回到菜单ID。要切换,只需使用字符串调用InvokeCommand(如果返回一个字符串),或者调用菜单ID(如果没有)。这个问题就像普通的Windows方式一样,有时它不起作用,它也没有给你任何指示正在发生的事情或它失败的原因。这种方法似乎在70%的时间内起作用,但是如果出现问题则更难判断,加上正常的“启用接口......”文本会弹出。
希望这有助于其他任何人 - 如果有人设法找到另一种在更多情况下有效的方式,我很乐意听到它!
答案 1 :(得分:1)
尝试“ Shell网络接口”C ++ - 代码here。这应该在XP及更高版本下工作。
答案 2 :(得分:1)
它帮助解决了我至少从OpenVPN启用和禁用TAP适配器的问题。
答案 3 :(得分:1)
'==========================================================================
' 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"
答案 4 :(得分:1)
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);
答案 5 :(得分:0)
ToggleNic通过COM使用Shell32。 在c中,它使用标准库“SHLOBJ.H”“SHELLAPI.H”和类IShellDispatch。
答案 6 :(得分:0)
发现这个基本上是右键点击自动化的解决方案: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