Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 以编程方式禁用/启用网络接口_C++_Windows_Windows Vista_Windows Xp_Nic - Fatal编程技术网

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

C++ 以编程方式禁用/启用网络接口,c++,windows,windows-vista,windows-xp,nic,C++,Windows,Windows Vista,Windows Xp,Nic,我正试图想出一个解决方案,以编程方式启用/禁用网卡-我做了大量的研究,似乎没有任何解决方案在XP和Vista环境中都是可行的。我要说的是,如果你进入控制面板“网络连接”,右键单击其中一个并选择启用或禁用。理想情况下,我想使用一个库,但如果情况变得更糟,我想我可以调用命令行应用程序,但这绝对是最糟糕的情况。以下是我迄今为止所做的尝试以及失败的原因: 前一职位: 列出了两个方法-第一个是使用netsh,它似乎与使用IPHelper函数SetIfEntry()相同。问题是,它将接口设置为管理启用或禁

我正试图想出一个解决方案,以编程方式启用/禁用网卡-我做了大量的研究,似乎没有任何解决方案在XP和Vista环境中都是可行的。我要说的是,如果你进入控制面板“网络连接”,右键单击其中一个并选择启用或禁用。理想情况下,我想使用一个库,但如果情况变得更糟,我想我可以调用命令行应用程序,但这绝对是最糟糕的情况。以下是我迄今为止所做的尝试以及失败的原因:

前一职位:

列出了两个方法-第一个是使用netsh,它似乎与使用IPHelper函数SetIfEntry()相同。问题是,它将接口设置为管理启用或禁用,而不是正常的启用/禁用,因此实际上不会关闭NIC

提出的另一个解决方案是使用WMI,特别是Win32_NetworkAdapter类,该类具有启用和禁用方法:

很好,对吧?在Vista中运行良好,这些方法在普通XP安装中不存在

另一个建议是使用DevCon,它实际上使用了SetupAPI,特别是带有DICS_启用的SetupDiSetClassInstallParams()。在这个精彩的课程上花了无数个小时,并试图在全局级别和特定配置级别(以及每种组合)禁用/启用设备后,它也无法始终工作-有时工作正常,但有时在设备管理器中禁用设备,但仍然让它在网络连接中运行

然后我尝试使用INetConnection接口,特别是INetConnection->Connect/Disconnect:

但我从来没有能够让这对我的Vista或XP测试盒上的连接产生任何影响

最后,我找到了这个名为ToggleNic的C#脚本:

看起来它正在通过外壳,以某种方式有效地导致右键单击行为。限制(至少是这个实现)是它在非英语系统上不能工作(没有修改),我需要我的系统来处理。公平地说,这个解决方案看起来是最可行的,但是我对C语言的熟悉度很低,如果它使用的API在C++中可用,我找不到。
<> P>任何帮助或洞察力都将被极大地理解,或者关于如何实现C++中的ToGLGEN脚本的想法。谢谢

试试“Shell网络接口”C++代码。这应该在XP及更高版本下工作。

ToggleNic通过COM使用Shell32。
在c语言中,标准库“SHLOBJ.H”“SHELLAPI.H”和类IShellDispatch使用了此功能。

在更多平台和方法上测试后,我基本上放弃了此功能(至少出于我的目的)。对我来说,问题是我想要在90%以上的情况下都能工作的东西,而现实是,我能想到的一切,都接近70%。具有讽刺意味的是,通过普通的Windows方法,它实际上是一样脆弱的。对于那些仍想走上这条危险道路的人,我发现:

在上面描述的API direct方法中,工作最稳定的方法是使用SetupAPI(SetupDiSetClassInstallParams)——我遇到的最大问题是,有时它会处于需要重新启动的状态,并且在重新启动之前不会有任何更改。在使用时,唯一需要注意的是,设备有两个配置文件,因此在某些情况下需要切换它们。DDK包含devcon工具的源代码,它精确地向您展示了如何执行所有操作。这最终看起来像是最接近右键点击,但它仍然表现出一些网络连接没有表现出的奇怪行为。这种方法似乎在70%的时间内有效(在测试和测试系统中)

从总体黑客方法来看,我发现最好的方法不是使用ToggleNIC所使用的技术,而是使用IShellFolder的东西——这允许您使用独立于语言的GetCommandString。问题是,在XP下GetCommandString不会返回任何内容(哦,很高兴),但“启用”和“禁用”的菜单ID似乎是一致的(分别为16和17),因此如果我无法获取CommandString,我就返回菜单ID。要切换,只需调用InvokeCommand,如果返回字符串,则使用字符串;如果未返回,则使用菜单ID。问题是,就像正常的Windows方式一样,有时它不起作用,也不能告诉您发生了什么或它失败的原因。这种方法在大约70%的时间里似乎也能奏效,但如果出现问题就更难判断了,再加上正常的“启用界面…”文本会弹出


希望这能帮助其他人——如果有人能找到另一种在更多情况下有效的方法,我很乐意听到

经过多次搜索,我开始深入研究DEVCON。在意识到这些方法必须是可pinvokable之后,我进行了一些搜索,发现:


它至少帮助我解决了从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"
适用于Windows XP和Windows 7

还有一个是Novell写的,是DevCon上面的一个包装器:

这就是我上面提到的INetConnection接口——该链接说它是Shell API,但实际上它是Internet连接防火墙的一部分。。。正如我上面的链接提到的,它有两个问题——第一个问题是,它不起作用(似乎没有启用或禁用任何东西),第二个问题是它被Windows防火墙API取代,它没有类似的功能。我发现ToggleNIC解决方案非常可靠,但有趣的是,我只看到“启用界面”。
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);