asp.net core 獲取 MacAddress 地址方法示例
本文告訴大家如何在 dotnet core 獲取 Mac 地址
因?yàn)樵?dotnetcore 是沒(méi)有直接和硬件相關(guān)的,所以無(wú)法通過(guò) WMI 的方法獲取當(dāng)前設(shè)備的 Mac 地址
但是在 dotnet core 可以使用下面的代碼拿到本機(jī)所有的網(wǎng)卡地址,包括物理網(wǎng)卡和虛擬網(wǎng)卡
IPGlobalProperties computerProperties = IPGlobalProperties.GetIPGlobalProperties();
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
Console.WriteLine("Interface information for {0}.{1} ",
computerProperties.HostName, computerProperties.DomainName);
if (nics == null || nics.Length < 1)
{
Console.WriteLine(" No network interfaces found.");
return;
}
Console.WriteLine(" Number of interfaces .................... : {0}", nics.Length);
foreach (NetworkInterface adapter in nics)
{
Console.WriteLine();
Console.WriteLine(adapter.Name + "," + adapter.Description);
Console.WriteLine(String.Empty.PadLeft(adapter.Description.Length, '='));
Console.WriteLine(" Interface type .......................... : {0}", adapter.NetworkInterfaceType);
Console.Write(" Physical address ........................ : ");
PhysicalAddress address = adapter.GetPhysicalAddress();
byte[] bytes = address.GetAddressBytes();
for (int i = 0; i < bytes.Length; i++)
{
// Display the physical address in hexadecimal.
Console.Write("{0}", bytes[i].ToString("X2"));
// Insert a hyphen after each byte, unless we are at the end of the
// address.
if (i != bytes.Length - 1)
{
Console.Write("-");
}
}
Console.WriteLine();
}
運(yùn)行代碼,下面是控制臺(tái)
Interface information for lindexi.github
Number of interfaces .................... : 6
Hyper-V Virtual Ethernet Adapter #4
===================================
Interface type .......................... : Ethernet
Physical address ........................ : 00-15-5D-96-39-03
Hyper-V Virtual Ethernet Adapter #3
===================================
Interface type .......................... : Ethernet
Physical address ........................ : 1C-1B-0D-3C-47-91
Software Loopback Interface 1
=============================
Interface type .......................... : Loopback
Physical address ........................ :
Microsoft Teredo Tunneling Adapter
==================================
Interface type .......................... : Tunnel
Physical address ........................ : 00-00-00-00-00-00-00-E0
Hyper-V Virtual Ethernet Adapter
================================
Interface type .......................... : Ethernet
Physical address ........................ : 5A-15-31-73-B0-9F
Hyper-V Virtual Ethernet Adapter #2
===================================
Interface type .......................... : Ethernet
Physical address ........................ : 5A-15-31-08-13-B1
但是可以看到里面有很多不需要使用的網(wǎng)卡,從 堆棧 網(wǎng)找到的方法獲取當(dāng)前有活躍的 ip 的網(wǎng)卡可以通過(guò)先判斷是不是本地巡回網(wǎng)絡(luò)等,然后判斷有沒(méi)有網(wǎng)絡(luò)
foreach (NetworkInterface adapter in nics.Where(c =>
c.NetworkInterfaceType != NetworkInterfaceType.Loopback && c.OperationalStatus == OperationalStatus.Up))
獲取當(dāng)前的網(wǎng)卡有沒(méi) ip 有 ip 才是需要的
IPInterfaceProperties properties = adapter.GetIPProperties();
var unicastAddresses = properties.UnicastAddresses;
foreach (var temp in unicastAddresses.Where(temp =>
temp.Address.AddressFamily == AddressFamily.InterNetwork))
{
// 這個(gè)才是需要的網(wǎng)卡
}
簡(jiǎn)單輸出網(wǎng)卡使用 adapter.GetPhysicalAddress().ToString() 輸出,如果需要輸出帶連接的請(qǐng)使用 GetAddressBytes 然后自己輸出
下面的代碼是我抽出來(lái)的,可以直接使用
public static void GetActiveMacAddress(string separator = "-")
{
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
//Debug.WriteLine("Interface information for {0}.{1} ",
// computerProperties.HostName, computerProperties.DomainName);
if (nics == null || nics.Length < 1)
{
Debug.WriteLine(" No network interfaces found.");
return;
}
var macAddress = new List<string>();
//Debug.WriteLine(" Number of interfaces .................... : {0}", nics.Length);
foreach (NetworkInterface adapter in nics.Where(c =>
c.NetworkInterfaceType != NetworkInterfaceType.Loopback && c.OperationalStatus == OperationalStatus.Up))
{
//Debug.WriteLine("");
//Debug.WriteLine(adapter.Name + "," + adapter.Description);
//Debug.WriteLine(string.Empty.PadLeft(adapter.Description.Length, '='));
//Debug.WriteLine(" Interface type .......................... : {0}", adapter.NetworkInterfaceType);
//Debug.Write(" Physical address ........................ : ");
//PhysicalAddress address = adapter.GetPhysicalAddress();
//byte[] bytes = address.GetAddressBytes();
//for (int i = 0; i < bytes.Length; i++)
//{
// // Display the physical address in hexadecimal.
// Debug.Write($"{bytes[i]:X2}");
// // Insert a hyphen after each byte, unless we are at the end of the
// // address.
// if (i != bytes.Length - 1)
// {
// Debug.Write("-");
// }
//}
//Debug.WriteLine("");
//Debug.WriteLine(address.ToString());
IPInterfaceProperties properties = adapter.GetIPProperties();
var unicastAddresses = properties.UnicastAddresses;
if (unicastAddresses.Any(temp => temp.Address.AddressFamily == AddressFamily.InterNetwork))
{
var address = adapter.GetPhysicalAddress();
if (string.IsNullOrEmpty(separator))
{
macAddress.Add(address.ToString());
}
else
{
macAddress.Add(string.Join(separator, address.GetAddressBytes()));
}
}
}
}
上面的方法不僅是在 dotnet core 可以使用,在 dotnet framework 程序同樣調(diào)用,但是在 dotnet framework 還可以通過(guò) WMI 獲取
在 dotnet framework 使用 WMI 獲取 MAC 地址方法
var managementClass = new ManagementClass("Win32_NetworkAdapterConfiguration");
var managementObjectCollection = managementClass.GetInstances();
foreach (var managementObject in managementObjectCollection.OfType<ManagementObject>())
{
using (managementObject)
{
if ((bool) managementObject["IPEnabled"])
{
if (managementObject["MacAddress"] == null)
{
return string.Empty;
}
return managementObject["MacAddress"].ToString().ToUpper();
}
}
}
輸出的格式是 5A:15:31:73:B0:9F 同時(shí)輸出是一個(gè)網(wǎng)卡
NetworkInterface.GetPhysicalAddress Method (System.Net.NetworkInformation)
PhysicalAddress Class (System.Net.NetworkInformation)
c# - .NET Core 2.x how to get the current active local network IPv4 address? - Stack Overflow
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Asp.net生成Excel文件并下載(更新:解決使用迅雷下載頁(yè)面而不是文件的問(wèn)題)
Asp.net生成Excel文件并下載(更新:解決使用迅雷下載頁(yè)面而不是文件的問(wèn)題)2012-01-01
http轉(zhuǎn)https的實(shí)戰(zhàn)記錄(iis 7.5)
這篇文章主要給大家介紹了關(guān)于http轉(zhuǎn)https的相關(guān)資料,文中是最近的一次實(shí)戰(zhàn)記錄,基于iis7.5,通過(guò)一步步的圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2018-01-01
Asp.Mvc 2.0實(shí)現(xiàn)用戶(hù)登錄與注銷(xiāo)功能實(shí)例講解(2)
這篇文章主要介紹了Asp.Mvc 2.0實(shí)現(xiàn)用戶(hù)登錄與注銷(xiāo)功能,用戶(hù)登錄方式都是FORM表單驗(yàn)證方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-08-08
asp.net使用ajaxFileUpload插件上傳文件(附源碼)
本文詳細(xì)講解了asp.net使用ajaxFileUpload插件上傳文件,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
asp.net開(kāi)發(fā)與web標(biāo)準(zhǔn)的沖突問(wèn)題的一些常見(jiàn)解決方法
Visual Studio .net從2003到現(xiàn)在的2008,一路走來(lái)慢慢強(qiáng)大……從以前的vs2003能自動(dòng)改亂你的html代碼到現(xiàn)在在vs2008中都能直接對(duì)html代碼進(jìn)行w3c標(biāo)準(zhǔn)驗(yàn)證并提示了,非常不易。2009-02-02

