如何判断VPN连接是否已建立?

14

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

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

4个回答

28

我使用 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!");
            }
        }
    }
}

2
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable 是完整的模块路径。 - Mick
这对于一些 VPN(如 NordVPN)无效。 - smedasn
检查 NetworkInterfaceType 是否等于 Ppp,然后再检查 NetworkInterfaceType 是否不等于 Loopback 有什么意义? - brz
@breez,说得好。我不知道!我猜可能是从我的一个更大的代码库中刮下来的,最终我没有做好,因此留下了那一部分。 - Hossein

10

稍作修改 - 这是适用于我的代码。

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;
    }

1
在Windows上添加,使用命令“ipconfig /all”来显示您的适配器描述,然后可以将“TAP-Windows Adapter”字符串更改为您选择的VPN,例如“PANGP Virtual Ethernet Adapter”。 - Slate

5

我的网络驱动程序说明文本中有Cisco。这里是一个更加实时的版本,仅仅只有几行:

public static class VPNCheck
{
    public static bool IsOn()
    {
        return ((NetworkInterface.GetIsNetworkAvailable())
                && NetworkInterface.GetAllNetworkInterfaces()
                                   .FirstOrDefault(ni => ni.Description.Contains("Cisco"))?.OperationalStatus == OperationalStatus.Up);
    }
}

1
对我来说,我觉得这个很有帮助,但是在遍历所有接口并找到状态为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;
                        }                           
                    }
                }
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接