Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何仅唯一标识属于*非*VPN连接的网络连接?_C#_Network Programming - Fatal编程技术网

C# 如何仅唯一标识属于*非*VPN连接的网络连接?

C# 如何仅唯一标识属于*非*VPN连接的网络连接?,c#,network-programming,C#,Network Programming,我试图在运行时跟踪所有当前网络连接,但我想排除VPN连接 我还需要能够识别连接到的网络,因此我正在使用NetworkListManagerClass()构建当前连接的列表: var manager = new NetworkListManagerClass(); var connectedNetworks = manager.GetNetworks(NLM_ENUM_NETWORK.NLM_ENUM_NETWORK_CONNECTED).Cast<INetwork>(); 然而,仅

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

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

var manager = new NetworkListManagerClass();
var connectedNetworks = manager.GetNetworks(NLM_ENUM_NETWORK.NLM_ENUM_NETWORK_CONNECTED).Cast<INetwork>();
然而,仅仅知道一个接口是或不是VPN是不够的。我需要能够跟踪非VPN接口连接到的网络的详细信息

例如:

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

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

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

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

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

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

从实例中,您可以使用该方法获取连接(实例)列表

然后,使用可以获得表示适配器Id的Guid。适配器Id实际上与匹配(它是字符串,但可以将其转换为Guid)

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


对不起,标签不正确;我在评论中表示,我不确定这是否合适。如果有人能就如何改进这个问题提出建议,我将不胜感激,因为我不理解投票被否决的原因。不用担心标签,我只是把它删掉了。对不起,不管是谁否决了它。。。不是我(一个不正确的标签不值得这么做。)如果事实是这样,我认为这是一个写得很好的问题——投赞成票+1network.GetNetworkConnections()…GetAdapterId()是与NetworkInterface.Id匹配的guid。这是你正在寻找的丢失的链接吗?@SimonMourier是的!这似乎是我所缺少的。如果你能把它作为一个答案,展示如何访问
GetAdapterId()
方法,我将非常高兴地奖励你!非常感谢!这正是我所需要的。
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)
          {

          }
      }
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);
            }
        }
    }
}