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 .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 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 .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来说,前者调用系统函数更好些;如果不追求升那点空间,我个人更觉得后者更合适。
文章来源:http://blog.csdn.net/keljony/article/details/7640405