NSIS如何获取机器网卡Mac地址 - - - - - 原创

  (一)最近要熟悉新工作中一个软件打包脚本工具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来说,前者调用系统函数更好些;如果不追求升那点空间,我个人更觉得后者更合适。

 

  如有不明白的请留言询问,如有不对之处,望请指出!(此为本人第一篇技术文章,望大家多支持)

 

posted @ 2011-10-13 00:13  KylinFire  阅读(2994)  评论(2编辑  收藏  举报