【问题标题】:How do I uniquely identify only network connections that are *not* VPN connections?如何唯一标识*不是* VPN 连接的网络连接?
【发布时间】:2017-01-02 07:49:52
【问题描述】:

我正在尝试在运行时跟踪所有当前网络连接,但我想排除 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 接口连接的网络的详细信息。

例如:

我们将我的工作网络称为“officenetwork”。我们将我的家庭网络称为“家庭网络”。

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

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

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

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

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

【问题讨论】:

  • 抱歉标签不正确;我在 cmets 中表示我不确定它是否合适。如果有人可以就如何改进问题提出建议,我将不胜感激,因为我不明白投反对票的原因。
  • 不用担心标签——我只是把它编辑掉了。对不起,谁投了反对票……不是我(不正确的标签不值得。)如果事实上,我认为这是一个写得很好的问题——请投赞成票! +1
  • network.GetNetworkConnections()...GetAdapterId() 是一个与 NetworkInterface.Id 匹配的 guid。这是您要查找的缺失链接吗?
  • @SimonMourier 是的!这似乎是我所缺少的。如果您可以将其发布为答案,展示如何访问 GetAdapterId() 方法,我将非常乐意奖励赏金!

标签: c# network-programming


【解决方案1】:

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

然后,使用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);
            }
        }
    }
}

【讨论】:

  • 非常感谢!这正是我所需要的。
猜你喜欢
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
相关资源
最近更新 更多