NSIS如何獲取機器網卡Mac地址

轉至:KylinFire的博客園

  (一)最近要熟悉新工作中一個軟件打包腳本工具NSIS,學了一個下午,知道了大概,由於需求要獲取機器的Mac地址,先上網擺渡了一下,發現了一個牛人的留言,沒有用到NSIS的插件,現代碼整理如下:

 

複製代碼
 1 Name "GetMacAddressWithoutPlugin"
 2 OutFile "GetMacAddressWithoutPlugin.exe"
 3 ShowInstDetails show
 4 
 5 #此例子轉自CSDN上一個牛人的回覆,目前我還沒弄明白那參數是什麼意思,怎麼傳的,希望熱心牛人給予解釋
 6 
 7 
 8 # ------ 引入Logiclib.nsh宏來提供各種邏輯基本語句,不需要預先添加函數 ------
 9 !include "Logiclib.nsh"
10 
11 Var "MacAddress"
12 
13 Function .GetMacAddress
14   System::Call Iphlpapi::GetAdaptersInfo(i,*i.r0)
15   System::Alloc $0
16   Pop $1
17   System::Call Iphlpapi::GetAdaptersInfo(ir1r2,*ir0)i.r0
18   StrCmp $0 0 0 finish
19 loop:
20   StrCmp $2 0 finish
21   System::Call '*$2(i.r2,i,&t260.s,&t132.s,i.r5)i.r0' ;Unicode版將t改爲m
22   IntOp $3 403 + $5
23   StrCpy $6 ""
24   ${For} $4 404 $3
25     IntOp $7 $0 + $4
26     System::Call '*$7(&i1.r7)'
27     IntFmt $7 "%02X" $7
28     StrCpy $6 "$6$7"
29     StrCmp $4 $3 +2
30     StrCpy $6 "$6-"
31   ${Next}
32   StrCpy $MacAddress $6
33   Goto loop
34 finish:
35   System::Free $1
36 FunctionEnd
37 
38 Section
39 
40     Call .GetMacAddress
41     DetailPrint "當前機器Mac地址爲: $MacAddress"
42 
43 SectionEnd
複製代碼

  1.首先要引入Logiclib.nsh宏定義。

  2.通過調用系統函數來完成對Mac地址的獲取。

  3.此代碼生成的可執行文件大小爲40kb。

  4.望哪位熱心大牛能給解釋下調用系統函數時傳遞的參數的意思,拜謝!

 

  我是把它寫在一個函數中了,有需要的,可以像我一樣定義一個全局變量“MacAddress”,將取到的值賦給“$MacAddress”以留備用。

  此代碼在本人機器上運行結果如下:

                                                    

                                                     

 

  (二)本人調用兩個插件完成對機器Mac地址的獲取,代碼比調用系統函數的清晰易讀,現整理代碼如下:

 

複製代碼
 1 Name "GetMacAddress"
 2 OutFile "GetMacAddress.exe"
 3 ShowInstDetails show
 4 
 5 #Author: Kylin   2011/10/12
 6 Var "IpAddress"
 7 
 8 #根據Ip獲取Mac地址(需要下載IpConfig插件)
 9 Function .GetMacAddress
10 
11 #獲取IP
12 Ip::get_ip
13     Pop $0
14     #除去得到的IP後邊的";"號(得到的IP格式爲,例如: 172.16.16.217;)
15     StrCpy $IpAddress $0 -1
16     ;DetailPrint $IpAddress
17 
18 #根據得到的IP獲取對應網卡的ID
19 IpConfig::GetNetworkAdapterIDFromIPAddress $IpAddress
20   Pop $1
21   Pop $2
22   StrCmp $1 "ok" 0 error
23     ;DetailPrint "$1 , $2"
24 
25 #根據獲取的網卡ID得到對應的Mac地址
26 IpConfig::GetNetworkAdapterMACAddress $2
27     Pop $3
28     Pop $4
29     ;DetailPrint "$3 , $4 "
30     DetailPrint "MacAddress from Adapter #$2: $4"
31     Goto end
32         
33 error:
34     DetailPrint "未獲取到IP爲$IpAddress的Mac地址!"
35 end:
36 
37 FunctionEnd
38 
39 Section doTest
40 
41     Call .GetMacAddress
42 
43 SectionEnd
複製代碼

 

  1.此段代碼需要調用兩個插件,一個是ip.dll,用來獲取當前機器的IPi地址;另一個是ipConfig.dll,用來獲取Mac地址。

  2.首先先獲取機器的IP地址,然後根據處理後的IP地址結果(處理成正常的IP格式,如:xxx.xx.xx.xxx)獲取Adapter的ID號,最後通過Adapter的ID號獲取機器的Mac地址。

  3.如果NSIS安裝文件的根目錄中Plugins文件下沒有上述兩個dll文件,請先到NSIS插件網站下載後,放入到Plugins文件中,方可進行運行調試。

  4.此代碼生成的可執行文件大小爲98kb,比上一個大了一倍多 - -!。

 

  我是把它寫在一個函數中了,有需要的,可以定義一個全局變量“MacAddress”,將取到的值賦給“$MacAddress”以留備用。

  此代碼在本人機器上運行結果如下:

 

                                                      

 

  最後總結下,調用插件的確比較佔空間,對於一向以追求以最小空間完成打包程序的NSIS來說,前者調用系統函數更好些;如果不追求升那點空間,我個人更覺得後者更合適。

 

  如有不明白的請留言詢問,如有不對之處,望請指出!(此爲本人第一篇技術文章,望大家多支持)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章