使用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()等方法。我从哪里开始?
答案 0 :(得分:2)
可能有点简单,但是你可以从新进程调用ipconfig / renew吗?
Process.Start("ipconfig", "/renew");
或者,这个类似的问题讨论了使用netsh,我猜你也可以从一个进程调用How to disable (or reset) a network adapter programmatically in C#
答案 1 :(得分:2)
经过一番搜索和实验,我发现了这篇博文:
Disable/Enable Network Connections Under 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" />
答案 2 :(得分:1)
您需要Win32 API:
示例代码:
MIB_TCPROW row = new MIB_TCPROW();
row.dwState = TcpState.DeleteTcb;
row.dwLocalAddr = ...;
row.dwLocalPort = ...;
row.dwRemoteAddr = ...;
row.dwRemotePort = ...;
SetTcpEntry(ref row);