javascript利用wmi获取客户端网卡信息

本文系转载

近因工作所需,需要获取客户端网卡信息,试过多种方法,如使用VC写Activex控件,但此法需对控件签名,否则如果IE浏览器安全级别设置较高控件可能经常被提示

而且很有可能无法运行;另又发现了使用VBscript也可以获取客户端网卡信息,稍候附上代码,但使用此法IE可能会提示无法'创建对象',暂无发现良好解决办法,最

终找到了一种简便且有效的方法,即使用使用JavascriptSWbemLocator对象操作WMI 的 Win32_NetworkAdapterConfiguration来获取所需信息.

什么是WMI

WMI是Windows 2K/XP管理系统的核心;对于其他的Win32操作系统,WMI是一个有用的插件。WMI以CIMOM为基础,CIMOM即公共信息模型对象管理器(Common

Information Model Object Manager),是一个描述操作系统构成单元的对象数据库,为MMC和脚本程序提供了一个访问操作系统构成单元的公共接口。有了WMI

,工具软件和脚本程序访问操作系统的不同部分时不需要使用不同的API;相反,操作系统的不同部分都可以插入WMI,工具软件和WMI可以方便地读写WMI,所以不

只Javascript可以连接WMI,VBscript,C#等语言亦可。

什么是Win32_NetworkAdapterConfiguration

Win32_NetworkAdapterConfiguration描述了一个网络适配器的属性及行为,此类包括支持TCP/IP管理及与相对网络适配器独立的IPX协议的额外属性及方法

下面简单翻译一下来自MSDN的关于Win32_NetworkAdapterConfiguration的主要属性及方法,详细资料请参考http://msdn.microsoft.com/en-

us/library/aa394217(VS.85).aspx

class Win32_NetworkAdapterConfiguration : CIM_Setting

{

boolean ArpAlwaysSourceRoute;

boolean ArpUseEtherSNAP;

string Caption;//CIM_Setting对象的描述,该属性从CIM_Setting继承

string DatabasePath;

boolean DeadGWDetectEnabled;

string DefaultIPGateway[];//默认网关,注意该类型为数组

uint8 DefaultTOS;

uint8 DefaultTTL;//IP包头的默认TTL值

string Description;//CIM_Setting对象的描述,该属性从CIM_Setting继承

boolean DHCPEnabled;//是否允许DHCP,如果允许在建立网络连接的时候由DHCP服务器来分配地址

datetime DHCPLeaseExpires;//DHCP租用有效期

datetime DHCPLeaseObtained;//DHCP租用获取时间

string DHCPServer;//DHCP服务器

string DNSDomain;//DHCP服务器域

string DNSDomainSuffixSearchOrder[];

boolean DNSEnabledForWINSResolution;

string DNSHostName;

string DNSServerSearchOrder[];

boolean DomainDNSRegistrationEnabled;

uint32 ForwardBufferMemory;

boolean FullDNSRegistrationEnabled;

uint16 GatewayCostMetric[];

uint8 IGMPLevel;

uint32 Index;

uint32 InterfaceIndex;

string IPAddress[];//IP地址,该类型为数组

uint32 IPConnectionMetric;

boolean IPEnabled;//TCP/IP在该网络适配器上是否被激活

boolean IPFilterSecurityEnabled;

boolean IPPortSecurityEnabled;

string IPSecPermitIPProtocols[];

string IPSecPermitTCPPorts[];

string IPSecPermitUDPPorts[];

string IPSubnet[];//子网掩码,如"255.255.0.0"

boolean IPUseZeroBroadcast;

string IPXAddress;//IPX地址

boolean IPXEnabled;//IPX是否允许

uint32 IPXFrameType[];

uint32 IPXMediaType;

string IPXNetworkNumber[];

string IPXVirtualNetNumber;

uint32 KeepAliveInterval;

uint32 KeepAliveTime;

string MACAddress;

uint32 MTU;//最大传输单元

uint32 NumForwardPackets;

boolean PMTUBHDetectEnabled;

boolean PMTUDiscoveryEnabled;

string ServiceName;

string SettingID;

uint32 TcpipNetbiosOptions;

uint32 TcpMaxConnectRetransmissions;

uint32 TcpMaxDataRetransmissions;

uint32 TcpNumConnections;

boolean TcpUseRFC1122UrgentPointer;

uint16 TcpWindowSize;

boolean WINSEnableLMHostsLookup;

string WINSHostLookupFile;

string WINSPrimaryServer;

string WINSScopeID;

string WINSSecondaryServer;

};

主要方法

DisableIPSec

在该被激的TCP/IP网络适配器是禁用IPSec

EnableDHCP

启用DHCP

EnableDNS

启用DNS

EnableIPFilterSec

启用IPFilterSec

EnableIPSec

启用IPSec.

EnableStatic

目标网络适配器上应用静态TCP/IP寻址

EnableWINS

启用WINS,但独立于网络适配器.

ReleaseDHCPLease

释放绑定在已激DHCP的网络适配器上的IP地址

ReleaseDHCPLeaseAll

释放所有绑定在已激DHCP的网络适配器上的IP地址.

RenewDHCPLease

Renews 绑定在已激DHCP的网络适配器上的IP地址

RenewDHCPLeaseAll

Renews所有绑定在已激DHCP的网络适配器上的IP地址

SetArpAlwaysSourceRoute

SetArpUseEtherSNAP

使用 802.3 SNAP 编码允许Ethernet packets

SetDatabasePath

设置标准INTERNET数据文件的路径(HOSTS, LMHOSTS, NETWORKS, and PROTOCOLS).

SetDeadGWDetect

启用死网关探测.

SetDefaultTOS

(过时)

SetDefaultTTL

设置默认TTL值

SetDNSDomain

设置DNS域名.

SetDNSServerSearchOrder

设置DNS服务器搜索顺序

SetDNSSuffixSearchOrder

SetDynamicDNSRegistration

SetForwardBufferMemory

SetGateways

设置网关

SetIGMPLevel

设置IGMP级别

SetIPConnectionMetric

设置routing metric .

SetIPXFrameTypeNetworkPairs

SetKeepAliveTime

设置通过发送一个Keep Alive 包来确定TCP尝试校验一个空闲连接是否可用的时间

SetMTU

设置最大传输单元MTU不再被支持

SetNumForwardPackets

设置路由包数据包队列分配的IP包头数

SetPMTUBHDetect

允许Black Hole routers探测.

SetPMTUDiscovery

允许MTU discovery.

SetTcpipNetbios

设置TCP/IP上的NETBIOS操作

Windows 2000 and Windows NT 4.0: 此属性不可用

SetTcpMaxConnectRetransmissions

设置TCP在重新发送连接请求的尝试次数

SetTcpMaxDataRetransmissions

Sets the number of times TCP will retransmit an individual data segment before aborting the connection.

SetTcpNumConnections

TCP最大并发连接数.

SetTcpUseRFC1122UrgentPointer

指定是否TCP使用RFC1122规范,或BSD系统使用的模式

SetTcpWindowSize

设置TCP窗口大小.

SetWINSServer

设置WINS服务器

操作代码

Javascript代码

<script language="javascript">

<!--

function GetAdapterInfo() {

var locator = new ActiveXObject ("WbemScripting.SWbemLocator");

var service = locator.ConnectServer("."); //连接本机服务器

var properties = service.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration");

//查询使用SQL标准

var e = new Enumerator (properties);

for (;!e.atEnd();e.moveNext ())

{

var p = e.item ();

document.write("Caption:" + p.Caption + " "); //网卡描述,也可以使用Description

document.write("IP:" + p.IPAddress(0) + " ");//IP地址为数组类型,子网俺码及默认网关亦同

document.write("Net MASK:" + p.IPSubnet(0) + " ");

document.write("Default gateway:" + p.DefaultIPGateway(0) + " ");

document.write("MAC:" + p.MACAddress + " "); //网卡物理地址

document.write("<hr>");

}

}

GetAdapterInfo();

//-->

</script>

将以上代码放在HTML代码中可以看到JS输出的详细信息,如显示更详细信息请参照以上的列出的属性

如果机器安装了多块网卡,只想得到某一块网卡,可使用查询过滤的方法得到如安装了intel和Realtek的网卡,获取Realtek的网卡只需要使用SQL查询即可,如下

var properties = service.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration where description like '%Realtek%'");

Vbscript代码

strComputer = "."

Set objWMIService = GetObject( _

"winmgmts:\\" & strComputer & "\root\cimv2")

Set IPConfigSet = objWMIService.ExecQuery _

("Select IPAddress from Win32_NetworkAdapterConfiguration" _

& " where Description like '%Realtek%'")

For Each IPConfig in IPConfigSet

If Not IsNull(IPConfig.IPAddress) Then

For i=LBound(IPConfig.IPAddress) _

to UBound(IPConfig.IPAddress)

WScript.Echo IPConfig.IPAddress(i)

Next

End If

Next

将以上文本保存为test.vbs,双击即可