在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」

相關文章
相關標籤/搜索