关于 c#:我如何唯一标识*不是* VPN 连接的网络连接?

How do I uniquely identify only network connections that are *not* VPN connections?

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

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

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

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

1
2
3
4
5
6
7
8
9
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 接口连接到的网络的详细信息。

例如:

我们将把我的工作网络称为"officenetwork"。我们将把我的家庭网络称为"homenetwork"。

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

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

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

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

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


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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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);
            }
        }
    }
}