在Web中获取MAC地址

  不少时候都很难琢磨客户在想什么,也许是本身业务经验不足,也许是客户要显示出他在软件方面也很是的专业。记得之前听过一个故事,说一个富人想娶个媳妇,而后他比较钟意的有三个女人,而后就想从三个女人中选一个,他分别给了三个女人各一千块钱,并对她们说,“我这里有一个房间,请大家用本身的一千块钱尽量的将房间填满”。第一个女人,将1000块钱都买了棉花,可是这些棉花只填满了整个房间的三分之一;第二个女人,将1000块钱都买了气球,可是这些气球也只填满了整个房间的三分之二;第三个女人,花了1块钱买了一支蜡烛,让蜡烛的光照亮了整个房间。而后……这个富人愉快的娶了其中胸部最大的那个女人。这个故事告诉咱们,有时你根本不知道客户到底要的是什么!html

 

解决安全登陆的问题浏览器

  去给客户演示系统,演示完刚开发完的系统之后客户就将咱们的系统批的遍体鳞伤,这时才知道本身的系统比想象中的更不堪。在如此不堪的系统面前,客户又提出了一个需求,要限制用户的登陆机器。补充一下,演示的系统是一个ERP系统,是BS结构的,用Java写的。客户要求,要限制可以登陆系统的电脑,须要绑定MAC地址。由于系统里的数据比较重要,不能让员工回家登陆系统,所以必需要进行限制。安全

 

解决思路服务器

  这样的问题,能想到的解决思路只有两个:微信

  一、在EXE文件中嵌入一个浏览器控件,浏览器中显示ERP的页面,EXE获取MAC地址后提交到服务器。感受这样先是要处理EXE提交的MAC地址,而后还要和页面交互,想一想貌似比较复杂,就否掉了。函数

  二、写一个OCX,让页面中的JS与OCX进行交互,OCX获取到MAC地址后,将MAC返回给JS,JS经过DOM操做写入到对应的表单中,而后和用户名、密码一块儿提交给服务器。感受这个好像实现起来还比较简单。就这个吧!测试

 

OCX中获取MAC地址的关键代码spa

  OCX中能够直接调用Windows操做系统的API函数,写起来也比较简单,代码以下:操作系统

 1 BSTR CGetMacCtrl::GetMacAddress(void)
 2 {
 3     AFX_MANAGE_STATE(AfxGetStaticModuleState());
 4 
 5     CString strResult;
 6 
 7     // TODO: 在此添加调度处理程序代码
 8     ULONG outBufLen = sizeof(IP_ADAPTER_ADDRESSES);
 9     PIP_ADAPTER_ADDRESSES pAddresses = (IP_ADAPTER_ADDRESSES*)malloc(outBufLen);
10     if (pAddresses == NULL) 
11     {
12         return NULL;
13     }
14     
15     if(GetAdaptersAddresses(AF_UNSPEC, 0, NULL, pAddresses, &outBufLen) == ERROR_BUFFER_OVERFLOW)
16     {
17         free(pAddresses);
18         pAddresses = (IP_ADAPTER_ADDRESSES*)malloc(outBufLen);
19         if (pAddresses == NULL) 
20         {
21             return NULL;
22         }
23     }
24 
25     wchar_t acMAC[32] = { 0 };
26 
27     if(GetAdaptersAddresses(AF_UNSPEC, 0, NULL, pAddresses, &outBufLen) == NO_ERROR)
28     {
29         
30         for(PIP_ADAPTER_ADDRESSES pCurrAddresses = pAddresses; pCurrAddresses != NULL; pCurrAddresses = pCurrAddresses->Next)
31         {
32             // 确保 MAC 地址的长度为 00-00-00-00-00-00
33             if(pCurrAddresses->PhysicalAddressLength != 6)
34             {
35                 continue;
36             }
37             wsprintf((LPWSTR)acMAC, _T("%02X-%02X-%02X-%02X-%02X-%02X"),
38                 int (pCurrAddresses->PhysicalAddress[0]),
39                 int (pCurrAddresses->PhysicalAddress[1]),
40                 int (pCurrAddresses->PhysicalAddress[2]),
41                 int (pCurrAddresses->PhysicalAddress[3]),
42                 int (pCurrAddresses->PhysicalAddress[4]),
43                 int (pCurrAddresses->PhysicalAddress[5]));
44             break;
45         }
46     } 
47 
48     free(pAddresses);
49     strResult = acMAC;
50 
51     return strResult.AllocSysString();
52 }

  代码差很少就这样吧,我用的VS2012写的ActiveX,编译生成OCX。插件

 

在Web中进行测试

  在Web中测试也比较简单,经过clsid引入OCX文件,而后JS调用OCX文件中的函数,函数返回MAC地址给JS,JS进行DOM操做,代码以下:

 1 <!DOCTYPE html>
 2 <html lang="zh-CN">
 3     <head>
 4         <meta charset="utf8">
 5         <title>获取Mac地址Demo</title>
 6     </head>
 7     <body>
 8         <object id="getmac" classid="clsid:52931A6A-93B4-4750-8FE6-B666E90B1D54" 
 9         codebase="'getmac.ocx'" style="display:none"></object>
10         
11         <h1>MAC:</h1>
12         <span id="mac"></span>
13         <input type="text" id="macAddress" name="macAddress" value="" />
14     </body>
15         <script>
16             var mac = getmac.GetMacAddress();
17             document.getElementById("mac").innerHTML = mac;
18             document.getElementById("macAddress").value = mac;
19             document.getElementById("macAddress").style.display = '';
20         </script>
21 </html>

  经过object标签引入了OCX文件,定义了id为getmac,而后经过getmac来调用OCX中的函数GetMacAddress()获取MAC地址。

 

  通过简单的测试仍是能够的,而后我整合进入了JeeSite系统中(我其余文章说过,咱们的项目是在JeeSite上作二次开发),测试之后发现ERP的页面对IE浏览器支持很差。由于OCX只能在IE浏览器中使用,结果这个方案就放弃了。后来,找到一个开源的Chrome的插件,也完成MAC地址的获取,该Chrome插件分为两部分,一部分是Chrome的插件,另一个是EXE文件,该EXE文件也是与插件进行通讯的,因为该插件不是我写的,我就不往这里放了。总之,最后仍是把客户端这个需求解决了。OCX的方法就留在这里吧!也许,我之后会用到也说不定呢。

 


 

个人微信公众号:“码农UP2U”

相关文章
相关标签/搜索