如何唯一地识别不是* VPN连接的网络连接?

时间:2016-08-25 18:51:32

标签: c# network-programming

我尝试在运行时跟踪所有当前网络连接,但我想排除VPN连接。

我还需要能够识别所连接的网络,因此我使用NetworkListManagerClass()来构建当前连接列表:

var manager = new NetworkListManagerClass();
var connectedNetworks = manager.GetNetworks(NLM_ENUM_NETWORK.NLM_ENUM_NETWORK_CONNECTED).Cast<INetwork>();

我相信我可以通过检查NetworkInterfaceType类的NetworkInterface来确定连接适配器是否适用于VPN:

NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces().Where(n => n.OperationalStatus == OperationalStatus.Up).ToArray();

      foreach (NetworkInterface n in interfaces)
      {
          if (n.NetworkInterfaceType == NetworkInterfaceType.Tunnel || n.NetworkInterfaceType == NetworkInterfaceType.PPP)
          {

          }
      }

然而,仅仅知道接口是VPN还是不是VPN是不够的。我需要能够跟踪非VPN接口连接的网络详细信息。

例如:

我们打电话给我的工作网络&#34; officenetwork&#34;。我们打电话给我的家庭网络&#34; homenetwork&#34;。

如果我正在工作,我可以通过根据NetworkListManagerClass状态检查NLM_ENUM_NETWORK_CONNECTED来查看我已连接到 officenetwork 。我的应用程序应该知道 officenetwork 是我当前的本地网络,并将存储和引用特定于该网络的设置。

同样,如果我在家,我应该能够看到 homenetwork ,并存储和引用一组特定于该网络的不同设置。

但是,如果我在家,并且使用VPN连接 officenetwork ,则根据NetworkListManagerClass状态检查NLM_ENUM_NETWORK_CONNECTED将同时显示< em> homenetwork 和 officenetwork 。由于与 officenetwork 的连接是VPN,我需要忽略它,并且只存储和引用 homenetwork 的设置。

此软件适用于将连接到我不了解的网络的用户,因此我无法假设特定VPN或网络的连接数据。

如何检查当前网络连接并仅识别 VPN连接的网络,以便我可以存储该网络的自定义设置?

1 个答案:

答案 0 :(得分:2)

INetwork实例,您可以使用INetworkConnections方法获取连接列表(GetNetworkConnections个实例)。

然后,使用INetworkConnection::GetAdapterId method,您可以获得代表适配器ID的Guid。适配器ID实际上与NetworkInterface.Id Property匹配(它是一个字符串,但您可以将其转换为Guid)。

以下是转储所有网络及其连接以及接口属性(类型,名称等)的示例控制台应用程序:

class Program
{
    static void Main(string[] args)
    {
        var mgr = new NetworkListManager();
        foreach (INetwork network in mgr.GetNetworks(NLM_ENUM_NETWORK.NLM_ENUM_NETWORK_ALL))
        {
            Console.WriteLine("Network: " + network.GetName());
            foreach (INetworkConnection conn in network.GetNetworkConnections())
            {
                Console.WriteLine(" Adapter Id:  " + conn.GetAdapterId());
                var ni = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(i => new Guid(i.Id) == conn.GetAdapterId());
                Console.WriteLine(" Interface: " + ni.Name);
                Console.WriteLine(" Type: " + ni.NetworkInterfaceType);
            }
        }
    }
}