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")%>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?