找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1262|回复: 2

[教学] 使用Windows管理工具(WMI)接口 --VLISP开发技术(一)

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-6-10 16:28:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 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查询当前系统所属的域?

  1. 命令: (xd::system:wmi-query "win32_computersystem" "domain" "")
  2. ("WORKGROUP")

复制代码


2、如何使用WMI查询当前系统属于哪个工作组?


  1. 命令: (xd::system:wmi-query "win32_computersystem" "workgroup" "")
  2. ("WORKGROUP")
复制代码


3、何使用WMI查询当前系统属于域或工作组中属于什么角色?


  1. 命令: (xd::system:wmi-query "win32_computersystem" "domainrole" "")
  2. (0)

复制代码

这个字段的个释义是

ValueMeaning
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查询当前电脑的制造商信息?

  1. 命令: (xd::system:wmi-query "win32_computersystem" "Manufacturer" "")
  2. ("To be filled by O.E.M.")
复制代码


5、如何使用WMI获取当前系统类型?


  1. 命令: (xd::system:wmi-query "win32_computersystem" "SystemType" "")
  2. ("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查询当前电脑的物理内存大小?


  1. 命令: (xd::system:wmi-query "win32_computersystem" "TotalPhysicalMemory" "")
  2. ("17117716480")

复制代码

该大小是以Bytes为单位的。

7、如何使用WMI查询是否设置了开机密码?


  1. 命令: (xd::system:wmi-query "win32_computersystem" "PowerOnPasswordstatus" "")
  2. (0)

复制代码

如果设置了开机密码,我们开机后,会进入黑屏,让我们输入密码。如果密码输入错了就不会启动系统。一般鲜见设置这个密码。它的释义是

ValueMeaning
0 (0x0)
Disabled
1 (0x1)
Enabled
2 (0x2)
Not Implemented
3 (0x3)
Unknown


8、如何使用WMI查询电脑是笔记本还是台式机?

  1. 命令: (xd::system:wmi-query "win32_computersystem" "PcSystemType" "")
  2. (1)
复制代码

该属性只有在XP以上的系统中可以使用。它的释义是

ValueMeaning
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信息?

  1. (defun c:tt ()
  2.     (setq info (XD::SYSTEM:WMI-QUERY
  3.                    "Win32_Processor"
  4.                    "Name,ProcessorId,NumberOfCores,ThreadCount"
  5.                    ""
  6.                )
  7.     )
  8.     (princ
  9.         (strcat "\nCPU型号:" (car info) "\n序列号:" (cadr info) "\n核心数:" (itoa (caddr info)) "\n线程数:" (itoa (last info)))
  10.     )
  11.     (princ)
  12. )



  1. CPU型号:Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz
  2. 序列号:BFEBFBFF000306C3
  3. 核心数:4
  4. 线程数:8

复制代码


10、如何使用WMI查询内存大小(不同于上面的那个)?

  1. (defun c:tt ()
  2.     (princ
  3.         (strcat "\n内存大小:"
  4.                 (rtos (setq memsize (/ (apply '+
  5.                                               (mapcar 'atof
  6.                                                       (setq val (XD::SYSTEM:WMI-QUERY
  7.                                                                     "Win32_PhysicalMemory"
  8.                                                                     "Capacity"
  9.                                                                     ""
  10.                                                                 )
  11.                                                       )
  12.                                               )
  13.                                        )
  14.                                        (^ 1024 3)
  15.                                     )
  16.                       )
  17.                       2
  18.                       0
  19.                 )
  20.                 "G , 插了 "
  21.                 (itoa (length val))
  22.                 " 条"
  23.         )
  24.     )
  25.     (princ)
  26. )



上面这个方法,能查到插了几个内存条,查询返回的表是单条容量的表


  1. 命令: tt
  2. 内存大小:16G , 插了 2 条

复制代码



11、如何使用WMI查询操作系统版本?


  1. (defun c:tt ()
  2.     (princ
  3.         (strcat "\n操作系统:"
  4.                 (car  (XD::SYSTEM:WMI-QUERY "Win32_OperatingSystem" "Caption" ""))
  5.         )
  6.     )
  7.     (princ)
  8. )




  1. 命令: tt
  2. 操作系统:Microsoft Windows 10 企业版

复制代码

12、如何使用WMI查询所有硬盘序列号?

  1. (defun c:tt ()
  2.     (princ
  3.         (strcat "\n硬盘序列号:"
  4.                 (vl-prin1-to-string
  5.                     (vl-sort (xd::list:group<n (mapcar '(lambda (x)
  6.                                          (xdrx_string_regexpr "PHYSICALDRIVE" x "DISK")
  7.                                       )
  8.                                      (XD::SYSTEM:WMI-QUERY
  9.                                          "Win32_PhysicalMedia"
  10.                                          "TAG,SerialNumber"
  11.                                          "TAG LIKE '%PHYSICALDRIVE%'"
  12.                                      )
  13.                              ) 2)
  14.                              '(lambda (x y) (< (car x) (car y)))
  15.                     )
  16.                 )
  17.         )
  18.     )
  19.     (princ)
  20. )




  1. 硬盘序列号:(("DISK0" "W4Z1Z61C") ("DISK1" "S1E2SBF7") ("DISK2" "S1E2S9JH") ("DISK3"
  2. "718167584100000") ("DISK4" "000000000000") ("DISK5" "000000000001") ("DISK6"
  3. "000000000002") ("DISK7" "000000000003") ("DISK8" "000000000004"))

复制代码

13、如何使用WMI查询显卡信息?

  1. (defun c:tt ()
  2.     (setq info (XD::SYSTEM:WMI-QUERY
  3.                    "Win32_VideoController"
  4.                    "Name,CurrentHorizontalResolution,CurrentVerticalResolution"
  5.                    ""
  6.                )
  7.     )
  8.     (princ
  9.         (strcat "\n显卡型号:" (car info) "\n分辨率:" (itoa (cadr info)) "x:" (itoa (caddr info)))
  10.     )
  11.     (princ)
  12. )



  1. 命令: tt
  2. 显卡型号:NVIDIA GeForce GTX 750
  3. 分辨率:1440x:900

复制代码

14、如何使用WMI查询网卡信息?

下面代码使用条件查询,查询网卡名字包括Realtek的网卡信息。
  1. (defun c:tt ()
  2.     (setq info (XD::SYSTEM:WMI-QUERY
  3.                    "Win32_NetworkAdapter"
  4.                    "Name,MACAddress"
  5.                    "Name like '%Realtek%'"
  6.                )
  7.     )
  8.     (mapcar '(lambda (x)
  9.                  (princ (strcat "\n网卡型号:" (car x) " / MAC地址:" (cadr x)))
  10.              )
  11.             (setq lst (xd::list:group<n info 2))
  12.     )
  13.     (princ)
  14. )



  1. 命令: tt
  2. 网卡型号:Realtek PCIe GBE Family Controller  / MAC地址:30:0E:D5:BB:D8:D5
  3. 网卡型号:Realtek RTL8139/810x Family Fast Ethernet NIC  / MAC地址:08:57:00:D5:86:5F

复制代码

四、WMI内容繁多,如何能找到各种表的信息,包含哪些字段?

提供个工具,下载:

请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:wmiexplorer.zip 
下载次数:25  文件大小:549.32 KB  售价:1D豆 [记录]
下载权限: 不限 以上  [免费赚D豆]



使用上面的工具,就看到系统WMI支持的各种查询了。

搜狗截图20170610155511.png








论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 6564个

财富等级: 富甲天下

发表于 2017-6-11 00:45:45 | 显示全部楼层
謝謝版主發這麽些多有用又高深的,知識,學習了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1304个

财富等级: 财源广进

发表于 2017-6-11 07:37:19 | 显示全部楼层
太高深了。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-12 10:14 , Processed in 0.383311 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表