我有一个 VPN 连接。为了建立 VPN 连接,必须执行一个 PPTP.bk 文件。运行此文件并输入凭据后,将建立 VPN 连接。
我正在尝试以编程方式连接和断开 VPN 连接。问题是 Windows 中没有创建 VPN 连接,因此我需要能够随时验证任何 VPN 连接,如果不存在则建立一个。
我有一个 VPN 连接。为了建立 VPN 连接,必须执行一个 PPTP.bk 文件。运行此文件并输入凭据后,将建立 VPN 连接。
我正在尝试以编程方式连接和断开 VPN 连接。问题是 Windows 中没有创建 VPN 连接,因此我需要能够随时验证任何 VPN 连接,如果不存在则建立一个。
我使用类检查 VPN 连接状态NetworkInterface
。这是我为此目标编写的代码:
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!");
}
}
}
}
稍作修改 - 这是对我有用的代码。
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;
}
在我的网络驱动程序Cisco
中有描述文本。这是一个更新的版本,只有几行:
public static class VPNCheck
{
public static bool IsOn()
{
return ((NetworkInterface.GetIsNetworkAvailable())
&& NetworkInterface.GetAllNetworkInterfaces()
.FirstOrDefault(ni => ni.Description.Contains("Cisco"))?.OperationalStatus == OperationalStatus.Up);
}
}
对我来说,我发现这很有帮助,但我想在遍历所有接口并找到一个 UP 后检查特定的 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;
}
}
}
}
如果 VPN 连接存在且正常,您将始终找到一个名为“<strong>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");
}