How do I uniquely identify only network connections that are *not* VPN connections?
我正在尝试在运行时跟踪所有当前网络连接,但我想排除 VPN 连接。
我还需要能够识别正在连接的网络,所以我正在使用
1 2 | var manager = new NetworkListManagerClass(); var connectedNetworks = manager.GetNetworks(NLM_ENUM_NETWORK.NLM_ENUM_NETWORK_CONNECTED).Cast<INetwork>(); |
我相信我可以通过检查
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"。
如果我在工作,我可以通过根据
同样,如果我在家,我应该能够看到家庭网络,并存储和引用一组特定于该网络的不同设置。
但是,如果我在家,并且使用 VPN 连接到 officenetwork,则根据
此软件适用于将连接到我一无所知的网络的用户,因此我无法假设特定 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); } } } } |