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

本文关键字:连接 识别 网络 VPN 不是 何唯一 唯一 | 更新日期: 2023-09-27 18:04:06

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

我需要能够识别正在连接的网络,也,所以我使用NetworkListManagerClass()来构建当前连接的列表:

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

我相信我可以通过检查NetworkInterface类的NetworkInterfaceType来确定连接适配器是否用于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接口连接到的网络的详细信息。

例如:

我们将把我的工作网络称为"办公室网络"。我们将把我的家庭网络称为"家庭网络"。

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

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

然而,如果我在家里,我使用VPN连接到办公室网络,基于NLM_ENUM_NETWORK_CONNECTED状态检查NetworkListManagerClass将显示家庭网络办公室网络。由于到办公室网络的连接是VPN,所以我需要忽略它,只存储和引用家庭网络的设置。

此软件将用于连接到我一无所知的网络的用户,因此我不能假设特定VPN或网络的连接数据。

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

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

从一个inet实例中,您可以使用GetNetworkConnections方法获得连接列表(INetworkConnections实例)。

然后,使用INetworkConnection::GetAdapterId方法,您可以获得表示适配器Id的Guid。适配器Id实际上与NetworkInterface匹配。Id属性(它是一个字符串,但您可以将其转换为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);
            }
        }
    }
}