获取当前网络连接的属性

如何确定或检查当前网络连接的连接配置文件(如果有)?

具体来说,我需要确定当前连接是否是私有网络或公共网络,并从那里确定网络发现是打开还是关闭。

看起来这些信息可以通过Windows.Networking.Connectivity.NetworkInformation.GetConnectionProfiles()或NetworkInformation.GetInternetConnectionProfile()函数在Windowsapp store应用中随时可用, 但这是一个必须在Win 7和Server 2008上运行的标准桌面应用以及Win 8和Server 2012。

枚举计算机上的NIC不是问题,但这并不能解决我的问题 – 我需要获取连接的属性,而不是物理设备

是否有一种内置的方式来实现.Net框架? 或者可以用WMI完成吗? 或者作为一种粗略的替代方案,可以通过调用netsh命令来完成(虽然这似乎取决于要运行的dot3svc和/或wlansvc服务)?

您可以使用网络列表管理器API来从C#import网络列表管理器类型库中使用它(要在下面直接编译此示例,请取消选中参考属性中的嵌入互操作类型)。

然后你必须枚举所有连接的网络,因为可以有多个,例如现在我连接到互联网和VPN。 然后对于所有连接的网络调用GetCategory() API,它返回NLM_NETWORK_CATEGORY (私有,公共或域)。

以下是示例代码:

  var manager = new NetworkListManagerClass(); var connectedNetworks = manager.GetNetworks(NLM_ENUM_NETWORK.NLM_ENUM_NETWORK_CONNECTED).Cast(); foreach (var network in connectedNetworks) { Console.Write(network.GetName() + " "); var cat = network.GetCategory(); if (cat == NLM_NETWORK_CATEGORY.NLM_NETWORK_CATEGORY_PRIVATE) Console.WriteLine("[PRIVATE]"); else if (cat == NLM_NETWORK_CATEGORY.NLM_NETWORK_CATEGORY_PUBLIC) Console.WriteLine("[PUBLIC]"); else if (cat == NLM_NETWORK_CATEGORY.NLM_NETWORK_CATEGORY_DOMAIN_AUTHENTICATED) Console.WriteLine("[DOMAIN]"); } Console.ReadKey(); 

对于网络发现,您必须使用防火墙API并引用COM库NetFwTypeLib并获取活动配置文件的INetFwProfile ,然后在服务中有文件共享,网络发现和远程桌面服务,如果这些服务已启用,则会有一个bool标志。 这是示例代码:(只是为了警告你我在生产中没有使用下面的代码我只是在探索这个API)

  Type objectType = Type.GetTypeFromCLSID(new Guid("{304CE942-6E39-40D8-943A-B913C40C9CD4}")); var man = Activator.CreateInstance(objectType) as INetFwMgr; /// get current profile INetFwProfile prof = man.LocalPolicy.CurrentProfile; Console.WriteLine("Current profile "); ShowProfileServices(prof); 

以及显示配置文件服务的方法。

 private static void ShowProfileServices(INetFwProfile prof) { var services = prof.Services.Cast(); var sharing = services.FirstOrDefault(sc => sc.Name == "File and Printer Sharing"); if (sharing != null) Console.WriteLine(sharing.Name + " Enabled : " + sharing.Enabled.ToString()); else Console.WriteLine("No sharing service !"); var discovery = services.FirstOrDefault(sc => sc.Name == "Network Discovery"); if (discovery != null) Console.WriteLine(discovery.Name + " Enabled : " + discovery.Enabled.ToString()); else Console.WriteLine("No network discovery service !"); var remoteDesktop = services.FirstOrDefault(sc => sc.Name == "Remote Desktop"); if (remoteDesktop != null) Console.WriteLine(remoteDesktop.Name + " Enabled : " + remoteDesktop.Enabled.ToString()); else Console.WriteLine("No remote desktop service !"); }