马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 newer 于 2017-6-10 16:37 编辑
一、什么是WMI?
WMI(Windows Management Instrumentation,Windows 管理规范)是一项核心的 Windows 管理技术;用户可以使用 WMI 管理本地和远程计算机。
利用WMI软件开发包(SDK)可以方便地查看可用的CIM和Win32类。WMI SDK可以从MSDN下载。
WMI是一项核心的Windows管理技术,WMI作为一种规范和基础结构,通过它可以访问、配置、管理和监视几乎所有的Windows资源,比如用户可以在远程计算机器上启动一个进程;设定一个在特定日期和时间运行的进程;远程启动计算机;获得本地或远程计算机的已安装程序列表;查询本地或远程计算机的Windows事件日志等等。
二、VLISP利用ActiveX对象WbemScripting.SWbemLocator,可以对WMI进行查询。
WbemScripting.SWbemLocator对象是一个数据库,可以用通用SQL的查询方法,SELECT对指定的数据表进行查询,比如查询CPU信息的Win32_Processor表,每个表下面有字段属性,比如:
select * from Win32_processor ,查询Win32_processor表下所有字段
select name,processorid from Win32_processor ,查询表下指定的name,processorid字段的内容
WMI数据库支持条件查询,通过标准的数据库查询语句的WHERE来实现,比如:机器有很多硬件,有物理硬盘,有U盘,有光驱等等,我们如果用下面语句:
select tag,name from win32_physicaldrive
查询,会得到所有的磁盘信息,如果我们只是想知道物理硬盘的信息如何做呢?用WHERE条件查询
select tag,name from win32_physicaldrive where tag '%PHYSICALDRIVE%'
表示只查询TAG字段内容包括PHYSICALDRIVE的,%在SQL里面相当于代表任意字符。这样就过滤掉不需要的磁盘了,节省时间,提高效率。
一般情况下,不推荐使用 * 去查询表,因为有的表字段很多,达到几百个,用*,一次性读入所有字段的内容,造成不必要的浪费而且花费更多的时间,甚至操作感觉到卡顿。
推荐所需即所得的方式,具体制定字段去查询。
三、 什么是XD::System:WMI-Query
为了灵活控制要查询的表和字段及条件,晓东通用LISP函数库提供了WMI通用的查询函数接口(XD::System:WMI-Query),不用懂内部具体实现的细节,直接知道函数的参数,给它,就帮你查询你所需要的整个的WINDOWS系统的任何信息了。
函数 XD::System:WMI-Query 见链接:http://bbs.xdcad.net/thread-709848-1-1.html
下面介绍 XD::System:WMI-Query 的应用:
1、如何使用WMI查询当前系统所属的域?
- 命令: (xd::system:wmi-query "win32_computersystem" "domain" "")
- ("WORKGROUP")
复制代码
2、如何使用WMI查询当前系统属于哪个工作组?
- 命令: (xd::system:wmi-query "win32_computersystem" "workgroup" "")
- ("WORKGROUP")
复制代码
3、何使用WMI查询当前系统属于域或工作组中属于什么角色?
- 命令: (xd::system:wmi-query "win32_computersystem" "domainrole" "")
- (0)
复制代码
这个字段的个释义是
Value | Meaning | 0 (0x0) | Standalone Workstation | 1 (0x1) | Member Workstation | 2 (0x2) | Standalone Server | 3 (0x3) | Member Server | 4 (0x4) | Backup Domain Controller | 5 (0x5) | Primary Domain Controller |
4、如何使用WMI查询当前电脑的制造商信息?
- 命令: (xd::system:wmi-query "win32_computersystem" "Manufacturer" "")
- ("To be filled by O.E.M.")
复制代码
5、如何使用WMI获取当前系统类型?
- 命令: (xd::system:wmi-query "win32_computersystem" "SystemType" "")
- ("x64-based PC")
复制代码
以上值说明当前系统是X86体系的系统。它还可能是:"x64-based PC"、"X86-based PC"、"MIPS-based PC"、"Alpha-based PC"、"Power PC"、"SH-x PC"、"StrongARM PC"、"64-bit Intel PC"、"64-bit Alpha PC"、"Unknown"、"X86-Nec98 PC"。
6、如何使用WMI查询当前电脑的物理内存大小?
- 命令: (xd::system:wmi-query "win32_computersystem" "TotalPhysicalMemory" "")
- ("17117716480")
复制代码
该大小是以Bytes为单位的。
7、如何使用WMI查询是否设置了开机密码?
- 命令: (xd::system:wmi-query "win32_computersystem" "PowerOnPasswordstatus" "")
- (0)
复制代码
如果设置了开机密码,我们开机后,会进入黑屏,让我们输入密码。如果密码输入错了就不会启动系统。一般鲜见设置这个密码。它的释义是
Value | Meaning | 0 (0x0) | Disabled | 1 (0x1) | Enabled | 2 (0x2) | Not Implemented | 3 (0x3) | Unknown |
8、如何使用WMI查询电脑是笔记本还是台式机?
- 命令: (xd::system:wmi-query "win32_computersystem" "PcSystemType" "")
- (1)
复制代码
该属性只有在XP以上的系统中可以使用。它的释义是
Value | Meaning | 0 (0x0) | Unspecified | 1 (0x1) | Desktop | 2 (0x2) | Mobile | 3 (0x3) | Workstation | 4 (0x4) | Enterprise Server | 5 (0x5) | Small Office and Home Office (SOHO) Server | 6 (0x6) | Appliance PC | 7 (0x7) | Performance Server | 8 (0x8) | Maximum |
9、如何使用WMI查询电脑CPU信息?
- (defun c:tt ()
- (setq info (XD::SYSTEM:WMI-QUERY
- "Win32_Processor"
- "Name,ProcessorId,NumberOfCores,ThreadCount"
- ""
- )
- )
- (princ
- (strcat "\nCPU型号:" (car info) "\n序列号:" (cadr info) "\n核心数:" (itoa (caddr info)) "\n线程数:" (itoa (last info)))
- )
- (princ)
- )
- CPU型号:Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz
- 序列号:BFEBFBFF000306C3
- 核心数:4
- 线程数:8
复制代码
10、如何使用WMI查询内存大小(不同于上面的那个)?
- (defun c:tt ()
- (princ
- (strcat "\n内存大小:"
- (rtos (setq memsize (/ (apply '+
- (mapcar 'atof
- (setq val (XD::SYSTEM:WMI-QUERY
- "Win32_PhysicalMemory"
- "Capacity"
- ""
- )
- )
- )
- )
- (^ 1024 3)
- )
- )
- 2
- 0
- )
- "G , 插了 "
- (itoa (length val))
- " 条"
- )
- )
- (princ)
- )
上面这个方法,能查到插了几个内存条,查询返回的表是单条容量的表
11、如何使用WMI查询操作系统版本?
- (defun c:tt ()
- (princ
- (strcat "\n操作系统:"
- (car (XD::SYSTEM:WMI-QUERY "Win32_OperatingSystem" "Caption" ""))
- )
- )
- (princ)
- )
- 命令: tt
- 操作系统:Microsoft Windows 10 企业版
复制代码
12、如何使用WMI查询所有硬盘序列号?
- (defun c:tt ()
- (princ
- (strcat "\n硬盘序列号:"
- (vl-prin1-to-string
- (vl-sort (xd::list:group<n (mapcar '(lambda (x)
- (xdrx_string_regexpr "PHYSICALDRIVE" x "DISK")
- )
- (XD::SYSTEM:WMI-QUERY
- "Win32_PhysicalMedia"
- "TAG,SerialNumber"
- "TAG LIKE '%PHYSICALDRIVE%'"
- )
- ) 2)
- '(lambda (x y) (< (car x) (car y)))
- )
- )
- )
- )
- (princ)
- )
- 硬盘序列号:(("DISK0" "W4Z1Z61C") ("DISK1" "S1E2SBF7") ("DISK2" "S1E2S9JH") ("DISK3"
- "718167584100000") ("DISK4" "000000000000") ("DISK5" "000000000001") ("DISK6"
- "000000000002") ("DISK7" "000000000003") ("DISK8" "000000000004"))
复制代码
13、如何使用WMI查询显卡信息?
- (defun c:tt ()
- (setq info (XD::SYSTEM:WMI-QUERY
- "Win32_VideoController"
- "Name,CurrentHorizontalResolution,CurrentVerticalResolution"
- ""
- )
- )
- (princ
- (strcat "\n显卡型号:" (car info) "\n分辨率:" (itoa (cadr info)) "x:" (itoa (caddr info)))
- )
- (princ)
- )
- 命令: tt
- 显卡型号:NVIDIA GeForce GTX 750
- 分辨率:1440x:900
复制代码
14、如何使用WMI查询网卡信息?
下面代码使用条件查询,查询网卡名字包括Realtek的网卡信息。
- (defun c:tt ()
- (setq info (XD::SYSTEM:WMI-QUERY
- "Win32_NetworkAdapter"
- "Name,MACAddress"
- "Name like '%Realtek%'"
- )
- )
- (mapcar '(lambda (x)
- (princ (strcat "\n网卡型号:" (car x) " / MAC地址:" (cadr x)))
- )
- (setq lst (xd::list:group<n info 2))
- )
- (princ)
- )
- 命令: tt
- 网卡型号:Realtek PCIe GBE Family Controller / MAC地址:30:0E:D5:BB:D8:D5
- 网卡型号:Realtek RTL8139/810x Family Fast Ethernet NIC / MAC地址:08:57:00:D5:86:5F
复制代码
四、WMI内容繁多,如何能找到各种表的信息,包含哪些字段?
提供个工具,下载:
使用上面的工具,就看到系统WMI支持的各种查询了。
|