NSIS如何获取机器网卡Mac地址
(一)最近要熟悉新工作中一个软件打包脚本工具NSIS,学了一个下午,知道了大概,由于需求要获取机器的Mac地址,先上网摆渡了一下,发现了一个牛人的留言,没有用到NSIS的插件,现代码整理如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | Name "GetMacAddressWithoutPlugin"OutFile "GetMacAddressWithoutPlugin.exe"ShowInstDetails show#此例子转自CSDN上一个牛人的回复,目前我还没弄明白那参数是什么意思,怎么传的,希望热心牛人给予解释# ------ 引入Logiclib.nsh宏来提供各种逻辑基本语句,不需要预先添加函数 ------!include "Logiclib.nsh"Var "MacAddress" Function .GetMacAddress14 System::Call Iphlpapi::GetAdaptersInfo(i,*i.r0)15 System::Alloc $016 Pop $117 System::Call Iphlpapi::GetAdaptersInfo(ir1r2,*ir0)i.r018 StrCmp $0 0 0 finish19 loop:20 StrCmp $2 0 finish21 System::Call '*$2(i.r2,i,&t260.s,&t132.s,i.r5)i.r0' ;Unicode版将t改为m22 IntOp $3 403 + $523 StrCpy $6 ""24 ${For} $4 404 $325 IntOp $7 $0 + $426 System::Call '*$7(&i1.r7)'27 IntFmt $7 "%02X" $728 StrCpy $6 "$6$7"29 StrCmp $4 $3 +230 StrCpy $6 "$6-"31 ${Next}32 StrCpy $MacAddress $633 Goto loop34 finish:35 System::Free $136 FunctionEnd37 38 Section39 40 Call .GetMacAddress41 DetailPrint "当前机器Mac地址为: $MacAddress"42 43 SectionEnd |
1.首先要引入Logiclib.nsh宏定义。
2.通过调用系统函数来完成对Mac地址的获取。
3.此代码生成的可执行文件大小为40kb。
4.望哪位热心大牛能给解释下调用系统函数时传递的参数的意思,拜谢!
我是把它写在一个函数中了,有需要的,可以像我一样定义一个全局变量“MacAddress”,将取到的值赋给“$MacAddress”以留备用。
此代码在本人机器上运行结果如下:

(二)本人调用两个插件完成对机器Mac地址的获取,代码比调用系统函数的清晰易读,现整理代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 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 .GetMacAddress10 11 #获取IP12 Ip::get_ip13 Pop $014 #除去得到的IP后边的";"号(得到的IP格式为,例如: 172.16.16.217;)15 StrCpy $IpAddress $0 -116 ;DetailPrint $IpAddress17 18 #根据得到的IP获取对应网卡的ID19 IpConfig::GetNetworkAdapterIDFromIPAddress $IpAddress20 Pop $121 Pop $222 StrCmp $1 "ok" 0 error23 ;DetailPrint "$1 , $2"24 25 #根据获取的网卡ID得到对应的Mac地址26 IpConfig::GetNetworkAdapterMACAddress $227 Pop $328 Pop $429 ;DetailPrint "$3 , $4 "30 DetailPrint "MacAddress from Adapter #$2: $4"31 Goto end32 33 error:34 DetailPrint "未获取到IP为$IpAddress的Mac地址!"35 end:36 37 FunctionEnd38 39 Section doTest40 41 Call .GetMacAddress42 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来说,前者调用系统函数更好些;如果不追求升那点空间,我个人更觉得后者更合适。
文章来源:http://blog.csdn.net/keljony/article/details/7640405

