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