【问题标题】:How can I know whether a VPN connection is established or not?我如何知道是否建立了 VPN 连接?
【发布时间】:2012-08-26 23:47:42
【问题描述】:

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

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

【问题讨论】:

    标签: c# network-programming vpn


    【解决方案1】:

    如果存在 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");
    }
    

    【讨论】:

      【解决方案2】:

      对我来说,我发现这很有帮助,但我想在遍历所有接口并找到已启动的接口后检查特定的 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;
                              }                           
                          }
                      }
                  }
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 在 Windows 上添加 cmd ipconfig /all 以显示适配器的描述,然后可以将“TAP-Windows 适配器”字符串更改为您选择的 VPN,例如"PANGP 虚拟以太网适配器"
          【解决方案5】:

          我使用 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 是完整的模块路径。
          • 这不适用于 NordVPN 等某些 vpn。
          猜你喜欢
          • 2018-12-05
          • 1970-01-01
          • 1970-01-01
          • 2016-10-08
          • 1970-01-01
          • 2012-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多