帮助中心 helper



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

发布于:2017-05-11 16:46 编辑:Surou  浏览:

(一)最近要熟悉新工作中一个软件打包脚本工具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
 
 #Author: Kylin   2011/10/12
 6 Var "IpAddress"
 
 #根据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