【发布时间】:2012-08-26 23:47:42
【问题描述】:
我有一个 VPN 连接。为了建立 VPN 连接,必须执行一个 PPTP.bk 文件。运行此文件并输入凭据后,VPN 连接就建立了。
我正在尝试以编程方式连接和断开 VPN 连接。 问题是在 Windows 中没有创建 VPN 连接,因此我需要能够随时验证任何 VPN 连接,如果不存在则建立一个。
【问题讨论】:
标签: c# network-programming vpn
我有一个 VPN 连接。为了建立 VPN 连接,必须执行一个 PPTP.bk 文件。运行此文件并输入凭据后,VPN 连接就建立了。
我正在尝试以编程方式连接和断开 VPN 连接。 问题是在 Windows 中没有创建 VPN 连接,因此我需要能够随时验证任何 VPN 连接,如果不存在则建立一个。
【问题讨论】:
标签: c# network-programming vpn
如果存在 VPN 连接且连接正常,您将始终找到一个名为“tun0”的网络接口。所以使用NetworkInterface的相同方法,我写了一个简单的代码:
public static boolean isVpnOk(){
List<String> networks = new ArrayList<>();
try {
for (NetworkInterface networkInterface : Collections.list(NetworkInterface.getNetworkInterfaces())) {
if (networkInterface.isUp()) networks.add(networkInterface.getName());
}
} catch (Exception e) {
e.printStackTrace();
}
return networks.contains("tun0");
}
【讨论】:
对我来说,我发现这很有帮助,但我想在遍历所有接口并找到已启动的接口后检查特定的 VPN 名称...
if (NetworkInterface.GetIsNetworkAvailable())
{
NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface Interface in interfaces)
{
if (Interface.OperationalStatus == OperationalStatus.Up)
{
if (Interface.Description.Contains("VPN_Name"))
{
connected = true;
break;
}
}
}
}
【讨论】:
在我的网络驱动程序中,描述文本中有Cisco。这是一个更新的版本,只有几行:
public static class VPNCheck
{
public static bool IsOn()
{
return ((NetworkInterface.GetIsNetworkAvailable())
&& NetworkInterface.GetAllNetworkInterfaces()
.FirstOrDefault(ni => ni.Description.Contains("Cisco"))?.OperationalStatus == OperationalStatus.Up);
}
}
【讨论】:
稍作修改 - 这是对我有用的代码。
public bool CheckForVPNInterface()
{
if (NetworkInterface.GetIsNetworkAvailable())
{
NetworkInterface[] interfaces =
NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface Interface in interfaces)
{
// This is the OpenVPN driver for windows.
if (Interface.Description.Contains("TAP-Windows Adapter")
&& Interface.OperationalStatus == OperationalStatus.Up)
{
return true;
}
}
}
return false;
}
【讨论】:
ipconfig /all 以显示适配器的描述,然后可以将“TAP-Windows 适配器”字符串更改为您选择的 VPN,例如"PANGP 虚拟以太网适配器"
我使用 NetworkInterface 类检查 VPN 连接状态。这是我为此目的编写的代码:
if (NetworkInterface.GetIsNetworkAvailable())
{
NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface Interface in interfaces)
{
if (Interface.OperationalStatus == OperationalStatus.Up)
{
if ((Interface.NetworkInterfaceType == NetworkInterfaceType.Ppp) && (Interface.NetworkInterfaceType != NetworkInterfaceType.Loopback))
{
IPv4InterfaceStatistics statistics = Interface.GetIPv4Statistics();
MessageBox.Show(Interface.Name + " " + Interface.NetworkInterfaceType.ToString() + " " + Interface.Description);
}
else
{
MessageBox.Show("VPN Connection is lost!");
}
}
}
}
【讨论】:
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable 是完整的模块路径。