以编程方式禁用/启用网络接口

时间:2009-05-13 22:07:26

标签: c++ windows windows-vista windows-xp nic

我正在努力想出一个以编程方式启用/禁用网卡的解决方案 - 我已经做了大量的研究,在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 ++中的功能的想法。谢谢!

7 个答案:

答案 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)

经过多次搜索,我开始深入研究DEVCON。在意识到这些方法必须是可以发现之后我做了一点搜索并发现了这个: http://www.codeproject.com/KB/cs/HardwareHelper.aspx

它帮助解决了我至少从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