3

使用 C#/.NET 重置网络连接的最佳方法是什么?

我的公司有几台机器与客户通过各种方式(3G、wifi、以太网电缆)连接,有时(尤其是使用 3G)向 Windows 报告他们在没有连接时仍然连接。我有办法检查连接是否真的存在,但我正在努力重置它们。这是一个问题:

var searcher = new ManagementObjectSearcher("select * from Win32_NetworkAdapter");
var managementObject = searcher.Get();
foreach (ManagementObject obj in managementObject)
{
    var name = obj.Properties["Name"].Value.ToString();
    Console.WriteLine(name);
    obj.InvokeMethod("Disable", null);
    obj.InvokeMethod("Enable", null);
}

如您所见,这将通过所有网络适配器并重置它们,我不想这样做。此外,一些适配器不接受 null 参数。

我可以得到我想要的 NetworkInterface 对象:

var interfaces = NetworkInterface.GetAllNetworkInterfaces().Where(ni => ni.IsReceiveOnly == false && 
            ni.OperationalStatus == OperationalStatus.Up && ni.NetworkInterfaceType != NetworkInterfaceType.Loopback);

但是 NetworkInterface 类似乎没有 Start()、Stop()、Reset() 等方法。我从这里去哪里?

4

3 回答 3

3

经过一番搜索和实验,我找到了这篇博文:
在 Vista 下禁用/启用网络连接

这是一种更好的方法。

最重要的是,使用一个名为mgmtclassgen.exe围绕 WMI 类生成包装类的实用程序Win32_NetworkAdapter。在您选择的文件夹中的开发人员命令提示符中使用以下命令:

mgmtclassgen Win32_NetworkAdapter -p NetworkAdapter.cs

生成后,NetworkAdapter.cs您可以将其导入新项目,添加System.Management.dll到项目引用中,并使用以下代码禁用或启用您选择的适配器:

SelectQuery query = new SelectQuery("Win32_NetworkAdapter", "NetConnectionStatus=2");
ManagementObjectSearcher search = new ManagementObjectSearcher(query);
foreach(ManagementObject result in search.Get())
{
    NetworkAdapter adapter = new NetworkAdapter(result);

    // Identify the adapter you wish to disable here. 
    // In particular, check the AdapterType and 
    // Description properties.

    // Here, we're selecting the LAN adapters.
    if (adapter.AdapterType.Equals("Ethernet 802.3")) 
    {
        adapter.Disable();
    }
}

另外请记住,您的程序必须在启用 UAC 的任何系统上以管理员身份运行 - 为此,建议创建应用程序清单。您可以通过将requestedExecutionLevel清单文件中的条目更改为:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
于 2013-08-06T14:17:50.220 回答
2

可能有点简单,但是您可以从新进程调用 ipconfig /renew 吗?

Process.Start("ipconfig", "/renew");

或者,这个类似的问题谈到了使用 netsh,我猜你也可以从进程中调用它How to disable (or reset) a network adapter in programmatically in C#

于 2013-08-06T08:58:28.487 回答
1

你需要 Win32 API:

示例代码:

MIB_TCPROW row = new MIB_TCPROW();
row.dwState = TcpState.DeleteTcb;
row.dwLocalAddr = ...;
row.dwLocalPort = ...;
row.dwRemoteAddr = ...;
row.dwRemotePort = ...;
SetTcpEntry(ref row);
于 2013-08-06T09:51:58.133 回答