获得mac地址的四个方法
来源:互联网 发布:战锤2全面战争 优化 编辑:程序博客网 时间:2024/05/19 13:27
- using System;
- using System.Diagnostics;
- using System.Management;
- using System.Net;
- using System.Runtime.InteropServices;
- using System.Text.RegularExpressions;
- namespace MACAddress
- {
- /**//// <summary>
- /// MainClass 的摘要描述。
- /// </summary>
- internal class MainClass
- {
- /**//// <summary>
- /// 應用程式的主進入點。
- /// </summary>
- [STAThread]
- private static void Main(string[] args)
- {
- GetMACByWMI();
- IPAddress[] ips = GetLocalIP();
- foreach (IPAddress ip in ips)
- {
- Console.WriteLine(GetMacByARP(ip.ToString()));
- string mac = GetRemoteMacByNetBIOS(ip.ToString());
- if ( mac.Length != 0 )
- Console.WriteLine(mac);
- else
- Console.WriteLine("Fail to get MACAddress by NetBIOS");
- GetMACBySNMP(ip.ToString(),"yourGroupName@yourVlanNumber");
- }
- Console.ReadLine();
- }
- By WMI#region By WMI
- public static void GetMACByWMI()
- {
- string query = "select MACAddress from Win32_NetworkAdapterConfiguration where IPEnabled='TRUE'";
- ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
- ManagementObjectCollection collection = searcher.Get();
- foreach (ManagementObject mo in collection)
- {
- string mac = mo["MACAddress"].ToString();
- Console.WriteLine(" Network card MAC Address is :{0}", mac);
- }
- }
- #endregion
- By ARP#region By ARP
- [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);
- public static string GetMacByARP(string clientIP)
- {
- string ip = clientIP;
- Int32 ldest = inet_addr(ip);
- Int64 macinfo = new Int64();
- Int32 len = 6;
- try
- {
- SendARP(ldest, 0, ref macinfo, ref len);
- }
- catch
- {
- return "";
- }
- string originalMACAddress = Convert.ToString(macinfo, 16);
- if (originalMACAddress.Length < 12)
- {
- originalMACAddress = originalMACAddress.PadLeft(12, '0');
- }
- string macAddress;
- if (originalMACAddress != "0000" && originalMACAddress.Length == 12)
- {
- string mac1, mac2, mac3, mac4, mac5, mac6;
- mac1 = originalMACAddress.Substring(10, 2);
- mac2 = originalMACAddress.Substring(8, 2);
- mac3 = originalMACAddress.Substring(6, 2);
- mac4 = originalMACAddress.Substring(4, 2);
- mac5 = originalMACAddress.Substring(2, 2);
- mac6 = originalMACAddress.Substring(0, 2);
- macAddress = mac1 + "-" + mac2 + "-" + mac3 + "-" + mac4 + "-" + mac5 + "-" + mac6;
- }
- else
- {
- macAddress = "";
- }
- return macAddress.ToUpper();
- }
- public static IPAddress[] GetLocalIP()
- {
- string hostName = Dns.GetHostName();
- IPHostEntry ipEntry = Dns.GetHostByName(hostName);
- return ipEntry.AddressList;
- }
- #endregion
- By NetBIOS#region By NetBIOS
- public static string GetRemoteMacByNetBIOS(string clientIP)
- {
- string ip = clientIP;
- string dirResults = "";
- ProcessStartInfo psi = new ProcessStartInfo();
- Process proc = new Process();
- psi.FileName = "nbtstat.exe";
- //psi.RedirectStandardInput = false;
- psi.RedirectStandardOutput = true;
- psi.RedirectStandardError = true;
- psi.Arguments = "-A " + ip;
- psi.UseShellExecute = false;
- proc = Process.Start(psi);
- dirResults = proc.StandardOutput.ReadToEnd();
- string error = proc.StandardError.ReadToEnd();
- proc.WaitForExit();
- dirResults = dirResults.Replace("/r", "").Replace("/n", "").Replace("/t", "");
- Regex reg = new Regex("Mac[ ]{0,}Address[ ]{0,}=[ ]{0,}(?((.)*?))__MAC", RegexOptions.IgnoreCase | RegexOptions.Compiled);
- Match mc = reg.Match(dirResults + "__MAC");
- if (mc.Success)
- {
- return mc.Groups["key"].Value.ToUpper();
- }
- else
- {
- return "";
- }
- }
- #endregion
- By SNMP#region By SNMP
- public static void GetMACBySNMP(string ip,string vlan)
- {
- int commLength,mibLength,dataStart,dataLength;
- string nextMib,value;
- SNMP conn = new SNMP();
- string mib = "1.3.6.1.2.1.17.4.3.1.1";
- int orgMibLength = mib.Length;
- byte[] response = new byte[1024];
- nextMib = mib;
- while ( true)
- {
- response = conn.Get("getnext",ip,vlan,nextMib);
- commLength = Convert.ToInt16(response[6]);
- mibLength = Convert.ToInt16(response[23+commLength]);
- dataLength = Convert.ToInt16(response[25+commLength+mibLength]);
- dataStart = 26 + commLength + mibLength;
- value = BitConverter.ToString(response,dataStart,dataLength);
- nextMib = conn.GetNextMIB(response);
- if ( !(nextMib.Substring(0,orgMibLength) == mib))
- {
- break;
- }
- Console.WriteLine("{0}={1}",nextMib,value);
- }
- }
- #endregion
- }
- }
- SNMP Class
- using System;
- using System.Net;
- using System.Net.Sockets;
- using System.Text;
- namespace MACAddress
- {
- /**//**//**//// <summary>
- /// SNMP 的摘要描述。
- /// </summary>
- public class SNMP
- {
- public SNMP()
- {
- }
- public byte[] Get(string request, string host, string community, string mibString)
- {
- byte[] packet = new byte[1024];
- byte[] mib = new byte[1024];
- int snmpLen;
- int comLen = community.Length;
- string[] mibVals = mibString.Split('.');
- int mibLen = mibVals.Length;
- int cnt = 0;
- int temp;
- int orgmibLen = mibLen;
- int pos = 0;
- for (int i = 0; i < orgmibLen; i++)
- {
- temp = Convert.ToInt16(mibVals[i]);
- if (temp > 127)
- {
- mib[cnt] = Convert.ToByte(128 + (temp / 128));
- mib[cnt + 1] = Convert.ToByte(temp - ((temp / 128) * 128));
- cnt += 2;
- mibLen++;
- }
- else
- {
- mib[cnt] = Convert.ToByte(temp);
- cnt++;
- }
- }
- snmpLen = 29 + comLen + mibLen - 1;
- packet[pos++] = 0x30;
- packet[pos++] = Convert.ToByte(snmpLen - 2);
- packet[pos++] = 0x02;
- packet[pos++] = 0x01;
- packet[pos++] = 0x00;
- packet[pos++] = 0x04;
- packet[pos++] = Convert.ToByte(comLen);
- byte[] data = Encoding.ASCII.GetBytes(community);
- for (int i = 0; i < data.Length; i++)
- {
- packet[pos++] = data[i];
- }
- if (request == "get")
- {
- packet[pos++] = 0xA0;
- }
- else
- {
- packet[pos++] = 0xA1;
- }
- packet[pos++] = Convert.ToByte(20 + mibLen - 1);
- packet[pos++] = 0x02;
- packet[pos++] = 0x04;
- packet[pos++] = 0x00;
- packet[pos++] = 0x00;
- packet[pos++] = 0x00;
- packet[pos++] = 0x01;
- packet[pos++] = 0x02;
- packet[pos++] = 0x01;
- packet[pos++] = 0x00;
- packet[pos++] = 0x02;
- packet[pos++] = 0x01;
- packet[pos++] = 0x00;
- packet[pos++] = 0x30;
- packet[pos++] = Convert.ToByte(6 + mibLen - 1);
- packet[pos++] = 0x30;
- packet[pos++] = Convert.ToByte(6 + mibLen - 1 - 2);
- packet[pos++] = 0x06;
- packet[pos++] = Convert.ToByte(mibLen - 1);
- packet[pos++] = 0x2b;
- for (int i = 2; i < mibLen; i++)
- {
- packet[pos++] = Convert.ToByte(mib[i]);
- }
- packet[pos++] = 0x05;
- packet[pos++] = 0x00;
- Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 5000);
- IPHostEntry ihe = Dns.Resolve(host);
- IPEndPoint iep = new IPEndPoint(ihe.AddressList[0], 161);
- EndPoint ep = (EndPoint) iep;
- sock.SendTo(packet, snmpLen, SocketFlags.None, iep);
- try
- {
- int recv = sock.ReceiveFrom(packet, ref ep);
- }
- catch (SocketException)
- {
- packet[0] = 0xff;
- }
- return packet;
- }
- public string GetNextMIB(byte[] mibIn)
- {
- string output = "1.3";
- int commLength = mibIn[6];
- int mibStart = 6 + commLength + 17;
- int mibLength = mibIn[mibStart] - 1;
- mibStart += 2;
- int mibValue;
- for (int i = mibStart; i < mibStart + mibLength; i++)
- {
- mibValue = Convert.ToInt16(mibIn[i]);
- if (mibValue > 128)
- {
- mibValue = (mibValue / 128) * 128 + Convert.ToInt16(mibIn[i + 1]);
- i++;
- }
- output += "." + mibValue;
- }
- return output;
- }
- }
- }
原文地址:http://hi.baidu.com/ringbelling/blog/item/ab202086f0ddf43a66096ed3.html
- 获得MAC地址的四个方法
- 获得MAC地址的四个方法
- 获得MAC地址的四个方法
- 获得MAC地址的四个方法
- 获得MAC地址的四个方法
- 获得MAC地址的四个方法
- 获得mac地址的四个方法
- 获得mac地址的四个方法
- 获得Mac的地址
- JDK6新特性,JAVA获得机器MAC地址的方法
- JDK6新特性,JAVA获得机器MAC地址的方法
- JDK6新特性,JAVA获得机器MAC地址的方法
- 获得系统MAC地址的方法都有哪些?
- ASP获得网卡的MAC地址
- 获得用户(客户端)的MAC地址
- 用VB获得机器的MAC地址
- 用Winpcap获得网卡的MAC地址
- ASP获得网卡的MAC地址
- 图像分割和轮廓提取
- How to integrate XBAP application into Java applet container?
- 数字图像的边缘检测
- GDI+开发环境的配置
- GDI+数字图像处理初探
- 获得mac地址的四个方法
- 批处理登陆邮箱代码分析
- 模态对话框和非模态对话框
- Axure RP Pro - jQuery - 如何在Axure RP Pro生成的HTML原型文档中集成jQuery
- 图像的中值滤波
- 图像平移、上下翻转、左右翻转
- 关于很多初学者对于eclipse默认cldc和midp的问题
- SQL Server的链接服务器技术小结
- GNU C 扩展之__attribute__ 机制简介