VBS脚本编程(10)——编写WMI脚本
WMI介绍
- 是一项核心的Windows管理技术。
- 采用统一的、基于开放标准的、可扩展的面向对象接口的系统管理基础结构。
- 支持脚本编程,使管理员的日常管理自动化。
- 提供了统一的机制让用户来管理本地和远程的计算机。
- 由微软在1996年首先提出,由DMTF(Distributed Management Task Force,分布式管理任务组)管理维护。
- 其数据模型称为CIM(Common Information Model,公共信息模型),是一个面向对象的模型,统一定义了一组类和名称空间。
- 在计算机上启动一个进程。
- 设定在特定时间运行特定服务。
- 远程关闭计算机。
- 当磁盘余额小于预定值时记录到事件日志。
- 管理、监测IIS/SQL/Exchange/SMS/MOM等微软系列产品。
- 管理提供相应WMI Provider的第三方应用。
- ……
Set wmi = GetObject("winmgmts:\\")
Set objDisk = wmi.get("Win32_LogicalDisk.DeviceID='C:'")
Wscript.Echo objDisk.FreeSpace



命名空间与路径
常用的脚本对象库
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer
Set colItems = objSWbemServices.ExecQuery("Select * from Win32_CDROMDrive")
For Each objItem in colItems
WScript.Echo "光盘驱动器的类型: " & objItem.Caption
WScript.Echo "盘符是: " & objItem.Id
Next
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer
Set objSWbemObjectSet = objSWbemServices.InstancesOf("Win32_Processor")
For Each objSWbemObject In objSWbemObjectSet
Wscript.echo "CPU的型号为:" & objSWbemObject.name
Next
WQL查询语言
- 每个WQL语句必须以SELECT开始
- SELECT后跟你要查询的属性名(对应SQL的字段名),也可以像SQL一样,以*表示所有属性值
- FROM后跟关键字
- 查询的类名字
- 另外,如果你想精确查询结果还可以加上WHERE条件从句。比如某个类有Enable属性,你可以在查询的时候加上WHERE ENABLE=true。
- WQL是SQL的一个子集,但不支持更新、删除和排序等操作,可用于返回选定实例的选定属性
- SELECT 必选项。代表WQL语句的开始,
- properties 必选项。代表想查询的属性名字。可以是多个属性名,也可查询所有属性值,用*代替。
- FROM 必选项。跟在properties的后面。
- Class 必选项。代表想要查询的类的名称。
- where clause 可选项。where 从句和相关条件语句,用来缩小查询范围。
- AND运算符,连接两个逻辑运算,当同时满足条件时通过。
- OR运算符,连接两个逻辑运算,当至少一个满足条件时通过。
- = 等于
- > 大于
- < 小于
- <= 小于等于
- >= 大于等于
- <> 或 != 不等于
- Is [not] [不]是,仅仅用于比较NULL的时候
- "%"代表一个或者多个字符。 例如,%Office%可代表"My Offices," "Office VPN,"或"Office." Office%可代表"Offices"或"Office VPN,"但是不能代表"My Offices,"
- "[ ]”返回参数范围。 例如"[A-Z]ars"可代替"Mars," "Wars," and "Tars,"但是不能代替"Stars."
- "^"取范围的反面。 例如"[^A-M]ars"可代替"Wars"和"Tars,"但是不能代替"Mars"因为"M"不再指定范围内。
- "_"代替单个字符。 "M_rs"可代替"Mars," "M3rs,"
- __CLASS 在查询结果集中对象继承的类对象引用。
- GROUP Clause GROUP子句使WMI生成一个表示一组事件的通知。
- ISA ISA运算符是WQL特定的运算符,可以在事件查询中使用。当ISA包含在事件查询的WHERE子句中时,它将请求类层次结构中而不是特定事件类中所有类的事件通知。
- WITHIN 指定轮询的间隔或者分组区间,一般在event查询中使用此子句。
- REFERENCES OF 获取所有引用特定源实例的关联实例集,一般在schema和data查询中使用,REFERENCES OF语句与ASSOCIATORS OF 语句类似,。
- KEYSONLY 在REFERENCES OF和ASSOCIATORS OF 查询中用来确认返回的结果实例集中只有关键的实例/属性被填充。以此来降低查询的调用成本。
strComputer = "."
Set objSWbemServices = GetObject("winmgmts:\\"&strComputer&"\root\cimv2")
Set colServices = objSWbemServices.ExecQuery("SELECT * FROM Win32_Service Where state = 'Running'")
WScript.Echo "服务名称---服务描述"
For Each objService In colServices
WScript.Echo objService.name&"---"&objService.Description
Next
strComputer = "."
Set objSWbemServices = GetObject("winmgmts:\\"&strComputer&"\root\cimv2")
Set colAccounts = objSWbemServices.ExecQuery("SELECT * FROM Win32_Account")
WScript.Echo "账户名称---账户描述---账户SID"
For Each objAccount In colAccounts
WScript.Echo objAccount.name&"---"&objAccount.Description&"---"&objAccount.SID
Next
strComputer = "."
Set objSWbemServices = GetObject("winmgmts:\\"&strComputer&"\root\cimv2")
Set colProcess = objSWbemServices.ExecQuery("SELECT * FROM Win32_Process")
WScript.Echo "进程名称---PID---所占内存"
For Each objProcess In colProcess
m = Int(CSng(objProcess.WorkingSetSize)/1024/1024*100)/100
WScript.Echo objProcess.name&"---"&objProcess.ProcessId&"---"& CStr(m)&"MB"
Next
WMI事件监控与处理
strComputer = "."
Set objSWbemServices = GetObject("winmgmts:\\"&strComputer&"\root\cimv2")
Set objEventSource = objSWbemServices.ExecNotificationQuery( _
"SELECT * FROM __InstanceCreationEvent " _
& "WITHIN 5" _
& "WHERE TargetInstance ISA 'Win32_Process'" _
& "AND TargetInstance.Name = 'NotePad.exe'")
Set objEventObject = objEventSource.NextEvent()
WScript.Echo "记事本已打开"
On Error Resume Next
Dim objWMI, objSHELL, objEvents, objEvent
Set objWMI = GetObject("Winmgmts:\\.\Root\Cimv2")
Set objSHELL = CreateObject("Wscript.Shell")
Set objEvents = objWMI.ExecNotificationQuery _
("Select * From __InstanceOperationEvent Within 5 " _
& "Where TargetInstance Isa 'Win32_LogicalDisk' " _
& "And TargetInstance.DriveType = 2")
Do While True
Set objEvent = objEvents.NextEvent()
Select Case objEvent.Path_.Class
Case "__InstanceCreationEvent"
objSHELL.Popup "检测到盘符号为" & objEvent.TargetInstance.Name & "的U盘插入",3,"系统提示"
Case "__InstanceDeletionEvent"
objSHELL.Popup "盘符号为" & objEvent.TargetInstance.Name & "的U盘被移除",3,"系统提示"
End Select
Loop
On Error Resume Next
Dim objWMI, objSHELL, objEvents, objEvent, Message, Return
Set objWMI = GetObject("Winmgmts:\\.\Root\Cimv2")
Set objSHELL = CreateObject("Wscript.Shell")
Set objEvents = objWMI.ExecNotificationQuery _
("Select * From __InstanceCreationEvent Within 3 " _
& "Where TargetInstance Isa 'Win32_Process'")
Do While True
Set objEvent = objEvents.NextEvent()
Message = "新进程" & objEvent.TargetInstance.Name _
& "被启动,请在10秒内点击确认允许,否则系统将强行关闭!"
Return = objSHELL.Popup(Message,10,"系统警告",0+48)
If Return = -1 Then
Return = objEvent.TargetInstance.Terminate
If return <> 0 Then
Message = "进程" & objEvent.TargetInstance.Name _
& "关闭失败,请尝试手动关闭!"
objSHELL.Popup Message,3,"系统警告",0+48
End If
End If
Loop
VBS脚本编程(10)——编写WMI脚本的更多相关文章
- centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件、目录属性 shell数组简单用法 $( ) 和${ } 和$(( )) 与 sh -n sh -x sh -v 第三十五节课
centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件.目录属性 shell数组简单用法 $( ) 和$ ...
- 【在 Nervos CKB 上做开发】Nervos CKB脚本编程简介[2]:脚本基础
CKB脚本编程简介[2]:脚本基础 原文作者:Xuejie 原文链接:Introduction to CKB Script Programming 2: Script 本文译者:Shooter,Jas ...
- 【Shell脚本编程系列】Shell脚本开发的习惯和规范
1.开头指定脚本解释器 #!/bin/sh或#!/bin/bash 2.开头加版本版权信息 #Date #Author #Mail #Function #Version 提示:可配置vim编辑文件时自 ...
- 从此编写 Bash 脚本不再难【转】
从此编写 Bash 脚本不再难 原创 Linux技术 2017-05-02 14:30 在这篇文章中,我们会介绍如何通过使用 bash-support vim 插件将 Vim 编辑器安装和配置 为一个 ...
- shell脚本编程(一) 变量、条件判断、循环
目录 1. shell脚本编程 2. 运行 Shell 脚本有两种方法 3. 变量 4. 本地变量 5. 环境变量 6. 参数变量 7. 多行注释 8. if条件判断 ...
- 【VI Script】你不知道的脚本编程
前言 近期,小黑在写程序的时候,经常会遇到一些重复性的工作.尤其是在写到QMH(Queued Message Handler)程序时,经常需要创建UI界面上的一些控件引用,并且在程序中捆绑成簇使用. ...
- Vbs 脚本编程简明教程之一
—为什么要使用 Vbs ? 在 Windows 中,学习计算机操作也许很简单,但是很多计算机工作是重复性劳动,例如你每周也许需要对一些计算机文件进行复制.粘贴.改名.删除,也许你每天启动 计算机第一件 ...
- 关于shell脚本编程的10个最佳实践
每一个在UNIX/Linux上工作的程序员可能都擅长shell脚本编程.但大家解决问题的方式却不尽相同,这要取决于对专业知识的掌握程度.使 用命令的种类.看待问题的方式等等.对于那些处在shell脚本 ...
- shell脚本编程的10个最佳实践
摘要:每一个在UNIX/Linux上工作的程序员可能都擅长shell脚本编程.对于那些处在shell脚本编程初级阶段的程序员来说,遵循一些恰当的做法可以帮助你更快.更好的学习这些编程技巧. 每一个在U ...
随机推荐
- springboot 项目中css js 等静态资源无法访问的问题
目录 问题场景 问题分析 问题解决 问题场景 今天在开发一个springboot 项目的时候突然发现 css js 等静态资源竟然都报404找不到,折腾了好久终于把问题都解决了,决定写篇博客,纪录总结 ...
- Django(10)ORM模型介绍
前言 随着项目越来越大,采用写原生SQL的方式在代码中会出现大量的SQL语句,那么问题就出现了: 1.SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长.会出现很多相近的SQL语句. 2. ...
- OCR-Form-Tools项目试玩记录(一)本地部署
OCR-Form-Tools是微软的一个开源代码库,包含微软表单识别和OCR服务相关的多种工具.Github仓库地址 目前,表单标注工具(OCR Form Labeling Tool)是首个发布到本该 ...
- Spring Boot读取自定义外部属性
测试的环境:Spring Boot2 + Maven +lombok 准备需要用到的基础类: public class People { private String name; private St ...
- 【转载】CentOS下查看电脑硬件设备属性命令
CentOS下查看电脑硬件设备属性命令2018年09月13日 17:48:31 乔烨 阅读数 510如何在linux下查看电脑硬件设备属性 # uname -a # 查看内核/操作系统/CPU信息 # ...
- X Sever —— Xorg
X Sever -- Xorg 发表于 2020-03-20 分类于 系统服务 , Xorg 阅读次数:39 阅读次数:48 本文字数: 7k 阅读时长 ≈ 6 分钟 Xorg:基于X11协议的服务 ...
- 云计算OpenStack---维护及错误排查(13)
错误一:删除僵尸卷 在openstack dashboard中正常删除实例,未删除卷,然后重启了服务器,出现BUG,卷被附加给了'NONE',并且无法删除,无法更新. 既然log中已经提示无法删除卷的 ...
- Java 事务的隔离级别
引言 之前关于事务的文章已介绍了事务的概念以及事务的四个属性(ACID),相信你对事务应该有所认识和了解. 本篇文章是关于事务的隔离性,介绍数据库提供的多种隔离级别. 数据库访问的并发性问题 所谓事务 ...
- MyBatis 开启 Log4j 日志调试信息开关
Log4j 是什么 Log4j 是由 Apache 提供的开源日志框架,用于帮助用户处理日志信息. Log4j 能将日志信息分级打印和存储,而且提供了日志不同的存储方式,我们可以将日志发送到控制台,或 ...
- 第9章 case条件语句的应用实践
case语句企业级生产案例 范例9-7:实现通过传参的方式往/etc/openvpn_authfile.conf里添加用户,具体要求如下. 1)命令用法为: USAGE: sh adduser {-a ...