在Web中獲取MAC地址

来源:https://www.cnblogs.com/tosser/archive/2018/05/10/9022187.html
-Advertisement-
Play Games

很多時候都很難琢磨客戶在想什麼,也許是自己業務經驗不足,也許是客戶要顯示出他在軟體方面也非常的專業。記得以前聽過一個故事,說一個富人想娶個媳婦,然後他比較鐘意的有三個女人,然後就想從三個女人中選一個,他分別給了三個女人各一千塊錢,並對她們說,“我這裡有一個房間,請你們用自己的一千塊錢儘可能的將房間填 ...


  很多時候都很難琢磨客戶在想什麼,也許是自己業務經驗不足,也許是客戶要顯示出他在軟體方面也非常的專業。記得以前聽過一個故事,說一個富人想娶個媳婦,然後他比較鐘意的有三個女人,然後就想從三個女人中選一個,他分別給了三個女人各一千塊錢,並對她們說,“我這裡有一個房間,請你們用自己的一千塊錢儘可能的將房間填滿”。第一個女人,將1000塊錢都買了棉花,但是這些棉花只填滿了整個房間的三分之一;第二個女人,將1000塊錢都買了氣球,但是這些氣球也只填滿了整個房間的三分之二;第三個女人,花了1塊錢買了一支蠟燭,讓蠟燭的光照亮了整個房間。然後……這個富人愉快的娶了其中胸部最大的那個女人。這個故事告訴我們,有時你根本不知道客戶到底要的是什麼!

 

解決安全登錄的問題

  去給客戶演示系統,演示完剛開發完的系統以後客戶就將我們的系統批的遍體鱗傷,這時才知道自己的系統比想象中的更不堪。在如此不堪的系統面前,客戶又提出了一個需求,要限制用戶的登錄機器。補充一下,演示的系統是一個ERP系統,是BS結構的,用Java寫的。客戶要求,要限制能夠登錄系統的電腦,需要綁定MAC地址。因為系統里的數據比較重要,不能讓員工回家登錄系統,因此必須要進行限制。

 

解決思路

  這樣的問題,能想到的解決思路只有兩個:

  1、在EXE文件中嵌入一個瀏覽器控制項,瀏覽器中顯示ERP的頁面,EXE獲取MAC地址後提交到伺服器。感覺這樣先是要處理EXE提交的MAC地址,然後還要和頁面交互,想想貌似比較複雜,就否掉了。

  2、寫一個OCX,讓頁面中的JS與OCX進行交互,OCX獲取到MAC地址後,將MAC返回給JS,JS通過DOM操作寫入到對應的表單中,然後和用戶名、密碼一起提交給伺服器。感覺這個好像實現起來還比較簡單。就這個吧!

 

OCX中獲取MAC地址的關鍵代碼

  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     // Make an initial call to GetAdaptersAddresses to get the necessary size into the ulOutBufLen variable
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         // If successful, output some information from the data we received
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的方法就留在這裡吧!也許,我以後會用到也說不定呢。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 參考網路上代碼編輯而成,無技術含量,可自行定製: 目前親測有效,若有待完善之處,還望指出! 強調:將此統計py腳本放置項目的根目錄下執行即可。 1、遍歷文件,遞歸遍歷文件夾中的所有 2、指定文件類型:項目的代碼行數,故只考慮.py文件,當然也可在指定的文件類型列表whitelist中添加其他類型 3 ...
  • 例子 當我們訪問Facebook網站,需要代理伺服器A(翻/牆)才能夠訪問。當代理伺服器A訪問Facebook,Facebook也不老實,用代理伺服器B來隱藏自己的後端伺服器,A訪問的是B。 A:正向代理 B:反向代理 圖例 在知乎中看正向代理與反向代理的解釋,有張圖覺得解釋不錯,但可能導致誤解,於 ...
  • 找房子找的頭都大了,價格翻倍,而且面積小,質量差! 公司的項目倒不算太忙但是學習方面很忙,腦力明顯不足了! 自己的引擎依然處於停滯狀態! 虛幻的格鬥倒是有一點進度,不過還是卡在用藍圖來實現複雜的多重迴圈時邏輯總調不對! 新找的房子不太滿意,乾濕分離的玻璃門沒有了用一個簾來代替,門鎖是密碼的,從裡面能 ...
  • 一、 伺服器server的寫法: 1. 創建 socket 套接字:網路編程介面 socket(family = AF_INET , type = SOCKET_STREM,proto = 0, fileno = None) 提供了多種socket family。AF_INET 是預設的family ...
  • 第一步:dubbo-monitor-simple-2.5.3 連上zookeeper註冊中心,獲得要調用的介面的ip和埠號 第二步:輸入命令:telnet 192.168.x.xxx xxxxx 回車後如果顯示 :Escape character is '^]'. 代表連接成功,正在監聽dubbo ...
  • 一、分散式架構 1、分散式特點 分佈性 對等性。分散式系統中的所有電腦節點都是對等的 併發性。多個節點併發的操作一些共用的資源 缺乏全局時鐘。節點之間通過消息傳遞進行通信和協調,因為缺乏全局時鐘,很難定義兩個事件誰先誰後 故障總是會發生。系統設計時,需要考慮到任何異常情況 2、分散式環境的各種問題 ...
  • 官方的說法: classmethod(function) 中文說明: classmethod是用來指定一個類的方法為類方法,沒有此參數指定的類的方法為實例方法,使用方法如下: 看後之後真是一頭霧水。說的啥子東西呢??? 自己到國外的論壇看其他的例子和解釋,頓時就很明朗。 下麵自己用例子來說明。 看下 ...
  • 比較排序與非比較排序的對比 常見的快速排序、歸併排序、堆排序、冒泡排序等屬於比較排序。在排序的最終結果里,元素之間的次序依賴於它們之間的比較。每個數都必須和其他數進行比較,才能確定自己的位置。在冒泡排序之類的排序中,問題規模為n,又因為需要比較n次,所以平均時間複雜度為O(n²)。在歸併排序、快速排 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...