【问题标题】:Get name of network that a network interface is connected to获取网络接口连接到的网络名称
【发布时间】:2017-01-30 19:28:59
【问题描述】:

在 Windows 控制面板中,您可以找到显示以下内容的网络接口/连接列表:

在 .NET 框架中,这些在 NetworkInterface 类中表示(并通过 NetworkInterface.GetAllNetworkInterfaces 找到)。

作为参考,假设我正在从以太网接口读取属性 - NetworkInterface.Name 属性返回 "Ethernet"NetworkInterface.Description 属性返回 "Realtek PCIe FE Family Controller"

然而,课堂上似乎没有任何东西能够让我知道它所连接的网络的名称(在本例中为 "BELL024")。我将如何获得该字符串?我必须知道该接口与哪个网络相关联,而不仅仅是现有网络的列表。

【问题讨论】:

  • 网络没有名称,它们有网络地址。 DNS 服务器上可能有网络的 DNS 名称,但这不是网络固有的,DNS 服务器可能有多个网络名称,或者不同的 DNS 服务器可能有不同的网络名称。主机所称的网络是相当随意的。用户可以将 Wi-Fi 网络重命名为以太网,反之亦然。
  • 我明白了。 Windows/此主机如何确定网络的字符串“BELL024”?用户是否可以重命名它对我来说并不重要,我只希望它显示在网络接口名称旁边,以便他们可以轻松判断应用程序将流量引导到哪个网络。
  • 这是有人在 Windows 中输入的。它可能是 Windows 发现的 Windows 工作组。如果是工作组名,可以存在多个接口。
  • 看来我正在寻找的是路由器/调制解调器正在使用的 SSID。我可能是错的,但我会再调查一下。
  • 这是可能的。那只能在Wi-Fi网络上。以太网上没有这样的概念。您还可以在 Wi-Fi 上看到多个 SSID,如果进行新的关联,该界面上的 SSID 可能会发生变化。

标签: c# .net networking interface


【解决方案1】:

事实证明,每个网络的信息都被 Windows 存储为“网络配置文件”,存储其名称和其他信息,例如它是否公开。用户可以在控制面板中更改名称,但在我的情况下,这不是问题。

Microsoft 的 Windows API 代码包 包含获取网络配置文件集合所需的 API。因为它包含很多我不需要的臃肿,所以包装 Windows API can be found here 的最少代码。

然后可以像这样找到网络配置文件的集合:

//Get the networks that are currently connected to
var networks = NetworkListManager.GetNetworks(NetworkConnectivityLevels.Connected);

集合中的每个对象都代表一个网络配置文件,并包含NetworkConnection 对象的集合。每个NetworkConnection 对象似乎是有关接口与基础网络连接的信息。

foreach(Network network in networks)
{
    //Name property corresponds to the name I originally asked about
    Console.WriteLine("[" + network.Name + "]");

    Console.WriteLine("\t[NetworkConnections]");
    foreach(NetworkConnection conn in network.Connections)
    {
        //Print network interface's GUID
        Console.WriteLine("\t\t" + conn.AdapterId.ToString());
    }
}

NetworkConnection.AdapterId 属性与NetworkInterface.Id 属性知道的网络接口 GUID 相同。

因此,您可以通过检查其中一个网络连接是否具有与该接口相同的 ID 来确定接口连接到哪个网络。请注意,它们的表示方式不同,因此您需要做更多的工作:

在上面的例子中,我的 Wi-Fi 和以太网接口都连接到了 BELL024 网络。

【讨论】:

  • 提示:Guid.Parse 可以轻松地将NetworkInterface.Id 字符串转换为与 NetworkConnection.AdapterId 相同的类型,然后是 Guid.Equals(...)
【解决方案2】:

您可以使用 WMI 来查询您的网络名称。您可以将此代码用作示例:

ManagementScope oMs = new ManagementScope();  
ObjectQuery oQuery =  
    new ObjectQuery("Select * From Win32_NetworkAdapter");  
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs, oQuery);  
ManagementObjectCollection oReturnCollection = oSearcher.Get();  
foreach (ManagementObject oReturn in oReturnCollection) 
{
    if (oReturn.Properties["NetConnectionID"].Value != null)  
        {
            Console.WriteLine("Name : " + oReturn.Properties["NetConnectionID"].Value);
        }
} 

【讨论】:

  • 这似乎只返回网络接口的名称(与NetworkInterface.Name 属性相同)。我遍历了该方法具有的所有可能属性,但不幸的是,它们都没有提供我正在寻找的网络的名称。
【解决方案3】:

在 Windows 8 和 Windows 2012 及更高版本上,您可以从 root/StandardCimv2 命名空间查询 WMI 类 MSFT_NetConnectionProfile

将其转换为 C# 应该不会太难。

Get-WmiObject -Namespace root/StandardCimv2 -Class MSFT_NetConnectionProfile | Format-Table InterfaceAlias, Name

【讨论】:

    猜你喜欢
    • 2011-06-15
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    相关资源
    最近更新 更多