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

Mar*_*ark 18 c++ windows nic windows-xp windows-vista

我正在尝试提出一种以编程方式启用/禁用网卡的解决方案 - 我已经做了大量研究,在XP和Vista环境中似乎都没有什么可行的解决方案.我所说的是如果你进入控制面板的"网络连接",右键单击一个并选择启用或禁用.理想情况下我想使用一个库,但如果情况更糟,我想我可以调用命令行应用程序,但这绝对是最糟糕的情况.这是我到目前为止所尝试的以及他们失败的地点/原因:

这篇上一篇文章:

如何以编程方式启用/禁用网络接口?(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-> Connect/Disconnect:

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++中的功能的想法.谢谢!

Mar*_*ark 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%的时间内都有效,但是如果出现问题则更难判断,加上正常的"启用接口......"文本会弹出.

希望这可以帮助其他人 - 如果有人设法找到另一种在更多情况下工作的方式,我很乐意听到它!