12

我有一个 VPN 连接。为了建立 VPN 连接,必须执行一个 PPTP.bk 文件。运行此文件并输入凭据后,将建立 VPN 连接。

我正在尝试以编程方式连接和断开 VPN 连接。问题是 Windows 中没有创建 VPN 连接,因此我需要能够随时验证任何 VPN 连接,如果不存在则建立一个。

4

5 回答 5

26

我使用类检查 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!");
            }
        }
    }
}
于 2012-09-01T16:45:54.777 回答
8

稍作修改 - 这是对我有用的代码。

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;
    }
于 2017-08-17T17:47:26.290 回答
4

在我的网络驱动程序Cisco中有描述文本。这是一个更新的版本,只有几行:

public static class VPNCheck
{
    public static bool IsOn()
    {
        return ((NetworkInterface.GetIsNetworkAvailable())
                && NetworkInterface.GetAllNetworkInterfaces()
                                   .FirstOrDefault(ni => ni.Description.Contains("Cisco"))?.OperationalStatus == OperationalStatus.Up);
    }
}
于 2019-09-28T01:42:21.913 回答
0

对我来说,我发现这很有帮助,但我想在遍历所有接口并找到一个 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;
                        }                           
                    }
                }
            }
于 2020-06-04T07:55:29.457 回答
-1

如果 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");
}
于 2020-08-24T12:40:54.470 回答