• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

如何在C#中提取本机的MAC地址?急急急急急急急急!!在现等!!!!!!!!!!

arken 2004-11-02 11:21:25
如何在C#中提取本机的MAC地址?要的是客户端的MAC地址,就是用户的MAC地址,急急急急急急急急!!在现等!!!!!!!!!
...全文
228 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dazhu2 2004-11-02
namespace 获得MAC地址
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
[DllImport("Iphlpapi.dll")]
public static extern int SendARP (Int32 dest,Int32 host,ref Int64 mac,ref Int32 length);//dest为目标机器的IP;Host为本机器的IP

[DllImport("Ws2_32.dll")]
public static extern Int32 inet_addr (string ip);//去掉IP中的点
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void Form1_Load(object sender, System.EventArgs e)
{
this.textBox1.Text="192.168.0.1";
this.textBox2.Text="";
}

private void button1_Click(object sender, System.EventArgs e)
{


string s;
this.button1.Enabled=false;

IPHostEntry myin=Dns.GetHostByName(System.Environment.MachineName);
MessageBox.Show(myin.HostName.ToString());
MessageBox.Show(myin.AddressList[0].ToString());
Int32 mysource=inet_addr(myin.AddressList[0].ToString());
Int32 iptest=inet_addr(myin.AddressList[0].ToString());


Int64 macinfo=new Int64();
Int32 len=6;
SendARP(iptest,mysource,ref macinfo,ref len);

s=System.Convert.ToString(macinfo,16);
MessageBox.Show(s.ToString());
return;
string[] b=new string[6];
string box;
int l=12;
for(int i=0;i<6;i++)
{
b[i]=s.Substring(l-2,2);
l-=2;

}
box=b[0];
for(int j=1;j<6;j++)
{
box=box+"-"+b[j];
}

this.textBox2.Text=box;





}
回复
haoztao 2004-11-02
楼上已经弄出来了,就是那些东东啦
回复
xiaoslong 2004-11-02
可以用arp -a来查看,在c#中你可以调用类库来实现
回复
trnbo 2004-11-02
using System;
using System.Runtime.InteropServices;

namespace UtilityControl
{
/// <summary>
/// 关于IP地址的若干操作
/// </summary>
public class IP
{
public IP()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

[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);

/// <summary>
/// 根据ip得到网卡mac地址
/// </summary>
/// <param name="ip">给出的ip地址</param>
/// <returns>对应ip的网卡mac地址</returns>
public static Int64 GetMACByIP(string ip)
{
Int32 ldest= inet_addr(ip); //目的地的ip
try
{
Int64 macinfo = new Int64();
Int32 len = 6;
int res = SendARP(ldest,0, ref macinfo, ref len);
return macinfo;
}
catch(Exception err)
{
Console.WriteLine("Error:{0}",err.Message);
}
return 0;
}
}
}

程序得出来的是一个64位的数,转化成16进制 就一样了.
回复
Tomgus 2004-11-02
using System;
using System.Runtime.InteropServices;

namespace UtilityControl
{
/// <summary>
/// 关于IP地址的若干操作
/// </summary>
public class IP
{
public IP()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

[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);

/// <summary>
/// 根据ip得到网卡mac地址
/// </summary>
/// <param name="ip">给出的ip地址</param>
/// <returns>对应ip的网卡mac地址</returns>
public static Int64 GetMACByIP(string ip)
{
Int32 ldest= inet_addr(ip); //目的地的ip
try
{
Int64 macinfo = new Int64();
Int32 len = 6;
int res = SendARP(ldest,0, ref macinfo, ref len);
return macinfo;
}
catch(Exception err)
{
Console.WriteLine("Error:{0}",err.Message);
}
return 0;
}
}
}
回复
wovow 2004-11-02
#include < windows.h >
#include < wincon.h >
#include < stdlib.h >
#include < stdio.h >
#include < time.h >
#include <nb30.h>
#pragma comment(lib,"netapi32.lib")
// 因为是通过NetAPI来获取网卡信息,所以需要包含其题头文件nb30.h #include < nb30.h >
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, * PASTAT;

ASTAT Adapter;

// 定义一个存放返回网卡信息的变量
// 输入参数:lana_num为网卡编号,一般地,从0开始,但在Windows 2000中并不一定是连续分配的

void getmac_one (int lana_num)
{
NCB ncb;
UCHAR uRetCode;

memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = lana_num;
// 指定网卡号

// 首先对选定的网卡发送一个NCBRESET命令,以便进行初始化
uRetCode = Netbios( &ncb );
printf( "The NCBRESET return code is: 0x%x \n", uRetCode );

memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = lana_num; // 指定网卡号

strcpy( (char *)ncb.ncb_callname, "* " );
ncb.ncb_buffer = (unsigned char *) &Adapter;
// 指定返回的信息存放的变量
ncb.ncb_length = sizeof(Adapter);

// 接着,可以发送NCBASTAT命令以获取网卡的信息
uRetCode = Netbios( &ncb );
printf( "The NCBASTAT return code is: 0x%x \n", uRetCode );
if ( uRetCode == 0 )
{

// 把网卡MAC地址格式化成常用的16进制形式,如0010-A4E4-5802
printf( "The Ethernet Number[%d] is: %02X%02X-%02X%02X-%02X%02X\n",
lana_num,
Adapter.adapt.adapter_address[0],
Adapter.adapt.adapter_address[1],
Adapter.adapt.adapter_address[2],
Adapter.adapt.adapter_address[3],
Adapter.adapt.adapter_address[4],
Adapter.adapt.adapter_address[5] );
}
}

int main(int argc, char* argv[])
{
NCB ncb;
UCHAR uRetCode;
LANA_ENUM lana_enum;

memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBENUM;

ncb.ncb_buffer = (unsigned char *) &lana_enum;
ncb.ncb_length = sizeof(lana_enum);

// 向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如有多少个网卡、每张网卡的编号等
uRetCode = Netbios( &ncb );
printf( "The NCBENUM return code is: 0x%x \n", uRetCode );
if ( uRetCode == 0 )
{
printf( "Ethernet Count is : %d\n\n", lana_enum.length);

// 对每一张网卡,以其网卡编号为输入编号,获取其MAC地址
for ( int i=0; i< lana_enum.length; ++i)
getmac_one( lana_enum.lana[i]);
}
int aa=0;
scanf("%d",aa);
return 0;
}
回复
xiaoslong 2004-11-02
运行cmd,输入 ipconfig /all命令,就可以查看
回复
arken 2004-11-02
楼上的,因为我对C#一窍不通,今天第一次用这个,所以我也不知道各位写的对不对,所以我希望那个朋友最好能写详细一下,(有详细注释的),谢谢大家了,请大家帮帮忙,或者是写一个函数,这个函数可以读到我本机的MAC,然后我在C#程序中调用您写的函数,但是你得告诉我怎么调用,谢谢了,请大家帮帮忙,分数可以再加!!!!!!!!
回复
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2004-11-02 11:21
社区公告

让您成为最强悍的C#开发者