VLisp 读取网卡 MAC 地址

使用Lisp语言读取MAC地址, 目前最合适的方法是通过WMI实现. 但是网上可查到的几种方法都有一个弊端, 就是通过识别ID为”本地连接”的设备来读取MAC, 并且标注为仅支持中文系统.

事实上这是行不通的, 如果你研究过系统的克隆, 你就会发现,”本地连接 2”是XP系统经常出现的一个问题.

在DOSLib 6.1中也具备读取MAC的函数, 但是貌似实现的方法是读取最后一个MAC地址, 当你把一个Windows Mobile 系统的手机连到电脑上, 它竟然返回手机的MAC…

经过对流行代码的少量修改, 写出了一个能返回所有设备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
;;; 获取网卡MAC地址
;;; 对win2000系统的兼容性未做测试
;;; 暂不知道是否会读取到非网卡设备
(defun macaddr (/ mac WMIobj con lox sn)
(vl-load-com)
(if (setq WMIobj (vlax-create-object "wbemScripting.SwbemLocator"))
(progn
(setq con (vl-catch-all-apply 'vlax-invoke (list WMIobj 'ConnectServer "." "" "" "" "" "" 128 nil)))
(if (vl-catch-all-error-p con)
(setq con (vlax-invoke WMIobj 'ConnectServer "." "" "" "" "" ""))
)

(setq lox (vlax-invoke con 'ExecQuery "Select * From Win32_NetworkAdapter"))
(vlax-for i lox
(if (vlax-get i 'NetConnectionID)
(progn
(setq sn (vlax-get i 'MACAddress))
(or
(member sn mac)
(setq mac (cons sn mac))
)

)

)

)

(mapcar 'vlax-release-object
(list lox con WMIobj)
)

)

)

(reverse mac)
)