我不是提问,而是把自己知道的跟大家一起分享下
目前百度或者谷歌到的方法有很多,不外乎就总结出来的
1。调用客户端的WMI读取MAC地址
2。通过某些网络协议抓取客户端的请求信息获取客户端的MAC地址
第一种,都是基于ActiveX插件法获取客户端的信息,但是这种因为IE的安全级别问题,是无法做到通用的,包括建行等银行的U盾,网银行支付控件,支付宝控件都是一致的
他们都是基于ActiveX的插件,从而控制B/S模式下客户端的操作,这些方法在不同浏览器上就会有不同的BUG,所以目前来说支持这些ActiveX插件的就只有IE6,7,但是因为微软的IE浏览器自身的一些缺陷,导致ActiveX插件不稳定,比如说支付宝控件在IE7和IE8下,如果不是信任网站,则会造成IE崩溃,访问带有ActiveX插件的页面,IE就直接崩溃了。
第二种,只是有人提及HTTP协议是基于请求的,应该不可能取不到
但是我这个没学过网络协议的人,发现网络协议都是基于硬件的
如果您的B/S程序不是在路由器上,则是无法解析网络协议,因为HTTP协议里的TCP/IP协议
突然发现评论里有人提起这篇N年前的文章,好吧我给出答案
第一种
是调用WMI服务,获取客户端的MAC地址,其实是将获取的代码编译成为了ActiveX的DLL
可参考以下文章
http://blog.163.com/guyywan_1314/blog/static/1288542502011070514680/
http://www.cnblogs.com/time-is-life/archive/2006/01/11/312509.html
https://msdn.microsoft.com/zh-cn/library/ms178709%28v=vs.80%29.aspx
因为技术过于久远,我本人也未真正用到这种方法(因为要过IE的安全设置,必须给微软购买数字签名,没数字签名,在本地的安全级别必须调整到自定义的级别才能调用,某些版本的系统里必须发布到IIS6里)
第二种
第二种方法是一种通用的较多方法,
就是通过客户端在浏览器发起的请求操作(post/get)从而在服务端获取到这个通讯过程中的客户端ip地址
如
string ip =System.Web.HttpContext.Current.Request.UserHostAddress;
或 string ip =System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
具体内容我就不详述了
因为博客园里有很多这样的文章
http://www.cnblogs.com/yejun/archive/2008/02/26/1082485.html
http://www.cnblogs.com/huacw/archive/2012/03/15/2398524.html
再贴一段我也不知道从哪里COPY来的代码
以供各位看官参考,放的位置可考虑放在Global或者需要下面这段代码的文件里
/// <summary> /// 获取远程访问用户的Ip地址 /// </summary> /// <returns>返回Ip地址</returns> protected string GetLoginIp() { string loginip = ""; //Request.ServerVariables[""]--获取服务变量集合 if (Request.ServerVariables["REMOTE_ADDR"] != null) //判断发出请求的远程主机的ip地址是否为空 { //获取发出请求的远程主机的Ip地址 loginip = Request.ServerVariables["REMOTE_ADDR"].ToString(); } //判断登记用户是否使用设置代理 else if (Request.ServerVariables["HTTP_VIA"] != null) { if (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) { //获取代理的服务器Ip地址 loginip = Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); } else { //获取客户端IP loginip = Request.UserHostAddress; } } else { //获取客户端IP loginip = Request.UserHostAddress; } return loginip; }