获取当前网络连接的属性

时间:2013-10-07 23:39:29

标签: c# networking network-programming

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

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

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

计算机上的

Enumerating the NICs不是问题,但这不能解决我的问题 - 我需要获取连接的属性,而不是物理设备< / em>的。

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

1 个答案:

答案 0 :(得分:11)

您可以将Network List Manager API用于此目的,从C#import Network List Manager类型库中使用它(要直接编译此示例,请取消选中参考属性中的Embed interop类型)。

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

以下是示例代码:

  var manager = new NetworkListManagerClass();
  var connectedNetworks = manager.GetNetworks(NLM_ENUM_NETWORK.NLM_ENUM_NETWORK_CONNECTED).Cast<INetwork>();
  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<INetFwService>();
  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 !");
}