在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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...