C#取客户端MAC地址(不是通ip得到),内网的也要取的到

xubkd 2008-11-07 11:43:00
如题
...全文
3828 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
蟑螂•魂 2010-12-12
  • 打赏
  • 举报
回复
[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);

private void Page_Load(object sender, System.EventArgs e)
{
try
{
string userip=Request.UserHostAddress;
string strClientIP = Request.UserHostAddress.ToString().Trim();
Int32 ldest = inet_addr(strClientIP); //目的地的ip
Int64 macinfo = new Int64();
Int32 len = 6;
int res = SendARP(ldest,0, ref macinfo, ref len);
string mac_src=macinfo.ToString("X");
if(mac_src == "0")
{
if (userip == "127.0.0.1")
{
Response.Write("正在访问Localhost!");
}
else
{
Response.Write("欢迎来自IP为" + userip + "的朋友!" + "<br>");
}
return;
}

while(mac_src.Length<12)
{
mac_src = mac_src.Insert(0,"0");
}

string mac_dest="";

for(int i=0;i<11;i++)
{
if (0 == (i % 2))
{
if ( i == 10 )
{
mac_dest = mac_dest.Insert(0,mac_src.Substring(i,2));
}
else
{
mac_dest ="-" + mac_dest.Insert(0,mac_src.Substring(i,2));
}
}
}

Response.Write ("欢迎来自IP为"+userip+ "<br>" + ",MAC地址为"+mac_dest+"的朋友!"

+ "<br>");
}
catch(Exception err)
{
Response.Write(err.Message);
}
}
xhlmm 2010-06-02
  • 打赏
  • 举报
回复
这个要怎么搞哦,我也想要一个!
hb915a 2009-03-23
  • 打赏
  • 举报
回复
C#现在给的方案都只能获取服务器上的MAC或CPU序列号,无法真正的获取个人用户电脑上的MAC?谁能获取真正客户端的MAC,不是服务器上的。给谁一个敬礼,加人民币。
koukoujiayi 2008-11-10
  • 打赏
  • 举报
回复
不让用户改,可以通过数字证书!
我觉得这还不是问题的所在,关键这个Mac是可修改的!!!
xubkd 2008-11-10
  • 打赏
  • 举报
回复
这个是可以实现,可以要用户去改安全级别好像不太现实,不过还是谢谢你!
koukoujiayi 2008-11-10
  • 打赏
  • 举报
回复
楼主请先在客户端设置:
进入Internet属性设置:点安全/自定义级别/找到"对没有标记为安全的ActiveX控件进行初始化和脚本运行"/点选"启用"

程序代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head >
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<object id="locator" classid="CLSID:76A64158-CB41-11D1-8B02-00600806D9B6" viewastext> </object>
<object id="foo" classid="CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223"></object>
<script type="text/jscript" event="OnObjectReady(objObject,objAsyncContext)" for="foo" >
if(objObject.IPEnabled !=null &&objObject.IPEnabled !="undefined"&&objObject.IPEnabled==true)
{
if(objObject.MACAddress!= null&&objObject.MACAddress!="undefined")
MACAddr = objObject.MACAddress;
}
</script>
<script type="text/jscript">
var service = locator.ConnectServer();
var MACAddr ;
service.Security_.ImpersonationLevel=3;
service.InstancesOfAsync(foo, 'Win32_NetworkAdapterConfiguration');
</script>

<script type="text/jscript" event="OnCompleted(hResult,pErrorObject,pAsyncContext)" for="foo" >
document.form1.TextBox1.value=unescape(MACAddr);
</script>

<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</div>
</form>
</body>
</html>
koukoujiayi 2008-11-10
  • 打赏
  • 举报
回复
楼主:
应为哪个mac可以修改的,所以在原来的项目中不适用了,
所以放弃了,在研究的过程中知道数字证书这么一回事,
具体就不太清楚了,抱歉!!
楼主可googl一下,这方面的介绍还是很多的,
比如免费的数字证书等等!!
xubkd 2008-11-10
  • 打赏
  • 举报
回复
数字证书,怎么实现,麻烦告知!对于这个mac可以修改倒没事,反正又不是很严格的!
koukoujiayi 2008-11-09
  • 打赏
  • 举报
回复
楼主我现在在家,程序在单位,明天给你发上!!
xubkd 2008-11-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 koukoujiayi 的回复:]
引用 1 楼 vrhero 的回复:
这问题问过无数次了...如果你是C/S那很简单,如果是B/S就别想这种不可能的事情了...

B/S也完全可以!!
这我做过,但这个MAC也是可以更改的,所以在项目中没用!
楼主需要的话,待会我找出来给你!!不过你要知道,这个MAC在注册表中是可更改的,
程序是读取注册表中的MAC!!
[/Quote]
这个办法应该可以满足要求,这个项目的应用只是内网的,麻烦把代码给一下,谢谢了!
koukoujiayi 2008-11-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 vrhero 的回复:]
楼上...去看一下什么叫B/S什么叫C/S再说...把基础打好...
[/Quote]
楼上去验证一下web程序是否可取得MAC!!把基础的基础打好.....
vrhero 2008-11-09
  • 打赏
  • 举报
回复
楼上...去看一下什么叫B/S什么叫C/S再说...把基础打好...
koukoujiayi 2008-11-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 vrhero 的回复:]

不切实际的想法...

办法1,你能说服几个Internet用户接受?除非你是淘宝那种大网站,但是做到那么大你还…
[/Quote]
讨论能否B/s取得客户端的MAC,你说不可以,事实上是可以的,
至于"不切实际的想法"从何谈起呢?
事实上很实际,如过这个MAC不可更改的话,在一个单位的局网中,某一项业务可以限制在某几台机器,
知道用户名和密码都不行,这很实际呵!!是客户提出的呵!!
vrhero 2008-11-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 koukoujiayi 的回复:]
引用 5 楼 vrhero 的回复:
B/S只能通过客户端插件来取,其本质还是C/S...何况以现在的浏览器安全机制近乎不可能...

有两种办法:
1.开放客户端的ActivX,即对没有标记为安全的ActiveX设置为启用!
这多少有点不安全,事实上也没什么问题!

2.引进数字证书!那就彻底安全!!
[/Quote]
不切实际的想法...

办法1,你能说服几个Internet用户接受?除非你是淘宝那种大网站,但是做到那么大你还要用户mac干什么?

至于办法2,除了金融机构和某些企业内部网站我还没见过随便给人发证书的,况且未经可信根证书机构认可的数字证书一样会浏览器拦截...
koukoujiayi 2008-11-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 vrhero 的回复:]
B/S只能通过客户端插件来取,其本质还是C/S...何况以现在的浏览器安全机制近乎不可能...
[/Quote]
有两种办法:
1.开放客户端的ActivX,即对没有标记为安全的ActiveX设置为启用!
这多少有点不安全,事实上也没什么问题!

2.引进数字证书!那就彻底安全!!
bingdian37 2008-11-09
  • 打赏
  • 举报
回复
mac...这个...鸡肋
vrhero 2008-11-09
  • 打赏
  • 举报
回复
B/S只能通过客户端插件来取,其本质还是C/S...何况以现在的浏览器安全机制近乎不可能...
koukoujiayi 2008-11-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 vrhero 的回复:]
这问题问过无数次了...如果你是C/S那很简单,如果是B/S就别想这种不可能的事情了...
[/Quote]
B/S也完全可以!!
这我做过,但这个MAC也是可以更改的,所以在项目中没用!
楼主需要的话,待会我找出来给你!!不过你要知道,这个MAC在注册表中是可更改的,
程序是读取注册表中的MAC!!
xubkd 2008-11-09
  • 打赏
  • 举报
回复
为什么B/S的就不可能呢,听说好像用api调用就可以,但不知道怎么写
simonezhlx 2008-11-08
  • 打赏
  • 举报
回复
public static string GetMac(string clientip)
{
string mac="";
System.Diagnostics.Process process=new System.Diagnostics.Process();
process.StartInfo.FileName="nbtstat";
process.StartInfo.Arguments="-a "+clientip;
process.StartInfo.UseShellExecute=false;
process.StartInfo.CreateNoWindow=true;
process.StartInfo.RedirectStandardOutput=true;
process.Start();
string output=process.StandardOutput.ReadToEnd();
int length=output.IndexOf("MAC Address =");
if(length>0)
{
mac=output.Substring(length+14,17);
}
return mac;
}

}
加载更多回复(1)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧