web程序获取服务端以及客户端ip,name,MAC地址等信息
/// <summary> /// 获取IP地址 /// </summary> /// <returns></returns> public static string getIPAddress() { string result = String.Empty; result = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; // 如果使用代理,获取真实IP if (result != null && result.IndexOf(".") == -1) //没有“.”肯定是非IPv4格式 result = null; else if (result != null) { if (result.IndexOf(",") != -1) { //有“,”,估计多个代理。取第一个不是内网的IP。 result = result.Replace(" ", "").Replace("'", ""); string[] temparyip = result.Split(",;".ToCharArray()); for (int i = 0; i < temparyip.Length; i++) { if (IsIPAddress(temparyip[i]) && temparyip[i].Substring(0, 3) != "10." && temparyip[i].Substring(0, 7) != "192.168" && temparyip[i].Substring(0, 7) != "172.16.") { return temparyip[i]; //找到不是内网的地址 } } } else if (IsIPAddress(result)) //代理即是IP格式 return result; else result = null; //代理中的内容 非IP,取IP } if (null == result || result == String.Empty) result = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; if (result == null || result == String.Empty) result = System.Web.HttpContext.Current.Request.UserHostAddress; return result; } /// <summary> /// 判断是否是IP地址格式 0.0.0.0 /// </summary> /// <param name="str1">待判断的IP地址</param> /// <returns>true or false</returns> private static bool IsIPAddress(string str1) { if (str1 == null || str1 == string.Empty || str1.Length < 7 || str1.Length > 15) return false; string regformat = @"^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}$"; Regex regex = new Regex(regformat, RegexOptions.IgnoreCase); return regex.IsMatch(str1); }
如果没通过代理服务器,就取 REMOTE_ADDR 的值。
(1)C#获取本地服务端计算机名,IP,MAC地址,硬盘ID
using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Management; /// <summary> ///Computer 的摘要说明 /// </summary> public class Computer { public string CpuID; public string MacAddress; public string DiskID; public string IpAddress; public string LoginUserName; public string ComputerName; public string SystemType; public string TotalPhysicalMemory; //单位:M private static Computer _instance; public static Computer Instance() { if (_instance == null) _instance = new Computer(); return _instance; } public Computer() { CpuID = GetCpuID(); MacAddress = GetMacAddress(); DiskID = GetDiskID(); IpAddress = GetIPAddress(); LoginUserName = GetUserName(); SystemType = GetSystemType(); TotalPhysicalMemory = GetTotalPhysicalMemory(); ComputerName = GetComputerName(); } public string GetCpuID() { try { //获取CPU序列号代码 string cpuInfo = "";//cpu序列号 ManagementClass mc = new ManagementClass("Win32_Processor"); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementObject mo in moc) { cpuInfo = mo.Properties["ProcessorId"].Value.ToString(); } moc = null; mc = null; return cpuInfo; } catch { return "unknow"; } finally { } } public string GetMacAddress() { try { //获取网卡硬件地址 string mac = ""; ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementObject mo in moc) { if ((bool)mo["IPEnabled"] == true) { mac = mo["MacAddress"].ToString(); break; } } moc = null; mc = null; return mac; } catch { return "unknow"; } finally { } } public string GetIPAddress() { try { //获取IP地址 string st = ""; ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementObject mo in moc) { if ((bool)mo["IPEnabled"] == true) { //st=mo["IpAddress"].ToString(); System.Array ar; ar = (System.Array)(mo.Properties["IpAddress"].Value); st = ar.GetValue(0).ToString(); break; } } moc = null; mc = null; return st; } catch { return "unknow"; } finally { } } public string GetDiskID() { try { //获取硬盘ID String HDid = ""; ManagementClass mc = new ManagementClass("Win32_DiskDrive"); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementObject mo in moc) { HDid = (string)mo.Properties["Model"].Value; } moc = null; mc = null; return HDid; } catch { return "unknow"; } finally { } } /// <summary> /// 操作系统的登录用户名 /// </summary> /// <returns></returns> public string GetUserName() { try { string st = ""; ManagementClass mc = new ManagementClass("Win32_ComputerSystem"); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementObject mo in moc) { st = mo["UserName"].ToString(); } moc = null; mc = null; return st; } catch { return "unknow"; } finally { } } /// <summary> /// PC类型 /// </summary> /// <returns></returns> public string GetSystemType() { try { string st = ""; ManagementClass mc = new ManagementClass("Win32_ComputerSystem"); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementObject mo in moc) { st = mo["SystemType"].ToString(); } moc = null; mc = null; return st; } catch { return "unknow"; } finally { } } /// <summary> /// 物理内存 /// </summary> /// <returns></returns> public string GetTotalPhysicalMemory() { try { string st = ""; ManagementClass mc = new ManagementClass("Win32_ComputerSystem"); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementObject mo in moc) { st = mo["TotalPhysicalMemory"].ToString(); } moc = null; mc = null; return st; } catch { return "unknow"; } finally { } } /// <summary> /// /// </summary> /// <returns></returns> public string GetComputerName() { try { return System.Environment.GetEnvironmentVariable("ComputerName"); } catch { return "unknow"; } finally { } } }
using System.Management; //还需要引用;
(2)
web程序获取客户端MAC地址
[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 GetMacByARP() { try { string userip = Request.UserHostAddress; string strClientIP = Request.UserHostAddress.ToString().Trim(); Int32 ldest = inet_addr(strClientIP); //目的地的ip Int32 lhost = inet_addr(""); //本地服务器的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); } }
本地测试还是可以用的,上传到外网服务器上就不行了,的确,利用ARP数据包来获取MAC地址,在不同网段应该是不行滴。最保险的办法还应是在客户端取得MAC。
http://zhupan.javaeye.com/blog/26440
document.write("<OBJECT id='locator' classid='CLSID:76A64158-CB41-11D1-8B02-00600806D9B6' VIEWASTEXT></OBJECT>"); document.write("<OBJECT id=foo classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT>"); var MACAddr, IPAddr, sDNSName function getObject(objObject,objAsyncContext){ if(objObject.MACAddress != null && objObject.MACAddress != "undefined") MACAddr = objObject.MACAddress; if(objObject.IPEnabled && objObject.IPAddress(0) != null && objObject.IPAddress(0) != "undefined") IPAddr = objObject.IPAddress(0); if(objObject.DNSHostName != null && objObject.DNSHostName != "undefined") sDNSName = objObject.DNSHostName; } function setValue(hResult,pErrorObject, pAsyncContext){ createTxt("txtMAC", MACAddr); createTxt("txtIp", IPAddr); createTxt("txtPCName", sDNSName); } function createTxt(txtName, txtValue){ var macTxt = document.createElement("INPUT"); macTxt.name = txtName; macTxt.value = txtValue; macTxt.type = "hidden"; document.forms[0].appendChild(macTxt); } document.getElementById("foo").attachEvent("OnObjectReady", getObject); document.getElementById("foo").attachEvent("OnCompleted", setValue); var service = locator.ConnectServer(); var MACAddr ; var IPAddr ; var DomainAddr; var sDNSName; service.Security_.ImpersonationLevel=3; service.InstancesOfAsync(foo, 'Win32_NetworkAdapterConfiguration');
把这段JS保存到js文件里,然后在web页里直接引用就可以了,无需主动调用某个函数。服务端取MAC地址时:Request.Form["txtMAC"],顺带提供了txtIp和txtPCName两个值。注意,可能需要设置下IE权限。
顺带提一下,对于用object调用的组件对象的事件,除了在script标签里用event和for属性来指定事件处理器外,还可以用attachEvent来完成,若需要事件里传递的参数,只要保证入参顺序与出参一致就OK了(可参考《javascript高级程序设计》里讲arguments的那一段)。
注意事项:
1、引用该js文件的页上至少有一个form元素;
2、提交第一个form才能得到MAC,否则,请修改createTxt函数让那几个文本框append到其它form里;
3、attachEvent是不兼容FF的(太懒,没管跨浏览器);
4、注意设置IE权限;
-----------------------
在我看来,尽量不要在web程序里取客户端MAC,尝试用别的途径达到想要的效果。
(3)ASP.NET 获取客户端IP地址
我们用Request.ServerVariables( "REMOTE_ADDR ") 来取得客户端的IP地址,
但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的IP地址,而不是真正的客户端IP地址。
要想透过代理服务器取得客户端的真实IP地址,就要使用 Request.ServerVariables( "HTTP_X_FORWARDED_FOR ") 来读取。
不过要注意的事,并不是每个代理服务器都能用 Request.ServerVariables( "HTTP_X_FORWARDED_FOR ") 来读取客户端的真实IP,有些用此方法读取到的仍然是代理服务器的IP。
还有一点需要注意的是:如果客户端没有通过代理服务器来访问,那么用 Request.ServerVariables ( "HTTP_X_FORWARDED_FOR ") 取到的值将是空的。因此,如果要在程序中使用此方法,可以这样处理:
userip = Request.ServerVariables( "HTTP_X_FORWARDED_FOR ")
If userip = " " Then userip = Request.ServerVariables( "REMOTE_ADDR ") 即:如果客户端通过代理服务器,则取 HTTP_X_FORWARDED_FOR 的值,
备注:Request.ServerVariables小结 http://www.cnblogs.com/analyzer/archive/2008/01/24/1050789.html
ALL_HTTP 客户端发送的所有 HTTP 标题文件。
ALL_RAW 检索未处理表格中所有的标题。
APPL_MD_PATH 检索 ISAPI DLL 的 (WAM) Application 的元数据库路径。
APPL_PHYSICAL_PATH 检索与元数据库路径相应的物理路径。IIS 通过将 APPL_MD_PATH 转换为物理(目录)路径以返回值。
AUTH_PASSWORD 该值输入到客户端的鉴定对话中。只有使用基本鉴定时,该变量才可用。
AUTH_TYPE 这是用户访问受保护的脚本时,服务器用于检验用户的验证方法。
AUTH_USER 未被鉴定的用户名。
CERT_COOKIE 客户端验证的唯一 ID,以字符串方式返回。可作为整个客户端验证的签字。
CERT_FLAGS 如有客户端验证,则 bit0 为 1。如果客户端验证的验证人无效(不在服务器承认的CA列表中),bit1被设置为1.
CERT_ISSUER 用户验证中的颁布者字段(O=MS,OU=IAS,CN=user name,C=USA)。
CERT_KEYSIZE 安全套接字层连接关键字的位数,如 128。
CERT_SECRETKEYSIZE 服务器验证私人关键字的位数。如 1024。
CERT_SERIALNUMBER 用户验证的序列号字段。
CERT_SERVER_ISSUER 服务器验证的颁发者字段。
CERT_SERVER_SUBJECT 服务器验证的主字段。
CERT_SUBJECT 客户端验证的主字段。
CONTENT_LENGTH 客户端发出内容的长度。
CONTENT_TYPE 内容的数据类型。同附加信息的查询一起使用,如:HTTP查询GET、POST和PUT。
GATEWAY_INTERFACE 服务器使用的CGI规格的修订。格式为CGI/revision。
LOGON_USER 用户登录 Windows NT? 的帐号。
PATH_INFO 客户端提供的额外路径信息。可以使用这些虚拟路径和PATH_INFO服务器变量访问脚本。如果该信息来自URL,在到达CGI脚本前就已经由服务器解码了。
PATH_TRANSLATED PATH_INFO转换后的版本,该变量获取路径并进行必要的由虚拟至物理的映射。
QUERY_STRING 查询 HTTP 请求中问号(?)后的信息。
REMOTE_ADDR 发出请求的远程主机的 IP 地址。
REMOTE_HOST 发出请求的主机名称。如果服务器无此信息,它将设置为空的MOTE_ADDR 变量。
REMOTE_USER 用户发送的未映射的用户名字符串。该名称是用户实际发送的名称,与服务器上验证过滤器修改过后的名称相对。
REQUEST_METHOD 该方法用于提出请求。相当于用于HTTP的GET/HEAD/POST等等。
SCRIPT_NAME 执行脚本的虚拟路径。用于自引用的 URL。
SERVER_NAME 出现在自引用 UAL 中的服务器主机名、DNS 化名或 IP 地址。
SERVER_PORT 发送请求的端口号。
SERVER_PORT_SECURE 包含 0 或 1 的字符串。如果安全端口处理了请求,则为 1,否则为 0。
SERVER_PROTOCOL 请求信息协议的名称和修订。格式为 protocol/revision 。
SERVER_SOFTWARE 应答请求并运行网关的服务器软件的名称和版本。格式为 name/version 。
被发现隐起的
Request.ServerVariables("NUMBER_OF_PROCESSORS")
Request.ServerVariables("OS")
Request.ServerVariables("WINDIR")
Request.ServerVariables("TEMP")
Request.ServerVariables("TMP")
Request.ServerVariables("ComSpec")
Request.ServerVariables("Os2LibPath")
Request.ServerVariables("Path")
Request.ServerVariables("PATHEXT")
Request.ServerVariables("PROCESSOR_ARCHITECTURE")
Request.ServerVariables("PROCESSOR_IDENTIFIER")
Request.ServerVariables("PROCESSOR_LEVEL")
Request.ServerVariables("PROCESSOR_REVISION")
Request.ServerVariables("HTTP_X_FORWARDED_FOR") 是可以获得位于代理(网关)后面的直接IP,当然必须这个代理支持
本机ip:<%=request.servervariables("remote_addr")%>
服务器名:<%=Request.ServerVariables("SERVER_NAME")%>
服务器IP:<%=Request.ServerVariables("LOCAL_ADDR")%>
服务器端口:<%=Request.ServerVariables("SERVER_PORT")%>
服务器时间:<%=now%>
IIS版本:<%=Request.ServerVariables("SERVER_SOFTWARE")%>
脚本超时时间:<%=Server.ScriptTimeout%>
本文件路径:<%=server.mappath(Request.ServerVariables("SCRIPT_NAME"))%>
服务器CPU数量:<%=Request.ServerVariables("NUMBER_OF_PROCESSORS")%>
服务器解译引擎:<%=ScriptEngine & "/"& ScriptEngineMajorVersion& "."&ScriptEngineMinorVersion&"."& ScriptEngineBuildVersion %>
服务器操作系统:<%=Request.ServerVariables("OS")%>
支持的文件类型:<%=Request.ServerVariables("HTTP_Accept")%>
访问的文件路径:<%=Request.ServerVariables("HTTP_url")%>
用户代理的信息:<%=Request.ServerVariables("HTTP_USER_AGENT")%>