C# 获取网络接口连接到的网络的名称

C# 获取网络接口连接到的网络的名称,c#,.net,networking,interface,C#,.net,Networking,Interface,在Windows控制面板中,您可以找到网络接口/连接的列表,其中显示以下内容: 在.NET framework中,它们在NetworkInterface类中表示(可通过NetworkInterface.getAllNetworkInterface找到) 作为参考,假设我正在从Ethernet接口读取属性-NetworkInterface.Name属性返回“Ethernet”,NetworkInterface.Description属性返回“Realtek PCIe FE系列控制器” 但是,类中

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

在.NET framework中,它们在
NetworkInterface
类中表示(可通过
NetworkInterface.getAllNetworkInterface
找到)

作为参考,假设我正在从Ethernet接口读取属性-NetworkInterface.Name属性返回
“Ethernet”
,NetworkInterface.Description属性返回
“Realtek PCIe FE系列控制器”


但是,类中似乎没有任何内容能够为我获取它所连接的网络的名称(在本例中为
“BELL024”
)。我怎么才能拿到那根绳子呢?我必须知道接口与哪个网络相关联,而不仅仅是现有网络的列表。

您可以使用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);
        }
} 

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

Microsoft提供的Windows API代码包包含获取网络配置文件集合所需的API。因为它包含了很多我不需要的膨胀,所以包装WindowsAPI的代码非常简单

然后可以找到网络配置文件的集合,如下所示:

//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网络。

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

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


网络没有名称,它们有网络地址。DNS服务器上可能有网络的DNS名称,但这不是网络固有的名称,并且DNS服务器可能有多个网络名称,或者不同的DNS服务器可能有不同的网络名称。主机所称的网络是相当随意的。用户可以将Wi-Fi网络重命名为以太网,反之亦然。我明白了。Windows/此主机如何确定网络的字符串“BELL024”?用户是否可以重命名它对我来说无关紧要,我只希望它与网络接口名称一起显示,这样他们就可以轻松地知道应用程序将把流量定向到哪个网络。这是有人在Windows中输入的内容。Windows发现的可能是Windows工作组。如果它是一个工作组名称,那么它可能存在于多个接口上。看起来我要查找的是路由器/调制解调器正在使用的SSID。我可能错了,但我会进一步调查。这是可能的。这只能在Wi-Fi网络上实现。以太网上没有这样的概念。您还可以在Wi-Fi上看到多个SSID,如果建立新关联,该接口上的SSID可能会更改。这似乎只返回网络接口的名称(与
NetworkInterface.name
property相同)。我遍历了该方法所有可能的属性,但不幸的是,它们都没有提供我要查找的网络的名称。提示:Guid.Parse可轻松将
NetworkInterface.Id
string转换为与NetworkConnection.AdapterId相同的类型,然后是Guid.Equals(…)
Get-WmiObject -Namespace root/StandardCimv2 -Class MSFT_NetConnectionProfile | Format-Table InterfaceAlias, Name