利用WMI与ActiveX在客户端获取MAC地址和IP地址的JS实现
本文介绍在B/S架构系统中,通过客户端JavaScript脚本结合Windows Management Instrumentation (WMI) 和 ActiveX 控件,直接获取客户端网卡的MAC地址、IP地址及主机名的方法。该方案无需服务器端处理,利用系统自带的ActiveX对象实现异步查询,具有较好的执行速度和可靠性,适用于需要客户端身份验证的场景。
客户端网络信息获取方案概述
在构建B/S结构的系统时,经常需要获取客户端的详细信息,例如IP地址和MAC地址,以便结合身份验证机制。虽然获取服务器端的MAC地址相对简单,但获取客户端的MAC地址则较为复杂。传统方法包括调用Win32API或直接执行nbtstat命令,但这些方式存在诸多局限。相比之下,采用客户端脚本(如JavaScript)是一种更优的解决方案。这种方法的优势在于无需服务器端进行额外处理,由客户端自行获取相关信息并传递至服务器端,其执行速度和可靠性均优于在服务器端获取的方式。
具体实现的html和javascript如下:
完整HTML与JavaScript实现代码
具体实现的HTML和JavaScript代码如下:
<HTML>
<HEAD>
<TITLE>WMI Scripting HTML</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<SCRIPT language=JScript event="OnCompleted(hResult,pErrorObject, pAsyncContext)" for=foo>
document.forms[0].txtMACAddr.value=unescape(MACAddr);
document.forms[0].txtIPAddr.value=unescape(IPAddr);
document.forms[0].txtDNSName.value=unescape(sDNSName);
//document.formbar.submit();
</SCRIPT>
<SCRIPT language=JScript event=OnObjectReady(objObject,objAsyncContext) for=foo>
if(objObject.IPEnabled != null && objObject.IPEnabled != "undefined" && objObject.IPEnabled == true)
{
if(objObject.MACAddress != null && objObject.MACAddress != "undefined")
MACAddr = objObject.MACAddress;
if(objObject.IPEnabled && objObject.IPAddress(0) != null && objObject.IPAddress(0) != "undefined")
IPAddr = objObject.IPAddress(0);
if(objObject.DNSHostName != null && objObject.DNSHostName != "undefined")
sDNSName = objObject.DNSHostName;
}
</SCRIPT>
<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY>
<OBJECT id=locator classid=CLSID:76A64158-CB41-11D1-8B02-00600806D9B6 VIEWASTEXT></OBJECT>
<OBJECT id=foo classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT>
<SCRIPT language=JScript>
var service = locator.ConnectServer();
var MACAddr ;
var IPAddr ;
var DomainAddr;
var sDNSName;
service.Security_.ImpersonationLevel=3;
service.InstancesOfAsync(foo, 'Win32_NetworkAdapterConfiguration');
</SCRIPT>
<FORM id=formfoo name=formbar method=post>
<INPUT type="text" name=txtMACAddr>
<INPUT type="text" name=txtIPAddr>
<INPUT type="text" name=txtDNSName>
</FORM>
</BODY>
</HTML> 其实最关键的还是用到两个ActiveX:
核心ActiveX对象说明
实现过程中关键的两个ActiveX对象定义如下:
<OBJECT id=locator classid=76A64158-CB41-11D1-8B02-00600806D9B6 VIEWASTEXT></OBJECT>
<OBJECT id=foo classid=75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT> 值得注意的是,这两个ActiveX控件均为Windows系统自带,无需额外下载或进行注册操作。
随后,通过脚本与上述ActiveX对象进行交互,所使用的脚本语言可以是JavaScript或VBScript。
D3.js 比例尺与坐标轴的配置详解
2026-11-05 16:54:46
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19
