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来说,前者调用系统函数更好些;如果不追求升那点空间,我个人更觉得后者更合适。

 

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值