JavaScript获取客户端计算机硬件及系统等信息的方法


Posted in Javascript onJanuary 02, 2014

JavaScript 获取客户端计算机硬件及系统信息
通过WMI来实现获取客户端计算机硬件及系统信息:

function getSysInfo(){ 
var locator = new ActiveXObject ("WbemScripting.SWbemLocator"); 
var service = locator.ConnectServer("."); 
//CPU信息 
var cpu = new Enumerator (service.ExecQuery("SELECT * FROM Win32_Processor")).item(); 
var cpuType=cpu.Name,hostName=cpu.SystemName; 
//内存信息 
var memory = new Enumerator (service.ExecQuery("SELECT * FROM Win32_PhysicalMemory")); 
for (var mem=[],i=0;!memory.atEnd();memory.moveNext()) mem[i++]={cap:memory.item().Capacity/1024/1024,speed:memory.item().Speed} 
//系统信息 
var system=new Enumerator (service.ExecQuery("SELECT * FROM Win32_ComputerSystem")).item(); 
var physicMenCap=Math.ceil(system.TotalPhysicalMemory/1024/1024),curUser=system.UserName,cpuCount=system.NumberOfProcessors return {cpuType:cpuType,cpuCount:cpuCount,hostName:hostName,curUser:curUser,memCap:physicMenCap,mem:mem} 
}

代码实现主要包括这几部分:

先通过new ActiveXObject ("WbemScripting.SWbemLocator"); 访问到WbemScripting对象。
通过locator.ConnectServer(".");连接我们本地电脑(.代表本地电脑,当然
也可以访问其他计算机)。
通过service.ExecQuery("SELECT * FROM Win32_Processor")这个类似sql的语句(其实系统信息也是存储在计算中一个类似数据库的文件中)获取我们需要的对象的记录集。
通过new Enumerator来创建一个可枚举的对象,下面就可以遍历取信息了。

注意:运行的前提是要修改浏览器安全设置,“允许对未标记为可安全执行的ActiveX
脚本的运行”。
这里主要取了CPU、内存及系统用户几个信息,大家利用WMI的API或者借助JSEDIT获取
到更多的信息。下面列出了常用信息的类:

Win32_Processor // CPU 处理器

Win32_PhysicalMemory // 物理内存

Win32_Keyboard // 键盘

Win32_PointingDevice // 点输入设备,如鼠标

Win32_DiskDrive // 硬盘驱动器

Win32_CDROMDrive // 光盘驱动器

Win32_BaseBoard // 主板

Win32_BIOS // BIOS 芯片

Win32_ParallelPort // 并口

Win32_SerialPort // 串口

Win32_SoundDevice // 多媒体设置

Win32_USBController // USB 控制器

Win32_NetworkAdapter // 网络适配器

Win32_NetworkAdapterConfiguration // 网络适配器设置

Win32_Printer // 打印机

Win32_PrinterConfiguration // 打印机设置

Win32_PrintJob // 打印机任务

Win32_TCPIPPrinterPort // 打印机端口

Win32_POTSModem // MODEM

Win32_POTSModemToSerialPort // MODEM 端口

Win32_DesktopMonitor // 显示器

Win32_VideoController // 显卡细节。

Win32_VideoSettings // 显卡支持的显示模式。

Win32_TimeZone // 时区

Win32_SystemDriver // 驱动程序

Win32_DiskPartition // 磁盘分区

Win32_LogicalDisk // 逻辑磁盘

Win32_LogicalMemoryConfiguration // 逻辑内存配置

Win32_PageFile // 系统页文件信息

Win32_PageFileSetting // 页文件设置

Win32_BootConfiguration // 系统启动配置

Win32_OperatingSystem // 操作系统信息

Win32_StartupCommand // 系统自动启动程序

Win32_Service // 系统安装的服务

Win32_Group // 系统管理组

Win32_GroupUser // 系统组帐号

Win32_UserAccount // 用户帐号

Win32_Process // 系统进程

Win32_Thread // 系统线程

Win32_Share // 共享

Win32_NetworkClient // 已安装的网络客户端

Win32_NetworkProtocol // 已安装的网络协议

WMI Win32类的完整信息及详细列表请参考MSDN:
http://msdn2.microsoft.com/en-us/library/aa394084(VS.85).aspx
示例:

function button1_onclick() {//cpu 信息 
var locator = new ActiveXObject ("WbemScripting.SWbemLocator"); 
var service = locator.ConnectServer("."); 
var properties = service.ExecQuery("SELECT * FROM Win32_Processor"); 
var e = new Enumerator (properties); 
document.write("<table border=1>"); 
for (;!e.atEnd();e.moveNext ()) 
{ 
var p = e.item (); 
document.write("<tr>"); 
document.write("<td>" + p.Caption + "</td>"); 
document.write("<td>" + p.DeviceID + "</td>"); 
document.write("<td>" + p.Name + "</td>"); 
document.write("<td>" + p.CpuStatus + "</td>"); 
document.write("<td>" + p.Availability + "</td>"); 
document.write("<td>" + p.Level + "</td>"); 
document.write("<td>" + p.ProcessorID + "</td>"); 
document.write("<td>" + p.SystemName + "</td>"); 
document.write("<td>" + p.ProcessorType + "</td>"); 
document.write("</tr>"); 
} 
document.write("</table>"); 
} function Button2_onclick() {//CD-ROM 信息 
var locator = new ActiveXObject ("WbemScripting.SWbemLocator"); 
var service = locator.ConnectServer("."); 
var properties = service.ExecQuery("SELECT * FROM Win32_CDROMDrive"); 
var e = new Enumerator (properties); 
document.write("<table border=1>"); 
for (;!e.atEnd();e.moveNext ()) 
{ 
var p = e.item (); 
document.write("<tr>"); 
document.write("<td>" + p.Caption + "</td>"); 
document.write("<td>" + p.Description + "</td>"); 
document.write("<td>" + p.Drive + "</td>"); 
document.write("<td>" + p.Status + "</td>"); 
document.write("<td>" + p.MediaLoaded + "</td>"); 
document.write("</tr>"); 
} 
document.write("</table>"); 
} 
function Button3_onclick() {//键盘信息 
var locator = new ActiveXObject ("WbemScripting.SWbemLocator"); 
var service = locator.ConnectServer("."); 
var properties = service.ExecQuery("SELECT * FROM Win32_Keyboard"); 
var e = new Enumerator (properties); 
document.write("<table border=1>"); 
for (;!e.atEnd();e.moveNext ()) 
{ 
var p = e.item (); 
document.write("<tr>"); 
document.write("<td>" + p.Description + "</td>"); 
document.write("<td>" + p.Name + "</td>"); 
document.write("<td>" + p.Status + "</td>"); 
document.write("</tr>"); 
} 
document.write("</table>"); 
} 
function Button4_onclick() {//主板信息 
var locator = new ActiveXObject ("WbemScripting.SWbemLocator"); 
var service = locator.ConnectServer("."); 
var properties = service.ExecQuery("SELECT * FROM Win32_BaseBoard"); 
var e = new Enumerator (properties); 
document.write("<table border=1>"); 
for (;!e.atEnd();e.moveNext ()) 
{ 
var p = e.item (); 
document.write("<tr>"); 
document.write("<td>" + p.HostingBoard + "</td>"); 
document.write("<td>" + p.Manufacturer + "</td>"); 
document.write("<td>" + p.PoweredOn + "</td>"); 
document.write("<td>" + p.Product + "</td>"); 
document.write("<td>" + p.SerialNumber + "</td>"); 
document.write("<td>" + p.Version + "</td>"); 
document.write("</tr>"); 
} 
document.write("</table>"); 
}

另外,通过以下方式也可以获得系统的相关信息:
<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" action="index.do" method="post"><INPUT value="00-11-11-B4-52-EF" name="txtMACAddr"> <INPUT value="210.42.38.50" name="txtIPAddr"> <INPUT value="zhupan" name="txtDNSName"> </FORM></BODY></HTML>

其实最关键的还是用到两个ActiveX: 
<OBJECT id=locator classid=CLSID:76A64158-CB41-11D1-8B02-00600806D9B6 VIEWASTEXT></OBJECT> 
<OBJECT id=foo classid=CLSID:75718C9A-F029-11d1-A1AC-00C04FB6C223></OBJECT> 
不过这两个ActiveX都是系统自带,不用去下载或注册。 
接下来的工作就是用脚本和ActiveX交互 <HTML> 
<head> 
<script language="javascript" type="text/javascript"> 
function getCode(){ 
var locator = new ActiveXObject("WbemScripting.SWbemLocator"); 
var service = locator.ConnectServer("."); 
var properties = service.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=TRUE"); 
var e = new Enumerator(properties); 
document.write("<table border=1>"); 
for (; !e.atEnd(); e.moveNext()) { 
var p = e.item(); 
//if(p.IPAddress(0)!=null && p.IPAddress(0)!="undefined" && p.IPAddress(0)!="0.0.0.0" && p.IPAddress(0)!="127.0.0.1"){ 
document.write("<tr>"); 
document.write("<td>" + p.ServiceName + "</td>"); 
document.write("<td>" + p.MACAddress + "</td>"); 
document.write("<td>" + p.IPAddress(0) + "</td>"); 
document.write("</tr>"); 
//break; 
//} 
} 
document.write("</table>"); 
} 
</script> 
</head> 
<BODY> 
<button id="TEST" value="test" onclick="getCode()">TEST</button> 
</BODY> 
</HTML> 
class Win32_NetworkAdapterConfiguration : CIM_Setting 
{ 
boolean ArpAlwaysSourceRoute; 
boolean ArpUseEtherSNAP; 
string Caption; 
string DatabasePath; 
boolean DeadGWDetectEnabled; 
string DefaultIPGateway[]; 
uint8 DefaultTOS; 
uint8 DefaultTTL; 
string Description; 
boolean DHCPEnabled; 
datetime DHCPLeaseExpires; 
datetime DHCPLeaseObtained; 
string DHCPServer; 
string DNSDomain; 
string DNSDomainSuffixSearchOrder[]; 
boolean DNSEnabledForWINSResolution; 
string DNSHostName; 
string DNSServerSearchOrder[]; 
boolean DomainDNSRegistrationEnabled; 
uint32 ForwardBufferMemory; 
boolean FullDNSRegistrationEnabled; 
uint16 GatewayCostMetric[]; 
uint8 IGMPLevel; 
uint32 Index; 
uint32 InterfaceIndex; 
string IPAddress[]; 
uint32 IPConnectionMetric; 
boolean IPEnabled; 
boolean IPFilterSecurityEnabled; 
boolean IPPortSecurityEnabled; 
string IPSecPermitIPProtocols[]; 
string IPSecPermitTCPPorts[]; 
string IPSecPermitUDPPorts[]; 
string IPSubnet[]; 
boolean IPUseZeroBroadcast; 
string IPXAddress; 
boolean IPXEnabled; 
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; 
};
Javascript 相关文章推荐
载入进度条 效果
Jul 08 Javascript
基于jquery的页面划词搜索JS
Sep 14 Javascript
jQuery实现公告文字左右滚动的实例代码
Oct 29 Javascript
Jquery实现textarea根据文本内容自适应高度
Apr 03 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
May 13 Javascript
jQuery UI设置固定日期选择特效代码分享
Aug 27 Javascript
js操作数据库实现注册和登陆的简单实例
May 26 Javascript
js获取客户端操作系统类型的方法【测试可用】
May 27 Javascript
javascript 动态脚本添加的简单方法
Oct 11 Javascript
jQuery如何跳转到另一个网页 就这么简单
Dec 28 Javascript
Vue 框架之动态绑定 css 样式实例分析
Nov 14 Javascript
在Vue中使用HOC模式的实现
Aug 23 Javascript
新增加的内容是如何将div的scrollbar自动移动最下面
Jan 02 #Javascript
javascript中处理时间戳为日期格式的方法
Jan 02 #Javascript
JS脚本defer的作用示例介绍
Jan 02 #Javascript
Javascript中常见的校验如域名、手机、邮箱等等
Jan 02 #Javascript
JavaScript四种调用模式和this示例介绍
Jan 02 #Javascript
ParseInt函数参数设置介绍
Jan 02 #Javascript
JS中Date日期函数中的参数使用介绍
Jan 02 #Javascript
You might like
PHP中上传大体积文件时需要的设置
2006/10/09 PHP
php.ini 中文版
2006/10/28 PHP
PHP中的类型约束介绍
2015/05/11 PHP
PHP保存session到memcache服务器的方法
2016/01/19 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
php实现将HTML页面转换成word并且保存的方法
2016/10/14 PHP
smarty模板数学运算示例
2016/12/11 PHP
PHP清除缓存的几种方法总结
2017/09/12 PHP
PHP的PDO预处理语句与存储过程
2019/01/27 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
Js callBack 返回前一页的js方法
2008/11/30 Javascript
一个可以兼容IE FF的加为首页与加入收藏实现代码
2009/11/02 Javascript
探讨javascript是不是面向对象的语言
2013/11/21 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
JS实现很酷的EMAIL地址添加功能实例
2015/02/28 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
2017/01/03 Javascript
面试常见的js算法题
2017/03/23 Javascript
vue实现全选、反选功能
2020/11/17 Javascript
underscore之Collections_动力节点Java学院整理
2017/07/10 Javascript
详解vue引入子组件方法
2019/02/12 Javascript
利用不到200行代码写一款属于你自己的js类库
2019/07/08 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
python将MongoDB里的ObjectId转换为时间戳的方法
2015/03/13 Python
小小聊天室Python代码实现
2016/08/17 Python
Numpy 改变数组维度的几种方法小结
2018/08/02 Python
在python中pandas的series合并方法
2018/11/12 Python
python获取url的返回信息方法
2018/12/17 Python
wxPython实现列表增删改查功能
2019/11/19 Python
python爬虫之遍历单个域名
2019/11/20 Python
django实现日志按日期分割
2020/05/21 Python
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
世界上最大的巴士旅游观光公司:Big Bus Tours
2016/10/20 全球购物
老龄工作先进事迹
2014/08/15 职场文书
四风问题个人剖析材料
2014/10/07 职场文书
js之ajax文件上传
2021/05/13 Javascript
深入浅析Django MTV模式
2021/09/04 Python