获得MAC地址的四个方法

[机器码] 获取 MAC 地址的几种方法 Netbios #include <windows.h> #pragma comment(lib, "Netapi32.lib") namespace { bool GetAdapterInfo(int adapterNum, std::string& macOUT) { NCB Ncb; memset(&Ncb, 0, sizeof(Ncb)); Ncb.ncb_command = NCBRESET; // 重置网卡,以便我们可以查询 Ncb.ncb_lana_nu 阅读详情
 http://jiezhi.cnblogs.com/archive/2005/07/13/192066.html(转)

1.使用WMI。查询表Win32_NetworkAdapterConfiguration即可获得。

2.使用ARP协议。请看这里。

3.使用Windows命令nbtstat,也就是通过NetBIOS。请看这里。

4.查询SNMP(就是一种用于监视网络设备的协议)的MIB(管理信息数据库)。但这不是一件简单的事情,需要自己创建SNMP包,发送到交换机,然后对返回的响应进行解析。

下面是代碼:

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 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


        
#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


        
#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;
        }

    }

}


 如果还有其它方法,请告诉我。

VC获取MAC地址的4种方法 有需求才有创造,有了问题才会想着去解决,那么我这里的获取MAC地址的第4种方法也是在这种情况下产生的。因为公司有一个服务器产品,要写一个注册模块,而注册模块需要获取硬件信息,而硬件信息有很多,可以是硬盘序列号,CPU序列号,和网卡MAC,我首先使用的是硬盘序列号,因为GOOGLE一下一大堆,我要感谢所有这些无私奉献自己智慧结晶的可爱的人。很快地写完一个注册模块,经过几个PC机,笔记本的测试,一 阅读详情

相关推荐

linux c++获取mac地址,C++获得本机所有网卡的IP和MAC地址信息的实现方法

一台机器上可能不只有一个网卡,但每一个网卡只有一个MAC地址,而每一个网卡可能配置有多个IP地址;如平常的笔记本电脑中,就会有无线网卡和有线网卡(网线接口)两种;因此,如果要获得本机所有网卡的IP和MAC地址信息,则必须顺序获得每个网卡,再依次获取其信息等;在windows sdk中,用IP_ADAPTER_INFO结构体存储网卡信息,包括网卡名、网卡描述、网卡MAC地址、网卡IP等,该结构体的主...

weixin_42339991的博客 2371

如何获取MAC地址

MAC 地址是分配给网络接口卡(NIC)的硬件地址,用于在网络中唯一标识设备。与 IP 地址不同,MAC 地址是固定的,不会随网络的变化而改变。每个网络接口都有一个唯一的 MAC 地址,使其能够在局域网内被识别。MAC 地址是网络通信中不可或缺的重要组成部分,它为每个设备提供了唯一的标识,使得局域网内的设备能够正确地相互通信。尽管 MAC 地址在网络管理和安全性方面发挥了重要作用,但也存在一些局限性和隐私问题。因此,网络管理员在设计和管理网络时,应充分考虑 MAC 地址的特性,以确保网络的高效性和安全性。

blog.boringhex.top 6089

七种获取MAC地址的实战方法

MAC地址,即媒体访问控制地址,是网络设备在数据链路层进行通信时所使用的硬件地址。在网络管理、故障排查以及安全审计等领域,正确且高效地获取网络设备的MAC地址显得至关重要。本章将对MAC地址获取的多种方法进行概述,为后续章节的深入探讨和实践操作打下坚实的基础。在第一章中,我们将讨论以下获取MAC地址的方法:操作系统自带的命令行工具:例如Windows的ipconfig,Linux的ifconfig或ip link,这些命令简单直接,适合快速检查本地设备的MAC地址。

weixin_42351520的博客 2155

java快速获取mac地址的方法

在开发中需要获取电脑的mac地址,记录一下java快速获取mac地址的方法,也可获取到ip地址。

ITxiaowu的博客 4225

DiffusionDrive实战:如何用截断扩散模型3个月搞定自动驾驶轨迹规划(附代码)

本文详细介绍了如何利用DiffusionDrive截断扩散模型,在三个月内快速构建端到端的自动驾驶轨迹预测系统。内容涵盖从环境搭建、数据处理、模型架构解析到训练调参和推理优化的完整实战流程,并提供了关键代码示例,旨在帮助开发者高效实现高质量的自动驾驶轨迹规划。

weixin_35578748的博客 147

ENVI SARscape安装全攻略:从下载到汉化一步到位(附最新试用申请链接)

本文提供ENVI SARscape从下载安装到汉化的完整指南,特别针对InSAR(合成孔径雷达干涉测量)分析环境搭建。详细介绍了系统要求、分步安装流程、汉化优化方法及硬件加速配置,并分享数据处理验证和常见问题解决方案,帮助用户高效搭建遥感数据分析平台。

rnn9storyteller的博客 1409

获得mac地址的四个方法

using System;using System.Diagnostics;using System.Management;using System.Net;using System.Runtime.InteropServices;using System.Text.RegularExpressions;namespace MACAddress{/**/

sphinger的专栏 1222

全球半导体设备氧化钇熔射服务行业规模预测:预计未来六年CAGR为7.8%

本文将对“半导体设备氧化钇熔射服务”行业进行深度分析,探讨市场趋势的演变、核心竞争者的战略布局、供应链结构的内外特点、研发创新的最新进展、法规政策环境的适应性调整以及投资机会与风险评估。这一稳健的增长趋势表明半导体设备氧化钇熔射服务在电子行业中的重要性逐渐增强。由于全球对于高效、高精度和可靠的电子解决方案的需求增加,对能够提供这些功能的半导体设备氧化钇熔射服务的需求日益增长。由于半导体设备氧化钇熔射服务主要为就地服务型,其“配送”主要依赖于专业团队和技术设备的及时调配,强调服务的时效性和高质量。

CC1239777的博客 570

MAC地址表

MAC地址表 MAC地址表记录了相连设备的MAC地址、接口号以及所属的VLAN ID之间的对应关系,是VLAN内数据转发的决策表,是决定交换机转发行为的标准,交换机就是根据这张表负责将数据帧传输到指定的主机上的。   MAC表一般包含动态MAC地址、静态MAC地址和黑洞MAC地址。 动态MAC地址: 由接口通过报文中的源MAC地址学习获得,表项可老化,默认老化时间为300s,可以通过命令修改老化时间,老化时间到后,会清除学习到的动态MAC地址。 静态MAC地址: 由用户手工配置,不会老化,接口和M

理想主义的花终将盛开在浪漫主义的土壤里,我的热情永远不会熄灭在现实的平凡之中,我们终将上岸,阳光万里。 1万+

Halcon实战:5分钟搞定自定义直线卡尺工具(附完整代码下载)

本文详细介绍了如何使用Halcon快速开发自定义直线卡尺工具,通过交互式ROI绘制、边缘检测和直线拟合三个核心函数,实现高效工业视觉检测。文章包含完整代码下载,帮助开发者在5分钟内掌握这一实用工具的开发技巧,提升直线检测的精度和效率。

perl8的博客 251

OpenCV2.4.9+vs2012配置

下载OpenCV2.4.9。 下载地址:http://opencv.org/downloads.html2.下载后,解压。 请记住解压路径,后面根据自己的解压路径进行配置。我的路径是E:\ 3.配置环境变量 win7系统:(计算机-属性-高级系统设置-高级-环境变量) 1)编辑系统变量Path:添加E:\opencv\build\x86\vc11\bin; 2)添加/编辑用户变量P

sybil_w的博客 971

动态MAC地址和静态MAC地址

MAC地址表是交换机进行数据帧转发时所使用的一个非常关键的数据表。每一台 交换机都会维护自己的MAC地址表,掌握MAC地址表的相关配置及管理是非常有必 要的。 1.查看MAC地址表 在华为交换机上,使用display mac-address命令可查看设备的MAC地址表。图9-1 中,查看SW1的MAC地址表可能会看到如下输出: 从SW1的MAC地址表可以看出,其GEO/0/ 1接口在ULAN ...

mn3321的博客 1万+

感应加热电源设计避坑指南:半桥LC串联谐振的5个关键问题

本文深入解析半桥LC串联谐振在感应加热电源设计中的5个关键问题,包括均压电阻选型、功率管驱动时序、谐振频率补偿等实战经验。通过真实故障案例和解决方案,帮助工程师避开常见设计陷阱,提升电路稳定性和效率,特别适合从事桥感应加热电源开发的工程师参考。

weixin_27013291的博客 510

iOS上获得MAC地址

很多时候我们都需要唯一来确定一台设备,苹果设备本来有个UDID号,可以实现这个目的。在iOS5.0以前,还有一个uniqueIdentifier的API用来获得这个number。不过iOS5之后,这个API废除了。 一条路不通,我们就换一条路走,于是MAC地址就成了一个不错的选择,苹果没有提供获得MAC地址的API,不过使用sysctl还是可以有点办法的,代码如下: ...

weixin_30871701的博客 4286

Python爬取小红书种草商品评论数据:从入门到实战全攻略(附反爬+情感分析方案)

Python爬取小红书种草商品评论数据,核心是“抓包找到正确的接口+处理登录验证+合理的反爬策略”。新手不用一开始就追求多笔记批量爬取和情感分析,先把单笔记的评论抓取和存储跑通,再逐步扩展功能。我做的这个系统现在每天帮朋友爬取3-5款美妆产品的评论,自动做情感分析和关键词提取,她再也不用手动翻评论了,效率提升了80%。如果你们在开发中遇到具体问题,比如接口找不到、Cookie过期、IP被封,都可以在评论区留言,我会一一解答。后续也可以出一期小红书笔记种草数据爬取的教程,帮助大家更全面地分析竞品数据。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1350

【网络安全】AntSword蚁剑新手快速入门(附实战案例)

蚁剑(AntSword)是一款开源的跨平台WebShell管理工具,它主要面向于合法授权的渗透测试安全人员以及进行常规操作的网站管理员。蚁剑的特点主要有如下几点:1.支持多平台。包括macOS、Linux 32位、Linux 64位、Linux armv7l、Linux arm64、Windows 32位、Windows 64位。2.完善的文档。中国蚁剑文档地址。3.多项功能。文件管理功能、虚拟终端功能、数据库管理功能。4.内置代理功能。

等风来 1万+
上一篇: .net中获取客户端真实ip
下一篇: 使用VS2005调试ASP程序
xssh913913
博客等级 码龄20年 28粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值