web程序获取服务端以及客户端ip,name,MAC地址等信息

/// 
      /// 获取IP地址
      /// 
      /// 
      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;
      }
      /// 
      /// 判断是否是IP地址格式 0.0.0.0
      /// 
      /// 待判断的IP地址
      /// true or false
      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;

/// 
///Computer 的摘要说明
/// 
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
        {
        }

    }

    ///  
    /// 操作系统的登录用户名 
    ///  
    ///  
    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
        {
        }

    }


    ///  
    /// PC类型 
    ///  
    ///  
    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
        {
        }

    }

    ///  
    /// 物理内存 
    ///  
    ///  
    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
        {
        }
    }
    ///  
    ///  
    ///  
    ///  
    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 + "的朋友!" + "
"); 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 + "
" + ",MAC地址为" + mac_dest + "的朋友!" + "
"); } catch (Exception err) { Response.Write(err.Message); } }

  本地测试还是可以用的,上传到外网服务器上就不行了,的确,利用ARP数据包来获取MAC地址,在不同网段应该是不行滴。最保险的办法还应是在客户端取得MAC。

http://zhupan.javaeye.com/blog/26440

document.write("");
document.write("");
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")%>

 

转载于:https://www.cnblogs.com/wangfengderizi/archive/2012/12/24/2830936.html

你可能感兴趣的:(web程序获取服务端以及客户端ip,name,MAC地址等信息)