C#獲取電腦網(wǎng)卡MAC地址的方法詳解
本文將詳細(xì)介紹在C#中如何獲取電腦MAC地址的方法,包含完整代碼示例和實(shí)際開(kāi)發(fā)中的注意事項(xiàng)。
一、什么是MAC地址
MAC地址(Media Access Control Address)是網(wǎng)絡(luò)接口的物理地址,由48位二進(jìn)制數(shù)組成,通常表示為6組十六進(jìn)制數(shù)(如 00:1A:2B:3C:4D:5E)。每個(gè)網(wǎng)卡出廠時(shí)都被分配了全球唯一的MAC地址,常用于設(shè)備識(shí)別、網(wǎng)絡(luò)管理和安全認(rèn)證等場(chǎng)景。
二、推薦方案:使用 NetworkInterface 類
.NET Framework 提供了 System.Net.NetworkInformation 命名空間,這是獲取MAC地址最標(biāo)準(zhǔn)、跨平臺(tái)兼容性最好的方式
2.1 獲取電腦可用網(wǎng)卡MAC地址
/// <summary>
/// 獲取電腦MAC地址
/// </summary>
/// <returns></returns>
public static List<string> GetMacByWmi()
{
string key = "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\";
List<string> macList = new List<string>();
try
{
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface adapter in nics)
{
if (adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet && adapter.GetPhysicalAddress().ToString().Length != 0)
{
string fRegistryKey = key + adapter.Id + "\\Connection";
RegistryKey rk = Registry.LocalMachine.OpenSubKey(fRegistryKey, false);
if (rk != null)
{
//string fPnpInstanceID = rk.GetValue("PnpInstanceID", "").ToString();
//if (fPnpInstanceID.Length > 3 && fPnpInstanceID.Substring(0, 3) == "PCI")
{
string macAddress = adapter.GetPhysicalAddress().ToString();
for (int i = 1; i < 6; i++)
{
macAddress = macAddress.Insert(3 * i - 1, "-");
}
macList.Add(macAddress);
//break;
}
}
}
}
}
catch (Exception ex)
{
}
return macList;
}
2.2 調(diào)試結(jié)果

2.3 常見(jiàn)網(wǎng)卡類型枚舉
| 類型 | 說(shuō)明 |
|---|---|
Ethernet | 有線以太網(wǎng) |
Wireless80211 | WiFi無(wú)線網(wǎng)卡 |
Loopback | 本地回環(huán)接口 |
Tunnel | 虛擬隧道接口 |
三、常見(jiàn)問(wèn)題與注意事項(xiàng)
3.1 虛擬網(wǎng)卡過(guò)濾
現(xiàn)代電腦常有多個(gè)虛擬網(wǎng)卡(VMware、VirtualBox、VPN等),建議過(guò)濾掉這些以獲取真實(shí)物理網(wǎng)卡
// 排除虛擬網(wǎng)卡的關(guān)鍵字
string[] virtualKeywords = {
"virtual", "vmware", "hyper-v", "virtualbox",
"vpn", "tunnel", "tap-windows", "wireguard"
};
3.2 MAC地址格式轉(zhuǎn)換
// 原始格式: 001A2B3C4D5E
string raw = "001A2B3C4D5E";
// 轉(zhuǎn)換為冒號(hào)格式: 00:1A:2B:3C:4D:5E
string colon = string.Join(":", Enumerable.Range(0, 6)
.Select(i => raw.Substring(i * 2, 2)));
// 轉(zhuǎn)換為連字符格式: 00-1A-2B-3C-4D-5E
string hyphen = string.Join("-", Enumerable.Range(0, 6)
.Select(i => raw.Substring(i * 2, 2)));
3.3 權(quán)限問(wèn)題
在普通用戶權(quán)限下通??梢哉+@取MAC地址
某些企業(yè)環(huán)境或安全軟件可能限制訪問(wèn),建議添加異常處理
3.4 多網(wǎng)卡環(huán)境
筆記本電腦通常同時(shí)具有有線和無(wú)線網(wǎng)卡,建議:
- 優(yōu)先選擇 OperationalStatus.Up 的網(wǎng)卡
- 按連接速度排序,選擇最快的網(wǎng)卡
- 排除Loopback和虛擬網(wǎng)卡
四、總結(jié)
在大多數(shù)場(chǎng)景下,推薦使用 NetworkInterface 類獲取MAC地址,它簡(jiǎn)單、可靠且跨平臺(tái)兼容。
到此這篇關(guān)于C#獲取電腦網(wǎng)卡MAC地址的方法詳解的文章就介紹到這了,更多相關(guān)C#獲取電腦網(wǎng)卡MAC地址內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
通過(guò)C#獲取Excel單元格的數(shù)據(jù)類型的方法詳解
在處理 Excel 文件時(shí),了解單元格的數(shù)據(jù)類型有助于我們正確地解析和處理數(shù)據(jù),本文將詳細(xì)介紹如何使用 Free Spire.XLS 來(lái)獲取 Excel 單元格的數(shù)據(jù)類型,幫助開(kāi)發(fā)者精準(zhǔn)地識(shí)別數(shù)據(jù)類型,確保數(shù)據(jù)處理的準(zhǔn)確性,需要的朋友可以參考下2025-05-05
C#實(shí)現(xiàn)MQTT服務(wù)端與客戶端通訊功能
這篇文章介紹了C#實(shí)現(xiàn)MQTT服務(wù)端與客戶端通訊的功能,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01
使用C#和SQL Server實(shí)現(xiàn)自動(dòng)清理功能的完整方案
在現(xiàn)代軟件開(kāi)發(fā)中,數(shù)據(jù)管理是一個(gè)至關(guān)重要的環(huán)節(jié),隨著時(shí)間的推移,數(shù)據(jù)庫(kù)中會(huì)積累大量過(guò)期或冗余的數(shù)據(jù),這些數(shù)據(jù)不僅占用存儲(chǔ)空間,還會(huì)影響系統(tǒng)性能,本文將詳細(xì)介紹如何使用C#和SQL Server構(gòu)建一個(gè)功能完善的自動(dòng)清理系統(tǒng),需要的朋友可以參考下2026-01-01
Untiy Shader實(shí)現(xiàn)紋理貼圖滾動(dòng)
這篇文章主要為大家詳細(xì)介紹了Untiy Shader實(shí)現(xiàn)紋理貼圖滾動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03

