転送:asp.netクライアント登録者macアドレスを取得します.

5108 ワード

asp.netクライアント登録者のmacアドレスを取得するには、2つの方法があります.
1,win 32の特性によって得られます.
        利点:クライアントに設定する必要はありません.短所:サーバのmacを取得できませんでした.(テストでは合計0です.サーバのmacを取得する必要はないと思いますので、欠点ではありません.)
2,javascriptがActiveXをロードすることによって実現される:
       特典:任意でmacアドレスを取得します.短所:クライアントブラウザでactiveXのオプションを全部開く必要があります.そうでないと入手できないので、あまり安定していません.
win 32の特性によって得られます.
     [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);

           }

      }
以上のコードでクライアントのmacを取得できます.クライアントの上で効果が見られます.
javascriptによってActiveXをロードすることによって実現される:
javascriptコードは以下の通りです.
// JScript   



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){

    try{

        if(MACAddr==null && objObject.IPEnabled)

        {

           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;

        }

    }

    catch(err)

    {   }

}

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";

    try

    {

        document.forms[0].appendChild(macTxt);

    }

    catch(err)

    {

    

        //    

    }

}



document.getElementById("foo").attachEvent("OnObjectReady", getObject);

document.getElementById("foo").attachEvent("OnCompleted", setValue);



try

{

    var service = locator.ConnectServer();

    var MACAddr ;

    var IPAddr ;

    var DomainAddr;

    var sDNSName;

    service.Security_.ImpersonationLevel=3;

    service.InstancesOfAsync(foo, 'Win32_NetworkAdapterConfiguration'); 

}

catch(err)

{

    //    

}

取得するaspxページで上記のjsを参照すると、このページでmaxアドレスを取得できます.
   /// <summary>

    ///   mac  

    /// </summary>

    /// <returns></returns>

    public string GetMACs()

    {

         try

        {

            return Request.Form["txtMAC"].ToString();

        }

        catch

        {



            return "";

        }

    }