获取网络接口连接的网络名称

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

network interfaces

在.NET框架中,这些内容由NetworkInterface类表示(并通过NetworkInterface.GetAllNetworkInterfaces找到)。
以太网接口的属性为例 - NetworkInterface.Name属性返回"Ethernet"NetworkInterface.Description属性返回"Realtek PCIe FE Family Controller"
然而,在该类中似乎没有任何方法可以获取它所连接的网络名称(在本例中为"BELL024")。我应该如何获取该字符串?我必须知道接口关联的网络,而不仅仅是存在的网络列表。

网络没有名称,它们有网络地址。DNS服务器上可能会有网络的DNS名称,但这并不是网络固有的属性,一个DNS服务器可以为一个网络拥有多个名称,或者不同的DNS服务器可以为该网络拥有不同的名称。主机所称呼的网络名称相当随意。用户可以将Wi-Fi网络重命名为以太网,反之亦然。 - Ron Maupin
我明白了。Windows/这个主机是如何确定网络中的字符串“BELL024”的?如果用户可以重命名它,对我来说并不重要,我只想让它显示在网络接口名称旁边,以便他们可以轻松地知道应用程序将定向流量到哪个网络。 - sawch
这是某人在Windows中输入的内容。它可能是Windows发现的Windows工作组。如果它是一个工作组名称,它可以存在于多个接口上。 - Ron Maupin
看起来我正在寻找的是路由器/调制解调器正在使用的SSID。我可能错了,但我会再进一步研究一下。 - sawch
那是有可能的。那只会在Wi-Fi网络上出现。以太网上没有这样的概念。您也可以在Wi-Fi上看到多个SSID,并且如果进行新的关联,该接口上的SSID可能会更改。 - Ron Maupin
3个回答

10
每个网络的信息被Windows存储为“网络配置文件”,其中包含其名称和其他信息,例如它是否为公共网络。用户可以在控制面板中更改名称,但在我的情况下这不是问题。
微软的Windows API Code Pack包含获取网络配置文件集合所需的API。因为它包含了很多我不需要的内容,所以最少量的代码来封装Windows API 可以在这里找到
可以像这样找到网络配置文件集合:
//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 来确定接口连接到哪个网络。请注意,它们的表示方式不同,因此您需要进行更多的工作:

example image

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

3
提示:使用Guid.Parse轻松将“NetworkInterface.Id”字符串转换为与NetworkConnection.AdapterId相同的类型,然后使用Guid.Equals(...)进行比较。 - sawch

2
在Windows 8和Windows 2012及更高版本中,您可以从root/StandardCimv2命名空间查询WMI类MSFT_NetConnectionProfile。
将其转换为C#应该不会太困难。
Get-WmiObject -Namespace root/StandardCimv2 -Class MSFT_NetConnectionProfile | Format-Table InterfaceAlias, Name

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”属性相同)。我遍历了该方法可能具有的所有可能属性,但很遗憾,它们都没有提供我正在查找的网络名称。 - sawch
如果你正在寻找一个C#版本的PowerShell命令Get-NetAdapter,那么这就是你的答案。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接