首页 > 编程语言 >C#获取电脑MAC地址(物理地址)的几种方法

C#获取电脑MAC地址(物理地址)的几种方法

时间:2022-12-30 15:22:46浏览次数:36  
标签:macAddress process string C# 网卡 物理地址 MAC using line

方法一:根据截取ipconfig /all命令的输出流获取网卡Mac,支持不同语言编码(容错性最好) (ps:如果想要查看电脑的mac地址,可以按住Win+R键打开dos命令窗口,输入cmd回车,在命令窗口输入ipconfig /all 即可查看本机mac地址)
方法二: 通过WMI读取系统信息里的网卡MAC
方法三:通过NetworkInterface读取网卡MAC
 

 

  废话不多说,上代码,获取MAC地址的三种方法封装在MacAddressHelper类中,要想调用的话直接 new一个实例,然后调用内部方法即可。

//调用方法
MacAddressHelper macHelper = new MacAddressHelper();
//调用方法一
string mac1 = macHelper.GetMacByIpConfig();
//调用方法二
string mac2 = macHelper.GetMacByWmi();
//调用方法三
string mac3 = macHelper.GetMacByNetworkInterface();
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;
using System.Net.NetworkInformation;
using Microsoft.Win32;
using System.Diagnostics;
 
namespace Common
{
    /// <summary>
    /// MAC地址获取帮助类
    /// </summary>
    public class MacAddressHelper
    {
        ///<summary>
        /// 根据截取ipconfig /all命令的输出流获取网卡Mac,支持不同语言编码(容错性最好)(方法一)
        ///</summary>
        ///<returns></returns>
        public string GetMacByIpConfig()
        {
            List<string> macs = new List<string>();
            var runCmd = ExecuteInCmd("chcp 437&&ipconfig/all");
            foreach (var line in runCmd.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Select(l => l.Trim()))
            {
                if (!string.IsNullOrEmpty(line))
                {
                    if (line.StartsWith("Physical Address"))
                    {
                        macs.Add(line.Substring(36));
                    }
                    else if (line.StartsWith("DNS Servers") && line.Length > 36 && line.Substring(36).Contains("::"))
                    {
                        macs.Clear();
                    }
                    else if (macs.Count > 0 && line.StartsWith("NetBIOS") && line.Contains("Enabled"))
                    {
                        return macs.Last();
                    }
                }
            }
            return macs.FirstOrDefault();
        }
        ///<summary>
        /// 通过WMI读取系统信息里的网卡MAC(方法二)
        ///</summary>
        ///<returns></returns>
        public string GetMacByWmi()
        {
            try
            {
                //创建ManagementClass对象
                ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
                ManagementObjectCollection moc = mc.GetInstances();
                string macAddress = string.Empty;
                foreach (ManagementObject mo in moc)//遍历获取的集合
                {
                    if ((bool)mo["IPEnabled"])//判断IPEnabled的属性是否为true
                    {
                        macAddress = mo["MacAddress"].ToString();//获取网卡的序列号
                    }
                }
                return macAddress;
            }
            catch (Exception e)
            {
                //这里写异常的处理(最好写入日志文件)
                return "";
            }
        }
        /// <summary>
        /// 通过NetworkInterface读取网卡Mac(方法三)
        /// </summary>
        /// <returns></returns>
        public string GetMacByNetworkInterface() 
        {
            string key = "SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\";
            string macAddress = string.Empty;
            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();
                            int fMediaSubType = Convert.ToInt32(rk.GetValue("MediaSubType", 0));
                            if (fPnpInstanceID.Length > 3 &&
                                fPnpInstanceID.Substring(0, 3) == "PCI")
                            {
                                macAddress = adapter.GetPhysicalAddress().ToString();
                                for (int i = 1; i < 6; i++)
                                {
                                    macAddress = macAddress.Insert(3 * i - 1, ":");
                                }
                                break;
                            }
                        }
 
                    }
                }
            }
            catch (Exception ex)
            {
                //这里写异常的处理(最好写入日志文件)  
            }
            return macAddress;
        }
 
        /// <summary>
        /// 执行内部命令(cmd.exe 中的命令)
        /// </summary>
        /// <param name="cmdline">命令行</param>
        /// <returns>执行结果</returns>
        public static string ExecuteInCmd(string cmdline)
        {
            using (var process = new Process())
            {
                process.StartInfo.FileName = "cmd.exe";
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.RedirectStandardInput = true;
                process.StartInfo.RedirectStandardOutput = true;
                process.StartInfo.RedirectStandardError = true;
                process.StartInfo.CreateNoWindow = true;
 
                process.Start();
                process.StandardInput.AutoFlush = true;
                process.StandardInput.WriteLine(cmdline + "&exit");
 
                //获取cmd窗口的输出信息  
                string output = process.StandardOutput.ReadToEnd();
 
                process.WaitForExit();
                process.Close();
 
                return output;
            }
        }
    }
}

 

标签:macAddress,process,string,C#,网卡,物理地址,MAC,using,line
From: https://www.cnblogs.com/sexintercourse/p/17014968.html

相关文章

  • pytorch模型onnx部署(python版本,c++版本)
    转载:实践演练BERTPytorch模型转ONNX模型及预测-知乎(zhihu.com)使用bRPC和ONNXRuntime把BERT模型服务化-知乎(zhihu.com)1.安装anaconda一般有图形界面的个人电......
  • docker基础之centos安装和设置加速镜像(一)
    使用yum安装Docker要求CentOS系统的内核版本高于3.10,查看本页面的前提条件来验证你的CentOS版本是否支持Docker。通过 uname-r 命令查看你当前的内核版本......
  • SpringBoot - 异步任务 @EnableAsync,@Async
    1.在启动类上添加@EnabnleAsync注解开启对异步任务的支持//开启对异步任务的支持@EnableAsync@SpringBootApplicationpublicclassLearn20221218Application{p......
  • IDC与浪潮信息联合发布:《2022-2023中国人工智能计算力发展评估报告》
    近日,IDC与浪潮信息联合发布《2022-2023中国人工智能计算力发展评估报告》(以下简称《报告》)。报告指出,中国人工智能计算力继续保持快速增长,2022年智能算力规模达到268百亿亿......
  • 重磅 | 死磕 Elasticsearch 方法论认知清单(2020年五一更新版)
    每个人都会犯错,别再让相同的错误一再发生,别再让我们为那些错误付出沉痛的代价。清单不是写在纸上的,而是印在心上的。我们别无选择,清单,正在一步步变革我们的生活,变革这个复杂......
  • 北京君正:高端的CPU+NPU异构处理器
    北京君正亮相2021ELEXCON深圳国际电子展,国内知名的云FAE在线技术服务平台创易栈受邀参观了北京君正所在的3K30号展厅,并全程进行了线上直播。在展厅内,北京君正对公司芯......
  • 全网最牛逼的 Elasticsearch 天团博客集合
    Elasticsearch最少必要知识实战教程直播回放1、事出有因一个问题引发的国内外最牛逼的elasticsearch天团博客集合。兄弟们 有玩过这个API的吗?这个suggest是干嘛作......
  • Spring MVC的web.xml配置详解
    SpringMVC是创建javaweb项目时比较常用的框架,其中web.xml配置文件是更不可少的,那么首先先了解javaweb中的web.xml文件。一、认识web.xml文件1、web.xml的作用首先java......
  • .net core (.net 6) IOC容器注入 -- autofac
    注:接口代码、类库代码参考:.netcore(.net6)IOC容器注入--内置容器 Autofac容器优点:灵活(属性注入、多种生命周期、AOP扩展)、比较流行(技术门槛低)1、引入NuGet包Auto......
  • 05List、Set、Collections类工具
    01Collection集合的遍历方式Collection集合的遍历方式有三种:(1)迭代器。(2)foreach(增强for循环)。(3)JDK1.8开始之后的新技术Lambda表达式(了解)1.迭代器publicclass......