如何唯一标识仅非VPN连接的网络连接?

3

我希望在运行时跟踪所有当前的网络连接,但我想排除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”。我们将我的家庭网络称为“homenetwork”。
如果我在工作中,可以通过检查基于NLM_ENUM_NETWORK_CONNECTED状态的NetworkListManagerClass来看到我连接到了officenetwork。我的应用程序应该知道officenetwork是我的当前本地网络,并存储和引用特定于该网络的设置。
同样,如果我在家里,我应该能够看到homenetwork,并存储和引用特定于该网络的不同设置。
但是,如果我在家里,并使用VPN连接到officenetwork,那么基于NLM_ENUM_NETWORK_CONNECTED状态检查NetworkListManagerClass将显示homenetwork和officenetwork两个网络。由于与officenetwork的连接是VPN,我需要忽略它,并仅存储和引用homenetwork的设置。
这个软件将面向我一无所知的用户,因此我不能假设特定VPN或网络的连接数据。
我如何检查当前网络连接并仅识别非VPN连接的网络,以便我可以为该网络存储自定义设置?

很抱歉标签不正确;我在评论中指出我不确定是否合适。如果有人能提供关于如何改进问题的建议,我会很感激,因为我不明白为什么会被踩。 - Beofett
2
不用担心标签 - 我已经将其编辑掉了。对于那些给它点踩的人,我很抱歉...那不是我(错误的标签并不值得这样做)。事实上,我认为这是一个非常好的问题 - 给你点赞!+1 - Lynn Crumbling
network.GetNetworkConnections()...GetAdapterId() 是一个 GUID,它与 NetworkInterface.Id 匹配。这是你正在寻找的缺失链接吗? - Simon Mourier
@SimonMourier 是的!那似乎是我缺少的。如果您可以将其作为答案发布,并展示如何访问GetAdapterId()方法,我将非常高兴授予悬赏! - Beofett
1个回答

3

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

然后,使用INetworkConnection::GetAdapterId方法,您可以获取表示适配器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);
            }
        }
    }
}

非常感谢!这正是我所需要的。 - Beofett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接