C#程序读取MAC地址的五种方法(转)

   public class GetMac
    {
        ///<summary>
        /// 根据截取ipconfig /all命令的输出流获取网卡Mac
        ///</summary>
        ///<returns></returns>
        public static List<string> GetMacByIpConfig()
        {
            List<string> macs =new List<string>();
            ProcessStartInfo startInfo = new ProcessStartInfo("ipconfig", "/all");
            startInfo.UseShellExecute = false;
            startInfo.RedirectStandardInput = true;
            startInfo.RedirectStandardOutput = true;
            startInfo.RedirectStandardError = true;
            startInfo.CreateNoWindow = true;
            Process p = Process.Start(startInfo);
            //截取输出流
            StreamReader reader = p.StandardOutput;
            string line = reader.ReadLine();
            while (!reader.EndOfStream)
            {
                if (!string.IsNullOrEmpty(line))
                {
                    line = line.Trim();
                    if (line.StartsWith("物理地址"))
                    {
                        macs.Add(line.Substring(32));
                    }
                }
                line = reader.ReadLine();
            }
            //等待程序执行完退出进程
            p.WaitForExit();
            p.Close();
            reader.Close();
            return macs;
        }

        ///<summary>
        /// 通过WMI读取系统信息里的网卡MAC
        ///</summary>
        ///<returns></returns>
        public static List<string> GetMacByWmi()
        {
            List<string> macs =new List<string>();
            string mac ="";
            ManagementClass mc =new ManagementClass("Win32_NetworkAdapterConfiguration");
            ManagementObjectCollection moc = mc.GetInstances();
            foreach (ManagementObject mo in moc)
            {
                if ((bool)mo["IPEnabled"])
                {
                    mac = mo["MacAddress"].ToString();
                    macs.Add(mac);
                }
            }
            return macs;
        }

        ///<summary>
        /// 通过NetworkInterface读取网卡Mac
        ///</summary>
        ///<returns></returns>
        public static List<string> GetMacByNetworkInterface()
        {
            List<string> macs =new List<string>();
            NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
            foreach (NetworkInterface ni in interfaces)
            {
                macs.Add(ni.GetPhysicalAddress().ToString());
            }
            return macs;
        }

        ///<summary>
        /// 通过SendARP获取网卡Mac
        /// 网络被禁用或未接入网络(如没插网线)时此方法失灵
        ///</summary>
        ///<param name="remoteIP"></param>
        ///<returns></returns>
        public static string GetMacBySendArp(string remoteIP)
        {
            StringBuilder macAddress =new StringBuilder();
            try
            {
                Int32 remote = inet_addr(remoteIP);
                Int64 macInfo =new Int64();
                Int32 length =6;
                SendARP(remote, 0, ref macInfo, ref length);
                string temp = Convert.ToString(macInfo, 16).PadLeft(12, '0').ToUpper();
                int x =12;
                for (int i =0; i <6; i++)
                {
                    if (i ==5)
                    {
                        macAddress.Append(temp.Substring(x -2, 2));
                    }
                    else
                    {
                        macAddress.Append(temp.Substring(x -2, 2) +"-");
                    }
                    x -=2;
                }
                return macAddress.ToString();
            }
            catch
            {
                return macAddress.ToString();
            }
        }

        [DllImport("Iphlpapi.dll")]
        private static extern int SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 length);
        [DllImport("Ws2_32.dll")]
        private static extern Int32 inet_addr(string ip);
    }

本文来自博客http://www.cnblogs.com/diulela/archive/2012/04/07/2436111.html

posted @ 2015-02-04 17:35  徐航  阅读(1547)  评论(0编辑  收藏  举报